首页
社区
课程
招聘
64位 call 32位?
发表于: 2013-2-26 11:16 4648

64位 call 32位?

2013-2-26 11:16
4648
main.exe调用plugin.dll,32位环境下用着没问题了,我想把主程序升级为到64位,但plugin只有32bit binary,不知能否从PE上下手,写个适配器DLL还是怎么样的。

知道问题有点难,等待高手出现

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 168
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我想过写两个32 64bit桩子,中间用IPC互联,这PLUGIN中间还反向抓取和CALL了不少东西...反向搭桥的代价有点大
2013-2-26 11:39
0
雪    币: 952
活跃值: (1931)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
理论上可以,64位系统下的32位api最终调用的也是64位代码,具体的实现你去查一下
2013-2-26 12:01
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
4
直接比较麻烦。
由于32位环境下返回地址是32位的,需要写驱动实现类似WOW64的功能,外部函数返回后作出处理再返回主程序,而64位下的驱动那蛋疼的数字签名问题……

这里有个小思路:再建立一个32位进程,作为“中继”,所有调用32位函数的过程都通过它来完成,最后再通过各种进程间数据传递机制来实现。
这样性能损失可能会比较大,但方便。
2013-2-26 12:45
0
雪    币: 168
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我找到这个,中继这个思路还是正确的
http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/

简单的情况用中继应该没问题,这个案例有些复杂,PLUGING一共初始化函数,主程序传了一个指针进去,然后里面PLUGIN反CALL和抽取主程序状态的调用估计都是在这个指针下完成的(都隐藏在PLUGIN SDK的一个400KB的static lib中),这些反向CALL和数据的抽取是个大问题,我觉得很有必要看看SDK生成的PLUGIN框架都私底下做了什么事情,然后完全模拟用中继方法接上
2013-2-26 12:53
0
雪    币: 168
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
DLL导出了个把个函数,若是用hexray提取C代码,修改后,然后编译,修复的工作量有多大?
2013-2-26 15:30
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
7
这个比较难说,RP好的话工作量 = 0,RP不好够忙很久的……
使用32位进程作为中继后,WOW64已经解决了大部分兼容性问题,对于指针传递,需要考虑到的问题如下:
1.32位DLL寻址范围只有4GB(假如内部有指针有效性检测代码的话,可能这个范围只有2GB)。
2.如果存在回调的话,反向调用又存在兼容性问题。
不知道回调涉及到哪些函数,这里只能给出简单的建议:
1.主程序中通过中继调用DLL的函数时只传递指向低2GB内存地址的指针。
2.利用MDL(Ring3下应该可以用FileMap)共享内存,避免调用指针。

不过预计还是得花大把的时间调试去研究回调,建议还是考虑下从整个程序架构的角度出发,试着把主程序分离成32位和64位两部分,同时运行两个进程。那些可能被回调的部分放在32位进程中,需要用到大内存或者64位运算的部分放在64位进程中。
2013-2-26 20:22
0
游客
登录 | 注册 方可回帖
返回
//