我一直在用汇编语言搞乱PE文件结构。 我很确定我已经正确地进入了导入部分。 我使用这个作为参考,其中每个框等于4个字节:
+-------------------------+-------------------------+ | RVA to a list of | DATE/TIME | | pointer to APIs names | | IMPORT DATA DIRECTORY +-------------------------+-------------------------+ #1 | .DLL address (unused) | RVA to .DLL name | +-------------------------+-------------------------+ |RVA to API address list | +-------------------------+
OllyDbg的。 注意eax在右边的值(00402048),然后查看突出显示的调用指令的值跳转到(00402000)。
我尝试从ExitProcess (RVA到API地址列表)中调用第一个第一个函数,但是当我尝试向该地址发出调用时,它导致我的程序崩溃。 当我使用Ollydbg进行debugging时,发现调用ExitProcess时的地址与我在列表中find的地址不同。 在Ollydbg中,当调用ExitProcess指向<JMP。&KERNEL32.ExitProcess>时,find的地址指向<&KERNEL32.ExitProcess>。 我已经读过某种关于某种jmp存根的地方。 这是什么? 我应该如何调用“RVA到API地址列表”中的函数?
我知道这可能是混乱。 如果你需要更多的澄清,让我知道。
这里是代码:
extern printf extern ExitProcess global _start section .code _start: mov eax, [imagebase] mov esi, eax add eax, 3ch mov eax, DWORD [eax] add eax, esi; PE header pointer in eax add eax, 128; 24 for PE Optional Header offset and then 104 for import RVA mov ebx, DWORD [eax] add ebx, DWORD [imagebase]; ebx now has import section offset mov eax, DWORD [ebx+16] add eax, DWORD [imagebase]; has array offset mov ecx, ExitProcess push 0 call ecx ;call eax ;jmp ecx ;call ExitProcess imagebase: db 0,0,64,0; 0x00400000; This is right
似乎我已经找到数组,但我从来没有检索到该地址的值。 所以我试图调用该函数在数组的地址,而不是数组的第一个元素。
extern printf extern ExitProcess global _start section .code _start: mov eax, [imagebase] mov esi, eax add eax, 3ch mov eax, DWORD [eax] add eax, esi; PE header pointer in eax add eax, 128; 24 for PE Optional Header offset and then 104 for import RVA mov ebx, DWORD [eax] add ebx, DWORD [imagebase]; ebx now has import section offset mov eax, DWORD [ebx+16] add eax, DWORD [imagebase]; has array offset mov eax, [eax];This is what I needed to do push 0 call eax imagebase: db 0,0,64,0;