某软件用PEID查是:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
用PEID的插件可以直接找到OIP为00456460,
用OD载入,直接G 00456460,中间有很多异常,大概十多个
到入口点可以看到
00456486 FF15 0444E600 call dword ptr ds:[E64404]
用D 0E64404看一下这里是什么东西,用Dword来查看,输入DD回车.
可以看到这个地址下面全部是Kernel32.dll中的函数.
然后我们对这个地址下写入断点.
重新运行这个程序,(我们前面对0E64404这个地址下了Dword的写入断点)
然后程序会在
780109B3 F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]
这里是拷贝的加密后的IAT,不管他
继续G,会到下面的地方中断,
015461D3 8908 mov dword ptr ds:[eax],ecx
这里其实就是还原IAT的地方了.
向上分析代码,可以看到有个
01546052 FF1548F35401 call dword ptr ds:[154F348] ; MSVCRT._stricmp
这里就是Armadillo对几个函数进行关照的地方.
接着分析前面一点,
01545FF7 83BD 98C4FFFF 00 cmp dword ptr ss:[ebp-3B68],0
01545FFE 74 71 je short 01546071
其实仔细分析这里其实就是在比较是不是把它要特别关照的函数比较完了,
重新运行程序,清除以前所有断点,在下面的那个je ***那里下硬件断点.
或者直接G过去,然后把je ***改成JMP就可以直接跳过这部分
也就是这样下来的IAT还原后没有被Hook的函数了
然后跟踪一圈还原IAT的大循环,
可以发现在下面的时候就已经还原完成了
015462D9 jmp 01545ABE ; 运行到下面一行就还原完成了
015462DE mov eax,dword ptr ss:[ebp-3910]
015462E4 mov dword ptr ss:[ebp+FFFFAFD0],eax
015462EA push dword ptr ss:[ebp+FFFFAFD0]
015462F0 call 0154E17C ; jmp to MSVCRT.operator delete
这里有个完成的标志函数
jmp to MSVCRT.operator delete,前面还有一个向上跳转的JMP.
然后我们直接G到015462DE mov eax,dword ptr ss:[ebp-3910]
还记得我们前面改了一个je ****的吗?还原回来,要不后面的解码会失败
这步完成后就直接G入口点,然后DUMP后用ImportREC重建IAT就可以了
脱壳后的修复问题:脱壳后文件很大,有12M多.
直接用PE重建会不能运行,我们可以这样,
用LPE-DLX打开,看到区段最后有个.rsrc节,
先把节转存出来,记住这个节的起始地址;
我的为00B88000,然后看壳代码的位置:
.text1开始为00A88000,,我们现在把PE中.text1和以后的节全部删除掉
然后算出.text1节前面一个节的文件偏移结束位置,用WinHEX把多余的数据删除
然后用LPE-DLX打开,选择从文件添加一个节,选择刚才.rsrc节保存出来的文件.
然后把资源中相关的指针修正了在做IAT重建就可以了
我最后修复后文件为1.4M左右.呵呵
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)