MASM修复DLL中的64位截断 我正在使用Adobe Flash OCX工作,通过将它加载到我的C++程序中。ocx应该是64位的,但由于某种原因,当我使用x64平台编译时,它会出现问题。我读过这篇文章,发现有可能是某些函数通过某种结构接收DWORD userData,而不是void*userData,然后将其强制转换为对象指针。这在32位环境中正常工作,但在64位环境中崩溃

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

导致崩溃的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 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 
    
  • 使用此asm文件和MASM.exe生成obj文件

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

    我尝试通过创建以下asm文件并使用ml64.exe构建它(我没有masm.exe,但我认为ml.exe是它的新32位版本,并且此代码将仅使用ml64.exe构建,可能是因为仅64位运算符的缘故):

    在第二节中我将r8d改为r8之前,我在构建它时遇到了困难(在指令长度匹配方面不断出现错误)

    我得到了这个要构建的obj,并用十六进制编辑器打开它,能够找到两个字节的字符串。但我的问题是,当我搜索应该在flashocx中的第一个字节字符串时,我找不到它。它不在那里,所以我不能用第二个替换它

    我做错了什么

    谢谢

  • 创建包含以下代码的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 
    
    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的90
  • 在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
    

    我得到了这个要构建的obj,并用十六进制编辑器打开它,能够找到两个字节的字符串。我在Flash OCX中找到了第一个字节字符串,并将其更改为第二个字节字符串。(唯一的实际变化是字符串中的41到49)

    你可能是这里Flash社区中最聪明的人。呵呵,我希望。。我真希望我对组装有更多的了解,并能把这件事做好。我几乎可以肯定我知道问题是什么,只是似乎无法解决它!你是说你通过手动编辑Flash OCX文件解决了你的问题吗?嘿,我是Flash Player团队的成员。虽然我们不正式支持在IE之外使用ocx,但这看起来是一个严重的错误,我真的很想知道您正在修补哪个函数,以便我可以正确地修复它。我有点困惑,这是一个普通的ocx问题还是flash内部的问题。我正在使用一系列回调来在flash中的actionscript之间传输数据。我将不得不进行一些调试,以了解确切的函数是什么。我以前很难看到它,因为调用堆栈上只有
    flash.ocx!一些numbers()
    因此我知道问题出在64位ocx中。我会让你知道一旦我发现更多的信息(我有一个繁忙的一周,所以可能需要几天)。谢谢你的调查。