MASM Исправление 64-битного усечения в DLL

Я работаю с Adobe Flash ocx, загружая его в свою программу на C ++. Предполагается, что ocx будет 64-битным, но по какой-то причине у него возникают проблемы при компиляции с платформой x64. Я прочитал об этом и обнаружил, что вполне вероятно, что какая-то функция получает DWORD userData вместо void * userData через некоторую структуру, а затем преобразует ее в указатель объекта. Это нормально работает в 32-битной среде, но дает сбой в 64-битной среде.

Дизассемблирование вызовов функций внутри ocx, вызывающих сбой, представляет собой следующие строки:

mov         ecx,r8d 

Первая операция копирует только младшие 32 бита из R8D в ECX ( ECX - 32-битный).

cmp         dword ptr [rcx+11BCh],0 

Вторая операция обращается к 64-битному регистру, где младшие 32 разряда содержат правильный адрес, а старшие 32 разряда содержат некоторый мусор. Конечно, это приведет к катастрофе.

Решение

Я прочитал, что одно из возможных решений - это сделать следующее:

  1. Создать файл asm, содержащий следующий код:

     nop
    нет
    нет
    mov ecx, r8d
    cmp dword ptr [rcx + 11BCh], 0
    нет
    нет
    нет
    mov rcx, r8d // Я заменил ecx на rcx здесь
    cmp dword ptr [rcx + 11BCh], 0
    
  2. Создайте файл obj, используя этот файл asm и MASM.exe

  3. Откройте файл obj с помощью шестнадцатеричного редактора и найдите 90-е, которые представляют nop
  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

У меня были проблемы с его сборкой (я продолжал получать ошибки о сопоставлении длины инструкций), пока я не изменил r8d на r8 в второй раздел.

Я получил этот объект для сборки, открыл его с помощью шестнадцатеричного редактора и смог найти две байтовые строки. Но моя проблема заключается в том, что когда я ищу первую байтовую строку, которая должна быть во flash ocx, я не могу ее найти. Его там нет, поэтому я не могу заменить его вторым.

Что я делаю не так?

Спасибо!

13
задан M. Laing 8 March 2012 в 16:57
поделиться