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

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

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

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

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

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

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


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

不好意思,64位进程的确是可以调用32位代码的,很多年前翻译过wow64ext,今天搜索了一下,的确是可以反过来调用的。affK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2J5k6i4N6G2L8r3k6Q4x3X3g2H3L8q4)9J5c8X3u0D9L8$3N6Q4x3V1k6Q4x3@1k6H3i4K6y4p5x3e0l9J5i4@1g2r3i4@1u0o6i4K6W2m8i4@1f1J5i4K6R3H3i4K6W2o6

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
雪    币: 52
活跃值: (2167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
54
tDasm 你那个dll有问题,用我这个DLL测试什么问题都没有。
tDasm 你这个test.dll是delphi写的吗
2024-7-27 18:51
0
雪    币: 52
活跃值: (2167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
55
tDasm 请问,delphi 12 编译64位程序 加入汇编
var
   hfun: pointer
begi
  asm 
     jmp hfun
end;
end;
这样会报错,32位就可以
请问怎么处理
2024-7-27 20:30
0
雪    币: 29911
活跃值: (2952)
能力值: ( 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
雪    币: 29911
活跃值: (2952)
能力值: ( 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
雪    币: 29911
活跃值: (2952)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
58

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

找了一篇文章,里面介绍的解决方法无效:d6aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4u0U0k6g2)9J5k6h3y4G2i4K6u0r3K9$3&6G2j5$3E0A6L8W2)9J5k6r3!0F1i4K6u0V1K9r3g2S2N6X3g2F1M7#2)9J5k6r3N6S2N6r3g2Q4x3X3c8V1P5h3&6S2L8h3W2U0i4K6u0V1M7s2u0G2j5$3g2K6M7$3!0J5i4K6u0V1L8h3!0V1k6g2)9J5k6s2y4%4K9i4c8U0K9r3W2F1k6#2)9J5c8R3`.`.


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


另外请参考:


262K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6V1j5h3c8S2M7K6p5&6x3q4)9J5c8V1S2W2j5i4k6W2L8Y4y4Q4x3X3c8s2j5i4c8W2i4K6u0V1x3W2)9J5k6e0m8Q4x3V1k6A6M7%4y4#2k6i4y4Q4x3V1j5J5

---------------------------------------------------------------------------------------------------------
“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
游客
登录 | 注册 方可回帖
返回