吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3891|回复: 12
收起左侧

[C&C++ 原创] aheadlib dll劫持代码优化

  [复制链接]
cndml 发表于 2023-4-10 18:47
本帖最后由 cndml 于 2023-4-10 18:55 编辑

    近来玩了一下x64的dll劫持破解,使用aheadlib导出了dll劫持的模版,编译成功后,运行总是出错,经过跟踪调试,发现是aheadlib劫持函数中,三个汇编外部函数的问题,导致堆栈不平衡,原作者的思路是通过外部三个函数,先保存可能得调用参数用到的四个寄存器,rcx,rdx,r8,r9,然后取得原函数调用地址,最后跳转执行,并返回调用程序。dll劫持考虑的就是参数保存,堆栈平衡以及防止堆栈破坏,原来的导出函数是这样的:
[C++] 纯文本查看 复制代码
// 导出函数
ALCDECL AheadLib_AddIPAddress(void)
{
        prevFunc();
        setFunc(&pfnAddIPAddress);
        endFunc();
}

个人感觉有点麻烦,由于vs2010以后不支持内联汇编,直接跳转实现不了,肯定要通过汇编的外部函数实现,越简单越好,基于这个思路,原代码修改为这样:
[C++] 纯文本查看 复制代码
// 导出函数
ALCDECL AheadLib_AddIPAddress(void)
{
        INT64 p=(INT64)pfnAddIPAddress;
        retFunc();

}

导出函数中,定义一个临时变量,在堆栈中存储原函数地址,外部汇编函数,通过堆栈平衡,跳过去执行,并正确返回到原调用地址。
retFunc()函数只有两行代码:
[Asm] 纯文本查看 复制代码
add rsp,028h
ret 010h

以上代码通过反汇编代码结合x64的fastcall调用规则,在vs2010编译通过,高版本的编译器没有测试,欢迎有兴趣的测试指正。

免费评分

参与人数 4吾爱币 +5 热心值 +3 收起 理由
hrh123 + 1 + 1 用心讨论,共获提升!
zhubing0622 + 1 热心回复!
朱朱你堕落了 + 1 最好编译下源码,弄个完美的生成工具出来。
610100 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱飞的猫 发表于 2023-4-10 22:53
本帖最后由 爱飞的猫 于 2023-4-10 22:56 编辑

如果只是穿透(不对函数做处理),可以尝试在加载后把导入表指向的地址改了(IAT Hook),或在 DLL 入口的时候动态 patch 函数(VirtualProtect 允许内存区域读写然后直接改);

如果地址距离过大或不方便计算相对距离,就 push / ret:

push ADDR_LO_32 ; 低 32 位
mov dword[rsp+4], ADDR_HI_32 ; 高 32 位
ret

; | 68 78563412        | push 12345678                |
; | C74424 04 22221111 | mov dword [rsp+4] , 11112222 |
; | C3                 | ret                          |

如果地址距离没那么大,直接 jmp 过去;

jmp 0x12345678

如果同时需要调用原来的函数,调整两边函数签名一致,然后调用就好;举个例子:

// 这里只是举个例子,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); // 回退到系统自己的实现
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
610100 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

529th丶Altman 发表于 2023-4-10 19:21
感谢分享

免费评分

参与人数 1吾爱币 -15 收起 理由
RS水果 -15 本版块禁止灌水或回复与主题无关内容,违者重罚!

查看全部评分

陨落星辰 发表于 2023-4-10 20:16
小宇殿下 发表于 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注册文件机制和你那个有点像想请教你
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表