|
挂钩Windows API(8) ); break; } pThunk++; }
调用Sleep(1000)的结果如例子所示:
00407BD8: 68E8030000 push 0000003E8h 00407BDD: E812FAFFFF call Sleep
Sleep: ;这是跳转到IAT里的地址 004075F4: FF25BCA14000 jmp dword ptr [00040A1BCh]
原始表: 0040A1BC: 79 67 E8 77 00 00 00 00 新表: 0040A1BC: 78 56 34 12 00 00 00 00
所以最后会跳转到0x12345678。 3.2.2 改写入口点挂钩本进程 改写函数入口点开始的一些字节这种方法相当简单。就象改变IAT里的地址一样,我们也要先修改页面属性。在这里对我们想要挂钩的函数是一开始的5个字节。为了之后的使用我们用动态分配MEMORY_BASIC_INFORMATION结构。函数的起始地址也是用GetProcAddress来获得。我们在这个地址里插入指向我们代码的跳转指令。接下来程序调用Sleep(5000)(所以它会等待5秒钟),然后Sleep函数被挂钩并重定向到new_sleep,最后它再次调用Sleep(5000)。因为新的函数new_sleep什么都不做并直接返回,所以整个程序只需要5秒钟而不是10秒种。
.386p .model flat, stdcall
includelib lib\kernel32.lib Sleep PROTO :DWORD GetModuleHandleA PROTO :DWORD GetProcAddress PROTO :DWORD,:DWORD VirtualQuery PROTO :DWORD,:DWORD,:DWORD VirtualProtect PROTO :DWORD,:DWORD,:DWORD,:DWORD VirtualAlloc PROTO :DWORD,:DWORD,:DWORD,:DWORD VirtualFree PROTO :DWORD,:DWORD,:DWORD
|