首页
社区
课程
招聘
[已解决] 求一个32程序调用64位dll例程,最好用delphi,易语言也可以 300雪币
发表于: 2024-7-20 17:22 3377

[已解决] 求一个32程序调用64位dll例程,最好用delphi,易语言也可以 300雪币

2024-7-20 17:22
3377
收藏
免费 0
支持
分享
最新回复 (57)
雪    币: 30050
活跃值: (2457)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
51

试了一下,win7+Delphi7,崩。用的也是附件的Dll。

最后于 2024-7-27 17:11 被bestbird编辑 ,原因:
2024-7-27 17:07
0
雪    币: 30050
活跃值: (2457)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
52

可以试试附件,在win7和win10下均异常退出。不管是否IDE环境。

附件是源码+楼上的DLL文件+编译后的EXE。


最后于 2024-7-27 17:18 被bestbird编辑 ,原因:
上传的附件:
2024-7-27 17:17
0
雪    币: 30050
活跃值: (2457)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
53
bestbird 别浪费时间了,32位进程是无法加载64位的DLL的。wow64ext其实是因为wow64进程内部加载了两个ntdll.dll:一个32位的,一个64位的,所以使用wow64ext,仅可以调用加载的nt ...

不好意思,64位进程的确是可以调用32位代码的,很多年前翻译过wow64ext,今天搜索了一下,的确是可以反过来调用的。http://blog.rewolf.pl/blog/?p=102:“

Running x86 code inside 64-bits process

It is very similar to the previous case with just one small inconvenience. Because 64-bits version of MS C/C++ compiler doesn’t support inline assembly, all tricks should be done in a separate .asm file. Below there are definitions of X86_Start and X86_End macros for MASM64:

X86_Start MACRO
	LOCAL  xx, rt	call   $+5
	xx     equ $	mov    dword ptr [rsp + 4], 23h	add    dword ptr [rsp], rt - xx	retf
	rt:ENDMX86_End MACRO
	db 6Ah, 33h			; push  33h
	db 0E8h, 0, 0, 0, 0		; call  $+5
	db 83h, 4, 24h, 5		; add   dword ptr [esp], 5
	db 0CBh				; retfENDM



另外,github上面在2016年也有人写出了相应的代码,见附件。有空后我会看看。

上传的附件:
2024-7-27 18:10
0
雪    币: 62
活跃值: (2052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
54
tDasm 你那个dll有问题,用我这个DLL测试什么问题都没有。
tDasm 你这个test.dll是delphi写的吗
2024-7-27 18:51
0
雪    币: 62
活跃值: (2052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
55
tDasm 请问,delphi 12 编译64位程序 加入汇编
var
   hfun: pointer
begi
  asm 
     jmp hfun
end;
end;
这样会报错,32位就可以
请问怎么处理
2024-7-27 20:30
0
雪    币: 30050
活跃值: (2457)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
56
JJGuo tDasm 请问,delphi 12 编译64位程序 加入汇编 var hfun: pointer begi asm jmp hfun end; end; 这样会 ...
64位的内镶汇编只能是单独的过程或函数,不支持类似32位这种。
2024-7-28 00:11
0
雪    币: 30050
活跃值: (2457)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
57
搞错了。这个是64位调用32位。
32位的调用64位的,使用那个wow64ext就可以了。
 xRet:=X64Call(fnLdrLoadDll, 4,  DWORD64(0),  DWORD64(0), DWORD64(@ModuleName), DWORD64(@MyDll));
也就是调用64位DLL里面的LdrLoadDll函数。但是经过测试,DLL不能使用user32里面的函数,否则会崩。
即使:先使用LdrLoadDll加载kernel32.dll,再使用里面的LoadLibraryW函数来加载也一样。如果Dll没有使用user32,一切运行良好。


2024-7-28 00:21
0
雪    币: 30050
活跃值: (2457)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
58

之前是在win10下测试正常。下午在win7试了一下,崩溃。决定放弃跟进。

找了一篇文章,里面介绍的解决方法无效:http://rce.co/knockin-on-heavens-gate-dynamic-processor-mode-switching/


附件的源码说支持win7和win10,支持个JB。浪费时间,法科。


另外请参考:


https://github.com/dadas190/Heavens-Gate-2.0/issues/2

---------------------------------------------------------------------------------------------------------
“RCECoder 评论 2023 年 10 月 31 日 • 

在切换到 64 位模式的过程中,有一些 dll 加载不安全。Gdi32.dll
Uxtheme.dll
User32.dll
可能还有更多。

Shell32 出现特殊错误。由于线程信息块中 TLS 数组初始化不当而导致崩溃。(GS:[0x58] 为零)

此外,

所有 SxS dll 将无法正确加载并出现错误

0xC000007B

STATUS_INVALID_IMAGE_FORMAT

这是因为 WinSxS Manager 仍然认为该进程是 32 位的,并尝试加载所请求 dll 的 32 位版本。重定向失败并指向 x86 文件夹,例如 comctl32.dll。它应该重定向到 amd64 文件夹。修复此类问题是一个相当漫长的过程,因为您必须手动重定向 dll,并通过解析清单或加载最新版本来确保版本正确。

这个问题没有简单的解决办法。WOW 转换不需要你做那么多,你必须不断修改,但仍然无法让它在所有 Windows 版本上正常工作。”

------------------------------------------------------------------------------------------------------------------

最后于 2024-7-28 19:57 被bestbird编辑 ,原因:
上传的附件:
2024-7-28 19:55
0
游客
登录 | 注册 方可回帖
返回
//