手脱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的程序!
附件中是主程序+试炼程序
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修复一下,程序即可正常运行!
附件中是试炼程序 满详细的
支持你下!! 强大学习啦,那老外的教程我硬没看懂,还是看你的教程清楚些,学习啦! 超哥的教程要细细的看,慢慢的看,你会学到很多东西! 野蛮的牛淫啊~
膜拜 膜拜膜拜…… 看你的教程清楚些,学习啦! 真是超牛~~~~~~~~~~~~~~~~ 极品啊.....哈 怎么没视频 又一篇精华诞生了 学习下