重新加载notepad.upx.exe,在IAT某个地址下内存写断点,这里选择0x4062E4这个地址设内存写断点,先在数据窗口下命令:D 4062E4

然后选择一个地址,点击鼠标右键,下“内存写断点”。

此时只要有数据写入4062E4地址处,OD就会中断,按F9运行OD,会中断这里:
0040E96D > /8A02 mov al, [edx] 0040E96F . |42 inc edx 0040E970 . |8807 mov [edi], al 0040E972 . |47 inc edi 0040E973 . |49 dec ecx 0040E974 .^\75 F7 jnz short 0040E96D
这段还不是处理IAT,按F9继续执行程序,会中断这里:
0040E9E9 > /8A07 mov al, [edi] 0040E9EB . |47 inc edi 0040E9EC . |08C0 or al, al 0040E9EE .^|74 DC je short 0040E9CC 0040E9F0 . |89F9 mov ecx, edi 0040E9F2 . |57 push edi // 函数名字符串 0040E9F3 . |48 dec eax 0040E9F4 . F2:AE repne scas byte ptr es:[edi] 0040E9F6 . |55 push ebp // DLL模块句柄 0040E9F7 . FF96 A4EC0000 call [esi+ECA4] ; kernel32.GetProcAddress 0040E9FD . |09C0 or eax, eax 0040E9FF . |74 07 je short 0040EA08 0040EA01 . |8903 mov [ebx], eax // EBX指向IAT,将取得的API地址填充进IAT 0040EA03 . |83C3 04 add ebx, 4 // 指向下一个地址 0040EA06 .^\EB E1 jmp short 0040E9E9 0040EA08 > FF96 A8EC0000 call [esi+ECA8]
上面这段就是UPX外壳填充IAT的全过程,感兴趣的,动态跟踪一下就明白了。这里用GetProcAddress函数获得函数地址:
FARPROC GetProcAddress( HMODULE hModule, // DLL模块句柄 LPCSTR lpProcName // 函数名 );上一页 1 2 3 |