aheadlib dll劫持代码优化
本帖最后由 cndml 于 2023-4-10 18:55 编辑近来玩了一下x64的dll劫持破解,使用aheadlib导出了dll劫持的模版,编译成功后,运行总是出错,经过跟踪调试,发现是aheadlib劫持函数中,三个汇编外部函数的问题,导致堆栈不平衡,原作者的思路是通过外部三个函数,先保存可能得调用参数用到的四个寄存器,rcx,rdx,r8,r9,然后取得原函数调用地址,最后跳转执行,并返回调用程序。dll劫持考虑的就是参数保存,堆栈平衡以及防止堆栈破坏,原来的导出函数是这样的:
// 导出函数
ALCDECL AheadLib_AddIPAddress(void)
{
prevFunc();
setFunc(&pfnAddIPAddress);
endFunc();
}
个人感觉有点麻烦,由于vs2010以后不支持内联汇编,直接跳转实现不了,肯定要通过汇编的外部函数实现,越简单越好,基于这个思路,原代码修改为这样:
// 导出函数
ALCDECL AheadLib_AddIPAddress(void)
{
INT64 p=(INT64)pfnAddIPAddress;
retFunc();
}
导出函数中,定义一个临时变量,在堆栈中存储原函数地址,外部汇编函数,通过堆栈平衡,跳过去执行,并正确返回到原调用地址。
retFunc()函数只有两行代码:
add rsp,028h
ret 010h
以上代码通过反汇编代码结合x64的fastcall调用规则,在vs2010编译通过,高版本的编译器没有测试,欢迎有兴趣的测试指正。 本帖最后由 爱飞的猫 于 2023-4-10 22:56 编辑
如果只是穿透(不对函数做处理),可以尝试在加载后把导入表指向的地址改了(IAT Hook),或在 DLL 入口的时候动态 patch 函数(`VirtualProtect` 允许内存区域读写然后直接改);
如果地址距离过大或不方便计算相对距离,就 push / ret:
```asm
push ADDR_LO_32 ; 低 32 位
mov dword, ADDR_HI_32 ; 高 32 位
ret
; | 68 78563412 | push 12345678 |
; | C74424 04 22221111 | mov dword , 11112222 |
; | C3 | ret |
```
如果地址距离没那么大,直接 jmp 过去;
```
jmp 0x12345678
```
如果同时需要调用原来的函数,调整两边函数签名一致,然后调用就好;举个例子:
```c
// 这里只是举个例子,gdi32.dll 不一定能这样劫持加载
typedef HGDIOBJ(WINAPI* tGetStockObject)(_In_ int i);
tGetStockObject g_GetStockObjectOrig;
HANDLE g_replacementSystemFont;
// DLL 入口点初始化
g_GetStockObjectOrig = GetProcAddress(hGDI32, "GetStockObject");
// 导出
HGDIOBJ WINAPI GetStockObject(_In_ int i) {
if (i == SYSTEM_FONT) {
return g_replacementSystemFont; // 返回我自己的字体句柄
}
return g_GetStockObjectOrig(i); // 回退到系统自己的实现
}
``` 感谢分享 我怎么感觉你这个是用了老版本的aheadlib 你用的是老版本吧 这里 有份新旧版本源码 楼主有什么好的想法,可以改至
https://yyjpcx.lanzoub.com/iaLS20snefde
下面这个是xjun的开源的
https://github.com/strivexjun/AheadLib-x86-x64/releases/tag/1.2 谢谢分享
你好 我想起请教一下 炒股软件具体怎么破解 楼主您好!请问你之前研究过VB的代码反编译吗?付费咨询,谢谢! 再不我有一个net注册文件机制和你那个有点像想请教你
页:
[1]
2