MASM修复DLL中的64位截断

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位复制R8DECX(ECX为32位).

cmp         dword ptr [rcx+11BCh],0 
Run Code Online (Sandbox Code Playgroud)

第二个操作访问64位寄存器,其中低32位包含正确的地址,高32位包含一些垃圾.当然,导致崩溃.

我已经读过一个可能的解决方案是执行以下操作:

  1. 创建一个包含以下代码的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)
  2. 使用此asm文件和MASM.exe构建obj文件

  3. 使用十六进制编辑器打开obj文件,找到代表nop的90
  4. 在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
Run Code Online (Sandbox Code Playgroud)

我在构建时遇到了麻烦(我不断收到有关指令长度匹配的错误),直到我在第二部分将r8d更改为r8.

我得到了这个obj来构建,并用十六进制编辑器打开它,并且能够找到两个字节的字符串.但我的问题来自于当我搜索应该在flash ocx中的第一个字节字符串时,我找不到它.它不存在,所以我不能用第二个替换它.

我究竟做错了什么?

谢谢!

M. *_*ing 0

  1. 创建包含以下代码的 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)
  2. 使用此 asm 文件和 MASM.exe 构建 obj 文件

  3. 使用十六进制编辑器打开 obj 文件并找到代表 nop 的 90
  4. 在 Flash ocx 中,找到 nop 之间的第一个字节字符串,并将其替换为 nop 之后的新字节字符串。这会将其从 32 位函数调用更改为 64 位函数调用。

我制作了以下 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)