M. *_*ing 13 c++ flash dll assembly masm
我正在使用Adobe Flash ocx将其加载到我的C++程序中.ocx应该是64位但由于某种原因,当我使用x64平台编译时它会出现问题.我已经阅读了这篇文章,发现有些函数可能会接收DWORD userData而不是void* userData通过某种结构,然后将其转换为对象指针.这在32位环境中正常工作,但在64位崩溃.
在导致崩溃的ocx内部的函数调用的反汇编有以下几行:
mov ecx,r8d
Run Code Online (Sandbox Code Playgroud)
第一个操作仅将低32位复制R8D到ECX(ECX为32位).
cmp dword ptr [rcx+11BCh],0
Run Code Online (Sandbox Code Playgroud)
第二个操作访问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
Run Code Online (Sandbox Code Playgroud)使用此asm文件和MASM.exe构建obj文件
问题
我通过制作以下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
Run Code Online (Sandbox Code Playgroud)
我在构建时遇到了麻烦(我不断收到有关指令长度匹配的错误),直到我在第二部分将r8d更改为r8.
我得到了这个obj来构建,并用十六进制编辑器打开它,并且能够找到两个字节的字符串.但我的问题来自于当我搜索应该在flash ocx中的第一个字节字符串时,我找不到它.它不存在,所以我不能用第二个替换它.
我究竟做错了什么?
谢谢!
创建包含以下代码的 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
Run Code Online (Sandbox Code Playgroud)使用此 asm 文件和 MASM.exe 构建 obj 文件
我制作了以下 asm 文件并使用 ml64.exe 构建它
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
Run Code Online (Sandbox Code Playgroud)
我构建了这个 obj,并使用十六进制编辑器打开它,并能够找到两个字节字符串。我在Flash OCX中找到了第一个字节串,并将其更改为第二个。(唯一实际的变化是琴弦中的 41 变为 49)