MASM修复DLL中的64位截断 我正在使用Adobe Flash OCX工作,通过将它加载到我的C++程序中。ocx应该是64位的,但由于某种原因,当我使用x64平台编译时,它会出现问题。我读过这篇文章,发现有可能是某些函数通过某种结构接收DWORD userData,而不是void*userData,然后将其强制转换为对象指针。这在32位环境中正常工作,但在64位环境中崩溃
导致崩溃的ocx内部函数调用的反汇编如下所示:MASM修复DLL中的64位截断 我正在使用Adobe Flash OCX工作,通过将它加载到我的C++程序中。ocx应该是64位的,但由于某种原因,当我使用x64平台编译时,它会出现问题。我读过这篇文章,发现有可能是某些函数通过某种结构接收DWORD userData,而不是void*userData,然后将其强制转换为对象指针。这在32位环境中正常工作,但在64位环境中崩溃,c++,flash,dll,assembly,masm,C++,Flash,Dll,Assembly,Masm,导致崩溃的ocx内部函数调用的反汇编如下所示: mov ecx,r8d 第一个操作仅将低32位从R8D复制到ECX(ECX为32位) 第二个操作访问64位寄存器,其中低32位包含正确的地址,高32位包含一些垃圾。当然,这会导致撞车 解决方案 我已经读到一个可能的解决方案是执行以下操作: 创建包含以下代码的asm文件: nop nop nop mov ecx,r8d cmp dword ptr [rcx+11BCh],0 nop nop nop mov r
mov ecx,r8d
第一个操作仅将低32位从R8D
复制到ECX
(ECX为32位)
第二个操作访问64位寄存器,其中低32位包含正确的地址,高32位包含一些垃圾。当然,这会导致撞车
解决方案
我已经读到一个可能的解决方案是执行以下操作:
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8d // I've replaced ecx with rcx here
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8d // I've replaced ecx with rcx here
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8d // I've replaced ecx with rcx here
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8d // I've replaced ecx with rcx here
cmp dword ptr [rcx+11BCh],0
TITLE: Print String Assembly Program (test.asm)
.Code
main Proc
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8
cmp dword ptr [rcx+11BCh],0
main ENDP
END
我得到了这个要构建的obj,并用十六进制编辑器打开它,能够找到两个字节的字符串。我在Flash OCX中找到了第一个字节字符串,并将其更改为第二个字节字符串。(唯一的实际变化是字符串中的41到49)你可能是这里Flash社区中最聪明的人。呵呵,我希望。。我真希望我对组装有更多的了解,并能把这件事做好。我几乎可以肯定我知道问题是什么,只是似乎无法解决它!你是说你通过手动编辑Flash OCX文件解决了你的问题吗?嘿,我是Flash Player团队的成员。虽然我们不正式支持在IE之外使用ocx,但这看起来是一个严重的错误,我真的很想知道您正在修补哪个函数,以便我可以正确地修复它。我有点困惑,这是一个普通的ocx问题还是flash内部的问题。我正在使用一系列回调来在flash中的actionscript之间传输数据。我将不得不进行一些调试,以了解确切的函数是什么。我以前很难看到它,因为调用堆栈上只有
flash.ocx!一些numbers()
因此我知道问题出在64位ocx中。我会让你知道一旦我发现更多的信息(我有一个繁忙的一周,所以可能需要几天)。谢谢你的调查。