更新ing
inline hook
核心思路就是修改函数里的代码
hook库函数思路
- 调用GetModuleHandle获取模块基址
- 调用GetProcAddress获取要hook的库函数基址
- 调用VirtualProtect修改内存属性
- 计算重定位跳转地址并jmp
- 计算跳转回来的地址
练习
x86
自己写一个程序,向文件中写入字符串:
1 |
|
函数绕过
编写一个DLL,将WriteFile函数hook掉,让程序运行结束后t.txt中没有内容
1 |
|
使用DLL注入工具注入DLL,运行后发现t.txt中并未写入字符串,且程序正常退出(呃呃呃呃呃呃呃试了好久x),测试成功。
注意一下jmp的时候应该填地址还是偏移。
此处记录一下硬编码(被坑N年系列):
1 | 0xFF15 CALL 后面的四字节是存放地址的地址 |
更改参数
根据想要更改的参数所在位置(栈或寄存器上)写汇编就彳亍
这里我更改写入的字符串,这个参数在栈上。编写以下代码:
1 |
|
因为jump指令覆盖了两条指令,而这两条指令的长度为7,所以在我自定义的函数中先执行被更改的指令,然后更改我需要的数据(栈上的数据),最后再跳转到这两条指令之后的指令正常执行。
注意直接写mov dword ptr[eax], s
会报错,需要一个寄存器中转。
哦,所以你还不滚去学汇编语法?
😭😭😭
x64
x64无法编译内嵌汇编代码 芥末🌶️🐔 所以只能手动把汇编硬编码
。。。找不到64位DLL注入的工具,就8写DLL了😶直接开勾(
1 |
|
没有static int (WINAPI* OldWriteFile)(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) = WriteFile;
这一句,直接用VirtualProtect改权限的话也是不行的,估计是因为DLL的页还没有换进去所以发生页错误了……
还有我刚开始尝试直接把汇编硬编码写进数据,然后用VirtualProtect赋予执行权限,但不知道为什么不行。。。暂且不知道是什么原因。。。总而言之就是笨人的所有尝试均以失败告终
于是我屈服了,只能直接硬改DLL,然后在外部用函数调用,改参数重新执行 (没有x86那样自己写汇编想改什么就改什么的感觉真不爽
简而言之先把库函数开头改成跳转,然后在跳转函数里把库函数开头改回来,再在跳转函数里重新调用库函数(这时候就可以自己随便定义参数了)
参考链接:
https://www.cnblogs.com/LyShark/p/11692436.html
https://www.cnblogs.com/ibinary/p/11334793.html
关于本文
本文作者 云之君, 许可由 CC BY-NC 4.0.