好友
阅读权限20
听众
最后登录1970-1-1
|
董督秀
发表于 2026-2-22 16:12
讨论中涉及的exe和dll:
https://wwbeo.lanzouv.com/iZxSo3iyw3sj
我尝试在32位程序中使用wow64(详见有关GH开源库)调用64位dll,经测试在加载64位dll后,出现了一些问题:
步骤思路:通过切换cs进入到64位模式,并且从ntdll中取到线程创建函数进行创建线程,之后从取到ldr函数地址加载test.dll
如果使用64位调试器单独加载test.dll,可以看到入口点相对偏移0x1470:
01
用32位调试器运行JmpCall64.exe,通过控制台打印提示可以看到,已经将其加载到32位进程空间了(可以提前在ExitProcess设置断点),
02
存在问题:
1. 在64位的win10测试,当控制台打印输出结束后,偶尔会出现0xC0000005错误,或者异常崩溃。注册异常处理无法捕获;在64位的win7测试,直接崩溃,异常也无法捕获
2. 导出函数地址获取问题。假设给test.dll声明导出函数,那么该如何在32位进程中,获取该自定义模块(test.dll)的导出函数地址?
3. 如果在test.dll中使用user32.dll等模块中的函数,例如在dllmain中使用MessageBoxA会导致崩溃、使用OutputDebugString也是崩溃。但如果使用printf打印之类的函数却不崩溃?
4. 在32位调试器中,给Sleep设置断点,无法断下。
详见dll入口点简单写了一段代码进行打印测试:
03
5. 在test.dll打印输出过程中,尝试更名dll文件成功,未提示文件占用?dll会打印24秒,在24秒内,尝试给dll改名,发现可以更名,为什么?一般情况下,使用中的文件貌似无法进行更名? |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|
|