64位汇编如何实现LoadLibraryA呢?
本帖最后由 董督秀 于 2023-11-5 20:39 编辑在C里直接调用:
LoadLibraryA("123456.dll");
想通过64位汇编实现LoadLibraryA的间接调用,
百度或者GL多是通过C实现的?我该如何通过64位汇编实现?
1.要求能够应付动态基址,并且能够在编译器编译通过
2.能够直接在x64dbg内使用该汇编
最初构思是通过64位汇编动态获取到LoadLibraryA的函数头地址并保存在寄存器中,最后call rax。但在x64dbg内尝试均未成功。 调用DLL
在C语言中,可以通过LoadLibrary函数和GetProcddress函数来动态加载DLL并调用其中的函数。具体步骤如下
1. 加载DLL文件
HINSTNCE hDll = LoadLibrary(TEXT("test.dll"));
2. 获取函数地址
GetProcddress(hDll, "add");
3. 调用函数
t result = pdd(1, 2); 定义个函数指针如何 leyuxin 发表于 2023-11-5 21:06
定义个函数指针如何
肯定是不行的...... 我说过了要求通过纯汇编实现,并且能够直接在x64dbg内使用该汇编。例如,在调试其他程序的时候(无源码),可以加上这段汇编代码达到目的。 纯汇编可以通过TEB->PEB->LDR->LIST_ENTRY方式逐步获取,与32位类似,只是偏移有变化
x64通过TEB获取模块基址
① gs:获取PEB
②获取LDR
③获取LIST_ENTRY
④获取当前模块名称并比较,不相等则获取NEXT_LIST_ENTRY,循环比较
⑤找到所需模块LIST_ENTRY后,获取所需模块基址
拿到模块基址后解析PE头,获取并比较ENT,即可获取EAT(一般先获取LoadLibrary、GetProcAddress、GetModuleHandle函数地址,后面就不需要汇编了)
需要注意,64位汇编call调用传参和32位不同,前四个参数保存在寄存器RCX、RDX、R8、R9 董督秀 发表于 2023-11-5 21:08
肯定是不行的...... 我说过了要求通过纯汇编实现,并且能够直接在x64dbg内使用该汇编。例如,在调试其他 ...
x64dbg 可以直接远程注入 dll
如果你真的需要纯汇编实现,你可以在 mvsc 写好然后抠代码 爱飞的猫 发表于 2023-11-6 04:06
x64dbg 可以直接远程注入 dll
如果你真的需要纯汇编实现,你可以在 mvsc 写好然后抠代码
基本扣好了{:1_937:}。 有11段汇编。折腾了一天。 本帖最后由 董督秀 于 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。 董督秀 发表于 2023-11-6 05:51
基本解决了,64位的确实比较麻烦。先用vc写,通过teb 获取kernel的基址,之后取kernel里的函数名,遍历。 ...
全都加上 _forceinline(你实现的 loadlibrary 本体除外),然后注意不要调用 api 和标准库函数就好扣了
页:
[1]