我正在使用 Adobe Flash ocx,将其加载到我的 C++ 程序中。该 ocx 应该是64位的,但出现了一些问题,当我使用 x64 平台编译时会崩溃。根据我的研究,可能是某些函数通过某些结构体接收了 DWORD userData
而不是 void* userData
,然后将其转换为对象指针。这在32位环境下可以工作正常,但在64位环境下会导致崩溃。
导致崩溃的 ocx 内部函数调用的反汇编代码如下:
mov ecx,r8d
第一个操作只从R8D
复制低32位到ECX
(ECX为32位)。
cmp dword ptr [rcx+11BCh],0
第二个操作访问了一个64位寄存器,其中低32位包含正确的地址,而高32位包含一些垃圾数据。当然,这会导致程序崩溃。
解决方案
我了解到一种可能的解决方案是执行以下步骤:
创建一个包含以下代码的asm文件:
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
使用此asm文件和MASM.exe构建一个obj文件
- 用十六进制编辑器打开obj文件并定位代表nop的90s
- 在Flash ocx中,查找nops之间的第一个字节字符串,并用跟在nops之后的新字节字符串替换它。这将把它从32位变成64位函数调用。
问题
我尝试通过创建以下asm文件并使用ml64.exe进行构建(我没有masm.exe,但我认为ml.exe是它的新32位版本,而且这个代码只能使用ml64.exe构建,可能是因为它支持64位操作符?):
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
在第二部分中,我一直遇到指令长度不匹配的错误,直到我将r8d更改为r8,才成功构建它。
我已经成功构建了该obj文件,并使用十六进制编辑器定位了两个字节字符串。但是我的问题在于,当我搜索应该出现在flash ocx中的第一个字节字符串时,却找不到它。它不存在,因此我无法用第二个字节字符串替换它。
我做错了什么?
谢谢!
flash.ocx!some numberes()
,所以我知道问题出在64位ocx中。一旦我找到更多信息,我会让你知道(我这周很忙,可能需要几天时间)。感谢您的关注。 - M. Laing