加密狗破解之手动查找IAT
本文标题为“加密狗破解之手动查找IAT”,大家或许会说这和加密狗破解有啥关系呢?原因就是这个程序是我在破解一个加密狗的时候遇到的,当时记录下来就是这个名字了,所以就没改动了.
下面正式开始~
很多壳到达OEP的时候比较简单,但是修复IAT的时候时候遇到问题,导致脱壳后的程序不能正常运行,本文以一个简单壳为例,介绍手动查找IAT的方法。
PEiD查壳为UPX 0.89.6 – 1.02 / 1.05 – 1.24 (Delphi) stub -> Markus & Laszlo [Overlay]
1、OD载入,隐藏,由于是UPX壳,直接用ESP定律到OEP,从OEP特征来看是Borland C++写的
004014BC /EB 10 jmp short BossKey.004014CE //OEP
004014BE |66:623A bound di,dword ptr ds:[edx]
004014C1 |43 inc ebx
004014C2 |2B2B sub ebp,dword ptr ds:[ebx]
004014C4 |48 dec eax
004014C5 |4F dec edi
004014C6 |4F dec edi
004014C7 |4B dec ebx
004014C8 |90 nop
004014C9 -|E9 98404C00 jmp 008C5566
004014CE \A1 8B404C00 mov eax,dword ptr ds:[4C408B]
2、LoadPE完整Dump
3、Import REC1.6(很多比较老的壳用1.7版本不能正确找到IAT),OEP填入14BC,自动查找,获取输入表
只找到Kernel32.dll的导入函数,连User32的都没有,试着修复Dump文件,出现错误。
4、手动查找IAT,在OEP下方找一个CALL,如下:
004014DE E8 CD1B0C00 call BossKey.004C30B0 ; jmp to kernel32.GetModuleHandleA
5、在CPU窗口中CTRL+G,填入上面的地址4C30B0, 查找,
004C30B0 – FF25 58734D00 jmp dword ptr ds:[4D7358] ; kernel32.GetModuleHandleA
004C30B6 – FF25 5C734D00 jmp dword ptr ds:[4D735C] ; kernel32.GetOEMCP
004C30BC – FF25 60734D00 jmp dword ptr ds:[4D7360] ; kernel32.GetProcAddress
004C30C2 – FF25 64734D00 jmp dword ptr ds:[4D7364] ; kernel32.GetProcessHeap
004C30C8 – FF25 68734D00 jmp dword ptr ds:[4D7368] ; kernel32.GetStartupInfoA
6、往上翻,找到如下位置,并记录起始RVA=4D70F8-400000=D70F8
004C2FAC 832D BC484D00 0>sub dword ptr ds:[4D48BC],1
004C2FB3 C3 retn
004C2FB4 – FF25 F8704D00 jmp dword ptr ds:[4D70F8] ; ADVAPI32.RegCloseKey //这里即是IAT真正起始地址
004C2FBA – FF25 FC704D00 jmp dword ptr ds:[4D70FC] ; ADVAPI32.RegCreateKeyExA
004C2FC0 – FF25 00714D00 jmp dword ptr ds:[4D7100] ; ADVAPI32.RegFlushKey
004C2FC6 – FF25 04714D00 jmp dword ptr ds:[4D7104] ; ADVAPI32.RegOpenKeyExA
004C2FCC – FF25 08714D00 jmp dword ptr ds:[4D7108] ; ADVAPI32.RegQueryValueExA
004C2FD2 – FF25 0C714D00 jmp dword ptr ds:[4D710C] ; ADVAPI32.RegSetValueExA
7、往下翻,找到如下位置,并纪录结束地址RVA=4D7EC4-400000=D7EC4
004C39D6 – FF25 B47E4D00 jmp dword ptr ds:[4D7EB4] ; OLEAUT32.VariantChangeTypeEx
004C39DC – FF25 B87E4D00 jmp dword ptr ds:[4D7EB8] ; OLEAUT32.VariantClear
004C39E2 – FF25 BC7E4D00 jmp dword ptr ds:[4D7EBC] ; OLEAUT32.VariantCopy
004C39E8 – FF25 C07E4D00 jmp dword ptr ds:[4D7EC0] ; OLEAUT32.VariantCopyInd
004C39EE – FF25 C47E4D00 jmp dword ptr ds:[4D7EC4] ; OLEAUT32.VariantInit //IAT结束地址
004C39F4 0000 add byte ptr ds:[eax],al
004C39F6 0000 add byte ptr ds:[eax],al
004C39F8 0000 add byte ptr ds:[eax],al
8、OEP填入14BC,RVA填入000D70F8,大小D7EC4-D70F8=DCC,直接点获取输入表,找到436个输入函数,全部有效,修复Dump,程序可正常运行。
另:大小也可直接输入1000,一般很少有程序输入函数大于1000。