cndml 发表于 2023-4-10 18:47

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:53

本帖最后由 爱飞的猫 于 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); // 回退到系统自己的实现
}
```

529th丶Altman 发表于 2023-4-10 19:21

感谢分享

陨落星辰 发表于 2023-4-10 20:16

我怎么感觉你这个是用了老版本的aheadlib

小宇殿下 发表于 2023-4-11 00:10

你用的是老版本吧

yyjpcx 发表于 2023-4-11 08:54

这里 有份新旧版本源码 楼主有什么好的想法,可以改至

https://yyjpcx.lanzoub.com/iaLS20snefde
下面这个是xjun的开源的
https://github.com/strivexjun/AheadLib-x86-x64/releases/tag/1.2

hhh2009 发表于 2023-4-28 23:00

谢谢分享

xiaoxiao97 发表于 2023-6-10 16:20

你好 我想起请教一下 炒股软件具体怎么破解

jerryhulve 发表于 2023-7-1 16:11

楼主您好!请问你之前研究过VB的代码反编译吗?付费咨询,谢谢!

houyuyu878 发表于 2023-9-15 19:39

再不我有一个net注册文件机制和你那个有点像想请教你
页: [1] 2
查看完整版本: aheadlib dll劫持代码优化