加密狗破解之手动查找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。

相关推荐

发表评论

您的电子邮箱地址不会被公开。

QQ点我咨询