好友
阅读权限150
听众
最后登录1970-1-1
|
ximo
发表于 2008-9-12 14:08
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,eax00464E208945 D4mov dword ptr ss:[ebp-2C],eax00464E230F84 83010000je 00464FAC00464E296A 40push 4000464E2B68 00100000push 100000464E30FF75 D0push dword ptr ss:[ebp-30]00464E336A 00push 000464E35FFD7 call edi00464E3785C0 test eax,eax00464E398945 C8mov dword ptr ss:[ebp-38],eax00464E3C0F84 6A010000je 00464FAC00464E426A 40push 4000464E4468 00100000push 100000464E4953 push ebx00464E4A6A 00push 000464E4CFFD7 call edi00464E4E33DB xor ebx,ebx00464E503BC3 cmp eax,ebx00464E528945 E0mov dword ptr ss:[ebp-20],eax00464E550F84 51010000je 00464FAC00464E5B68 0C354600push 46350C ; ASCII "kernel32.dll"00464E60FF15 E0104600call dword ptr ds:[4610E0]; kernel32.LoadLibraryA00464E6668 9C364600push 46369C ; ASCII "GetProcAddress"00464E6B50 push eax00464E6CFF15 DC104600call dword ptr ds:[4610DC]; kernel32.GetProcAddress00464E728945 ECmov dword ptr ss:[ebp-14],eax00464E758B46 04mov eax,dword ptr ds:[esi+4]00464E788B08 mov ecx,dword ptr ds:[eax]00464E7A895D E4mov dword ptr ss:[ebp-1C],ebx00464E7D895D CCmov dword ptr ss:[ebp-34],ebx00464E80895D D8mov dword ptr ss:[ebp-28],ebx00464E838948 04mov dword ptr ds:[eax+4],ecx00464E868B46 04mov eax,dword ptr ds:[esi+4]00464E898B40 04mov eax,dword ptr ds:[eax+4]00464E8C8B38 mov edi,dword ptr ds:[eax]00464E8E037D 08add edi,dword ptr ss:[ebp+8]00464E918D4D FClea ecx,dword ptr ss:[ebp-4]00464E9451 push ecx00464E95E8 81FCFFFFcall 00464B1B00464E9A83F8 FFcmp eax,-100464E9D0F84 09010000je 00464FAC00464EA3FF75 FCpush dword ptr ss:[ebp-4]00464EA6FF15 E0104600call dword ptr ds:[4610E0]; kernel32.LoadLibraryA00464EAC3BC3 cmp eax,ebx00464EAE8945 F8mov dword ptr ss:[ebp-8],eax00464EB10F84 F5000000je 00464FAC00464EB78B46 04mov eax,dword ptr ds:[esi+4]00464EBA8B40 04mov eax,dword ptr ds:[eax+4]00464EBD8B40 18mov eax,dword ptr ds:[eax+18]00464EC08B08 mov ecx,dword ptr ds:[eax]00464EC28948 04mov dword ptr ds:[eax+4],ecx00464EC58B46 04mov eax,dword ptr ds:[esi+4]00464EC88B40 04mov eax,dword ptr ds:[eax+4]00464ECB8B40 18mov eax,dword ptr ds:[eax+18]00464ECE8B40 04mov eax,dword ptr ds:[eax+4]00464ED18B40 04mov eax,dword ptr ds:[eax+4]00464ED43BC3 cmp eax,ebx00464ED675 04jnz short 00464EDC00464ED833C0 xor eax,eax00464EDAEB 0Bjmp short 00464EE700464EDC25 FFFFFF7Fand eax,7FFFFFFF00464EE18945 F0mov dword ptr ss:[ebp-10],eax00464EE433C0 xor eax,eax00464EE640 inc eax00464EE72BC3 sub eax,ebx00464EE974 13je short 00464EFE00464EEB48 dec eax00464EEC75 76jnz short 00464F6400464EEEFF75 F0push dword ptr ss:[ebp-10]00464EF1FF75 F8push dword ptr ss:[ebp-8]00464EF4FF15 DC104600call dword ptr ds:[4610DC]; kernel32.GetProcAddress00464EFA8907 mov dword ptr ds:[edi],eax00464EFCEB 66jmp short 00464F6400464EFEFF75 FCpush dword ptr ss:[ebp-4]00464F01E8 A1FDFFFFcall 00464CA7 ; 就是这里!跟随进去吧!00464F0685C0 test eax,eax00464F088B46 04mov eax,dword ptr ds:[esi+4]00464F0B8B40 04mov eax,dword ptr ds:[eax+4]00464F0E74 28je short 00464F3800464F108D4D E0lea ecx,dword ptr ss:[ebp-20]00464F1351 push ecx00464F148D4D C8lea ecx,dword ptr ss:[ebp-38]00464F1751 push ecx00464F188D4D D4lea ecx,dword ptr ss:[ebp-2C]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的程序!
附件中是主程序+试炼程序 |
|