-
-
[原创]手脱穿山甲1.xx-2.xx by Goblin Locksmith
-
发表于:
2012-6-20 15:51
5966
-
[原创]手脱穿山甲1.xx-2.xx by Goblin Locksmith
手脱穿山甲1.xx-2.xx by Goblin Locksmith
前言:大家好,我是“地精锁匠”,是个破解菜鸟。昨天看了黑鹰破解教程第15课的视频(教程是用断GetModuleHandleA和GetCurrentThreadId的方法来破解的),对其中手脱穿山甲1.xx-2.xx壳的办法非常不理解,决定根据自己的理解来手脱此壳。经过1天的努力,目标程序终于告破。在此共享出来帮助破解新手理解脱此壳的原理。
目标程序:黑鹰破解教程第15课的桌面天气秀
目标马甲:穿山甲1.xx-2.xx
脱壳思路:从无效指针指向的内存地址入手,对这些地址上硬件写入断点。断下后,分析代码,通过单步跟踪得出某个函数是加密IAT的函数,然后从该函数中修改Magic Jump,然后一步到OEP。
操作步骤:
1、根据2次内存断点法,直接到达OEP。忽略所有异常,打开内存镜像,在程序的.rsrc节按F2下断点,Shift+F9运行。断下来后,在程序的CODE节按F2下段,Shift+F9运行,直接到达OEP:004D12D4。
2、打开ImportREC_fix,选中调试的进程,输入OEP,获取输入表,如下图。从输入表中的数据可以推出该程序是部分加密IAT,RVA:000DB190这项就是加密的IAT项目。所以从这个加密项入手开始调查Magic Jump。这里可以看出IAT的起始RVA是00DB168。
3、重载程序,在左下角的数据窗口按Ctrl+G输入004DB190,按回车。Shitf+F9两次,这时断在00C2A96F处(记得删除硬件断点)。单步走,发现从00C2A6FD到00C2A97E的地址是在为程序的IAT进行修改。分析如下: [EBP-186C]里存储的是本次要取得入口地址的API函数的名称字符串。[EBP-136C]里存储的是下一次要取得入口地址的API函数的名称字符串。地址00C2A8FB---00C2A902这4条指令是利用本次要取得API函数入口地址的名称字符串指针计算出下一次要取得API函数入口地址的名称字符串指针。地址00C2A915处的函数是类似GetProcAddress的函数(注意看图片的堆栈你就懂了),它取得API函数入口地址或者是加密后地址。得到函数的入口地址或加密地址后,按顺序存在从IAT(地址:004DB168)上。综上所述,Magic Jump肯定在00C2A915这个函数里面。此时,对00C2A903下硬件执行断点,关闭OD程序。
4、打开OD(第三步设置的硬件断点依然有效的),加载目标程序(此OD代号XX)。再打开个OD,再次加载目标程序(此OD代号YY)。双开OD是为了对比,以便找出Magic Jump。对XX按Shift+F9断在00C2A903,此时看到eax寄存器显示LeaveCriticalSection。对YY按Shift+F9断在00C2A903,再重复按Shift+F9键9次,可以看到eax寄存器显示GetVersion,单步走到地址00C2A96D处,看说明可以得知本次操作取得的入口地址写入了004DB18C中,那说明下一次就是写入004DB190了。所以再按Shift+F9,此时eax寄存器显示GetCurrentThreadId。
5、XX和YY同时单步走(记得要F7进00C2A915处的函数哦!),一直跟踪,直到地址00C15C16处,XX在这里没有实现跳转,而YY在这里实现了跳转。所以可以肯定这里就是Magic Jump。
6、关闭XX。把YY地址00C15C16处的代码用两个NOP来代替。记得要删除硬件断点哦!
7、在反汇编窗口按Ctrl+G,输入第一步找到的OEP:004D12D4,按回车。对004D12D4下硬件执行断点,按Shift+F9,程序直接断在这里了。
8、打开LordPE对程序进行脱壳,产生Unpack.exe
9、打开ImportREC_fix,输入OEP,获取输入表,你会惊奇的发现,和第二步获取的输入表相比,无效指针只有16个了(这16个指针确实是无效指针)。直接剪切它们,然后转存修复Unpack.exe。
10、运行程序,OHYE,大功告成。
最后顺便请问下,我想插入图片,但是我看图片都是要链接的。。就不能从本地上传啊?
附件是两部分组成的,需要减压出来放在同一个文件夹才能使用哦!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!