吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 809|回复: 8
收起左侧

[求助] 64位汇编如何实现LoadLibraryA呢?

[复制链接]
董督秀 发表于 2023-11-5 20:35
本帖最后由 董督秀 于 2023-11-5 20:39 编辑

在C里直接调用:
LoadLibraryA("123456.dll");
想通过64位汇编实现LoadLibraryA的间接调用,

百度或者GL多是通过C实现的?我该如何通过64位汇编实现?
1.要求能够应付动态基址,并且能够在编译器编译通过
2.能够直接在x64dbg内使用该汇编

最初构思是通过64位汇编动态获取到LoadLibraryA的函数头地址并保存在寄存器中,最后call rax。但在x64dbg内尝试均未成功。

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

leyuxin 发表于 2023-11-5 20:54
调用DLL

在C语言中,可以通过LoadLibrary函数和GetProcddress函数来动态加载DLL并调用其中的函数。具体步骤如下

1. 加载DLL文件

HINSTNCE hDll = LoadLibrary(TEXT("test.dll"));

2. 获取函数地址

GetProcddress(hDll, "add");

3. 调用函数

t result = pdd(1, 2);

免费评分

参与人数 1热心值 +1 收起 理由
董督秀 + 1 没那么简单... 老兄看清题目啊。

查看全部评分

leyuxin 发表于 2023-11-5 21:06
 楼主| 董督秀 发表于 2023-11-5 21:08
leyuxin 发表于 2023-11-5 21:06
定义个函数指针如何

肯定是不行的...... 我说过了要求通过纯汇编实现,并且能够直接在x64dbg内使用该汇编。例如,在调试其他程序的时候(无源码),可以加上这段汇编代码达到目的。

点评

x64dbg 可以直接远程注入 dll 如果你真的需要纯汇编实现,你可以在 mvsc 写好然后抠代码  详情 回复 发表于 2023-11-6 04:06
woflant 发表于 2023-11-5 23:54
纯汇编可以通过TEB->PEB->LDR->LIST_ENTRY方式逐步获取,与32位类似,只是偏移有变化

x64通过TEB获取模块基址
① gs:[0x60]获取PEB
②[PEB+0x18]获取LDR
③[LDR++0x30]获取LIST_ENTRY
④[LIST_ENTRY+0x40]获取当前模块名称并比较,不相等则[LIST_ENTRY]获取NEXT_LIST_ENTRY,循环比较
⑤找到所需模块LIST_ENTRY后,[LIST_ENTRY+0x10]获取所需模块基址

拿到模块基址后解析PE头,获取并比较ENT,即可获取EAT(一般先获取LoadLibrary、GetProcAddress、GetModuleHandle函数地址,后面就不需要汇编了)

需要注意,64位汇编call调用传参和32位不同,前四个参数保存在寄存器RCX、RDX、R8、R9

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
董督秀 + 1 + 1 热心回复!

查看全部评分

爱飞的猫 发表于 2023-11-6 04:06
董督秀 发表于 2023-11-5 21:08
肯定是不行的...... 我说过了要求通过纯汇编实现,并且能够直接在x64dbg内使用该汇编。例如,在调试其他 ...

x64dbg 可以直接远程注入 dll

如果你真的需要纯汇编实现,你可以在 mvsc 写好然后抠代码

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
董督秀 + 1 + 1 热心回复!

查看全部评分

 楼主| 董督秀 发表于 2023-11-6 04:24
爱飞的猫 发表于 2023-11-6 04:06
x64dbg 可以直接远程注入 dll

如果你真的需要纯汇编实现,你可以在 mvsc 写好然后抠代码

基本扣好了。 有11段汇编。折腾了一天。
 楼主| 董督秀 发表于 2023-11-6 05:51
本帖最后由 董督秀 于 2023-11-6 05:53 编辑
woflant 发表于 2023-11-5 23:54
纯汇编可以通过TEB->PEB->LDR->LIST_ENTRY方式逐步获取,与32位类似,只是偏移有变化

x64通过TEB获取模 ...

基本解决了,64位的确实比较麻烦。先用vc写,通过teb 获取kernel的基址,之后取kernel里的函数名,遍历。之后才取到loadlibrary的地址在rax。不能直接用微软的api,相当于先自己实现,之后抠成汇编的形式后,再call rax。

点评

全都加上 _forceinline,然后注意不要调用 api 和标准库函数就好扣了  详情 回复 发表于 2023-11-6 22:05
爱飞的猫 发表于 2023-11-6 22:05
董督秀 发表于 2023-11-6 05:51
基本解决了,64位的确实比较麻烦。先用vc写,通过teb 获取kernel的基址,之后取kernel里的函数名,遍历。 ...

全都加上 _forceinline(你实现的 loadlibrary 本体除外),然后注意不要调用 api 和标准库函数就好扣了

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
苏紫方璇 + 1 + 1 用心讨论,共获提升!
董督秀 + 1 + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 17:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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