ximo 发表于 2008-9-12 14:08

手脱NTkrnl Protector0.15

NTkrnl Protector0.15脱壳修复一(非Delphi程序)

NTkrnl Protector0.15其实也是个老壳,07年的吧(因为08年3月底才开始接触破解,因此以前的东西和历史都不太了解) .无意中看到这个壳,就拿来试炼下,呵呵,幸好是个软柿子,让我这种菜鸟也搞定了,有点小兴奋.鉴于网上几乎没有这个壳的教程,故写个文章给大家分享下,也算是记录下自己的学习笔记吧.废话有点多,正式开始吧!

今天来试炼下全保护(其实也不能叫全保护,因为能下到的是demo,还有很多选项加不了,总之,是我所能加的全保护)


由于Delphi的程序在修复上有点小麻烦,因此首先来看下非D程序的脱壳和修复方法,D的程序在下一次中再详细讲修复过程,试炼程序是98记事本,众所周知是个C++的程序.好,开工!

一、Anti的处理

其实这个Anti处理很简单,简单的替换下代码,强行跳过Anti.

OD载入后停在了下面的位置



晕,看入口,还以为是ASProtect的。不管他

忽略所有的异常,隐藏下OD,F9运行。


就停在了这里。如果继续F9或者F8下去的话,OD就会提示"OD无法调试异常",因此就没办法继续调试下去了.

有个简单的方法,把停在位置的retn改为int3即可

让其强行执行CC异常,也就是int3异常,改完后,F8走,就来到了下面的地方.



就这样,Anti就很容易的就通过了.下面的任务就是处理输入表了

二、找magic jump,跳过IAT加密

在刚才的位置,向下看数据窗口,找有GetProcAddress函数的这行,然后下硬件访问断点



接着F9,来到下面的位置,然后就取消硬件断点



接着,下断点:bp VirtualAlloc,SHIFT+F9运行,中断后取消断点,ALT+F9返回

返回后,往下找第二次出现"kernel32.GetProcAddress"注释的CALL处,接着,在下面的CALL处,Enter跟随进去


00464E1E85C0 test eax,eax
00464E208945 D4mov dword ptr ss:,eax
00464E230F84 83010000je 00464FAC
00464E296A 40push 40
00464E2B68 00100000push 1000
00464E30FF75 D0push dword ptr ss:
00464E336A 00push 0
00464E35FFD7 call edi
00464E3785C0 test eax,eax
00464E398945 C8mov dword ptr ss:,eax
00464E3C0F84 6A010000je 00464FAC
00464E426A 40push 40
00464E4468 00100000push 1000
00464E4953 push ebx
00464E4A6A 00push 0
00464E4CFFD7 call edi
00464E4E33DB xor ebx,ebx
00464E503BC3 cmp eax,ebx
00464E528945 E0mov dword ptr ss:,eax
00464E550F84 51010000je 00464FAC
00464E5B68 0C354600push 46350C ; ASCII "kernel32.dll"
00464E60FF15 E0104600call dword ptr ds:; kernel32.LoadLibraryA
00464E6668 9C364600push 46369C ; ASCII "GetProcAddress"
00464E6B50 push eax
00464E6CFF15 DC104600call dword ptr ds:; kernel32.GetProcAddress
00464E728945 ECmov dword ptr ss:,eax
00464E758B46 04mov eax,dword ptr ds:
00464E788B08 mov ecx,dword ptr ds:
00464E7A895D E4mov dword ptr ss:,ebx
00464E7D895D CCmov dword ptr ss:,ebx
00464E80895D D8mov dword ptr ss:,ebx
00464E838948 04mov dword ptr ds:,ecx
00464E868B46 04mov eax,dword ptr ds:
00464E898B40 04mov eax,dword ptr ds:
00464E8C8B38 mov edi,dword ptr ds:
00464E8E037D 08add edi,dword ptr ss:
00464E918D4D FClea ecx,dword ptr ss:
00464E9451 push ecx
00464E95E8 81FCFFFFcall 00464B1B
00464E9A83F8 FFcmp eax,-1
00464E9D0F84 09010000je 00464FAC
00464EA3FF75 FCpush dword ptr ss:
00464EA6FF15 E0104600call dword ptr ds:; kernel32.LoadLibraryA
00464EAC3BC3 cmp eax,ebx
00464EAE8945 F8mov dword ptr ss:,eax
00464EB10F84 F5000000je 00464FAC
00464EB78B46 04mov eax,dword ptr ds:
00464EBA8B40 04mov eax,dword ptr ds:
00464EBD8B40 18mov eax,dword ptr ds:
00464EC08B08 mov ecx,dword ptr ds:
00464EC28948 04mov dword ptr ds:,ecx
00464EC58B46 04mov eax,dword ptr ds:
00464EC88B40 04mov eax,dword ptr ds:
00464ECB8B40 18mov eax,dword ptr ds:
00464ECE8B40 04mov eax,dword ptr ds:
00464ED18B40 04mov eax,dword ptr ds:
00464ED43BC3 cmp eax,ebx
00464ED675 04jnz short 00464EDC
00464ED833C0 xor eax,eax
00464EDAEB 0Bjmp short 00464EE7
00464EDC25 FFFFFF7Fand eax,7FFFFFFF
00464EE18945 F0mov dword ptr ss:,eax
00464EE433C0 xor eax,eax
00464EE640 inc eax
00464EE72BC3 sub eax,ebx
00464EE974 13je short 00464EFE
00464EEB48 dec eax
00464EEC75 76jnz short 00464F64
00464EEEFF75 F0push dword ptr ss:
00464EF1FF75 F8push dword ptr ss:
00464EF4FF15 DC104600call dword ptr ds:; kernel32.GetProcAddress
00464EFA8907 mov dword ptr ds:,eax
00464EFCEB 66jmp short 00464F64
00464EFEFF75 FCpush dword ptr ss:
00464F01E8 A1FDFFFFcall 00464CA7 ; 就是这里!跟随进去吧!
00464F0685C0 test eax,eax
00464F088B46 04mov eax,dword ptr ds:
00464F0B8B40 04mov eax,dword ptr ds:
00464F0E74 28je short 00464F38
00464F108D4D E0lea ecx,dword ptr ss:
00464F1351 push ecx
00464F148D4D C8lea ecx,dword ptr ss:
00464F1751 push ecx
00464F188D4D D4lea ecx,dword ptr ss:
00464F1B51 push ecx



跟随进去后,第一个看到的je就是magic jump!改JMP吧!



这样,就跳过了IAT的加密

三、直达OEP!

该完magic jump,下面的过程就简单了,直达OEP!

其实,你可以F8跟下去,不一会就能找到OEP了.

或者,直接找特征码

CTRL+B,搜索61FFE0,取消"整个段块"前的勾

找到下面的位置



在jmp eax处F2,SHIFT+F9,取消断点

再F8一次,就来到OEP了!



四、dump+修复

来到OEP后就先用Lord PE给dump下来吧

接着打开I-REC,看看IAT



很好,发现全部有效。

这时候别急着给修复,但也别关闭I-REC,因为一会还要修复呢。

其实,现在修复的话,会发现,修复后程序是无法运行的。很奇怪吧,把IAT的加密给避开了,OEP也找对了,但为什么还运行不了呢?
很明显,这个壳处理了资源表和TLS表!因为非Delphi程序不需处理TLS表,因此,相对来说简单很多。

ALT+M,来到内存镜像处,然后在PE Header处,也就是00400000处,双击。来到数据。

下面就往下找,找资源表吧



下面的任务就是修复了,很简单了。

用Lord PE的PE编辑器打开刚dump下来的程序,然后选择目录


然后把在OD中看见的资源信息填到PE编辑器里的"资源"一栏上吧

修改后,点保存.

接着,就用I-REC来修复下修改后的dump.exe吧.

哈,能正常运行了吧~

脱壳就到此结束了.下一次将具体讲如何修复Delphi的程序!

附件中是主程序+试炼程序

ximo 发表于 2008-9-12 14:09

NTkrnl Protector0.15脱壳修复二(Delphi程序的修复)

NTkrnl Protector0.15脱壳修复二(Delphi程序的修复)

前面已经讲过非D程序的脱壳和修复方法,本次主要介绍Delphi程序的修复方法.
由于Delphi程序有TLS表,因此,修复起来相对复杂的多.感谢小生提供的动画,参考此动画,顺利完成D程序的修复!
前面的处理过程完全一样,只是加了个TLS表的修复过程.
按照前面的操作,处理完资源信息后,下面,开始处理TLS表!

仍然在PE编辑器里面,打开区段.然后添加一个区段.



添加完后,编辑一下区段信息



说明下:

区段名:随意填写,无要求
虚拟大小:填1000
物理大小:填200
其他的都不要动他就是.填完后保存一下

既然增加了一个区段,就用16进制编辑工具来增加200字节的空间,来引导新加区段的信息.

如图:


从112DEO(112FE0-200=112DE0)处开始选,到最后,就是200个字节了
然后,在最后粘贴上即可!
不过,记下开始的地址:00113000,下面要用到!

继续打开PE编辑器,打开目录,在TLS表处填相关的信息:

RVA处的值就是刚才所要记下的值得:00113000
SIZE都填18即可!



填完后写点下保存,然后在点旁边的那个按纽(L,H旁边那个有2点的那个按纽)
出现TLS表后,接着填下信息



说明:

第一个值=00400000+00113000+100=00513100
第二个值=第一个值+100=00513200
第三个值=第二个值+100=00513300
第四个值=第三个值+100=00513400

填完后点保存.

到此,所有的工作都已经结束,下面的任务就是用I-REC修复一下,程序即可正常运行!

附件中是试炼程序

qq513701092 发表于 2008-9-12 15:09

满详细的
支持你下!!

小生我怕怕 发表于 2008-9-12 15:58

强大学习啦,那老外的教程我硬没看懂,还是看你的教程清楚些,学习啦!

Hmily 发表于 2008-9-12 21:52

超哥的教程要细细的看,慢慢的看,你会学到很多东西!

mycsy 发表于 2008-9-12 23:29

野蛮的牛淫啊~

膜拜 膜拜膜拜……

hxx1994 发表于 2008-9-13 01:45

看你的教程清楚些,学习啦!

Tale 发表于 2008-9-13 05:19

真是超牛~~~~~~~~~~~~~~~~

caskywz 发表于 2008-9-13 17:57

极品啊.....哈 怎么没视频

wgz001 发表于 2008-9-15 06:36

又一篇精华诞生了 学习下
页: [1] 2 3
查看完整版本: 手脱NTkrnl Protector0.15