OD载入程序后
在Memory中给User32.dll的Code断下断点,执行!
会停留在主程序段的某个地方
继续F7跟进,会遇到下列关键代码
0048AAC5 > /3B4A 18 cmp ecx, dword ptr [edx+18]
0048ECFA . 01C3 add ebx, eax
0048ECFC . 83EC FC sub esp, -??
0048A19E > /A6 cmps byte ptr [esi], byte ptr es:[edi]
004FEFC8 . 8D6424 08 lea esp, dword ptr [esp+8]
//此处可能造成N轮循环,请F7单步跟踪,发现以下代码
0048A52D . 0FB70C4F movzx ecx, word ptr [edi+ecx*2]
0048A540 . 8B7A 1C mov edi, dword ptr [edx+1C]
004FB847 > \8D6424 28 lea esp, dword ptr [esp+28]
0048E249 . 01F8 add eax, edi //此处执行后,获得API地址
0048E251 . 39D0 cmp eax, edx
F7继续跟,会来到一个调用函数的地方(可能是多层调用,忽略无用指令)
该函数内部,有类似于下面列出的,有Push,又有大回栈retn返回的结构
0048ABD7 . FF3424 push dword ptr [esp]
0048ABDA . 68 203477FA push FA773420
0048ABDF . FF7424 04 push dword ptr [esp+4]
0048ABE3 . FF7424 04 push dword ptr [esp+4]
0048ABE7 . FF7424 40 push dword ptr [esp+40]
0048ABEB . C2 4C00 retn 4C
并且此返回的地址处指令类似于以下的形式
-------->>>0048E195 . 68 CA409C24 push 249C40CA
0048E19A . E8 CE1F0700 call 0050016D
设置Trace 条件,在主程序段(非 vmp段)运行时停下,开始Trace into
-------->>>00401EB9 . E8 C6030000 call 00402284 OEP
继续F7跟踪,查找
mov eax, ??????(主程序段地址)
0048352A |. 8B80 86280800 mov eax, dword ptr [eax+????]
高度注意某一个Call指令
0048353A |. E8 BD030000 call 004838FC
-------->>>004838FC $ /E9 A40E0000 jmp 004847A5
进入后会对EAX进行运算,得到API地址
not eax 或者 neg eax 这样的指令
00482F7E . 2D 9196435A sub eax, 5A439691
等执行到EAX指向某API时,IAT修复跟踪就全部完成了。
重头开始,跑IAT fix
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课