小编M. *_*ing的帖子

MASM修复DLL中的64位截断

我正在使用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 …
Run Code Online (Sandbox Code Playgroud)

c++ flash dll assembly masm

13
推荐指数
1
解决办法
599
查看次数

标签 统计

assembly ×1

c++ ×1

dll ×1

flash ×1

masm ×1