Подтвердить что ты не робот

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

Я работаю с ocx Adobe Flash, загружая его в свою программу на С++. 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-бит содержит некоторый барахл. Конечно, к сбою, конечно.

Решение

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

  • Создайте 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 
    
  • Создайте файл obj с помощью этого asm файла и MASM.exe

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

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

Что я делаю неправильно?

Спасибо!

4b9b3361

Ответ 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 
    
  • Создайте файл obj с помощью этого asm файла и MASM.exe

  • Откройте файл obj с шестнадцатеричным редактором и найдите 90, которые представляют nop
  • В Flash ocx найдите первую строку байтов между nops и замените ее на новую строку байтов, которая появляется после nops. Это изменит его с 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

Я получил этот объект для сборки и открыл его с помощью шестнадцатеричного редактора и смог найти две байтовые строки. Я нашел первую строку байта в Flash OCX и изменил ее на вторую. (Единственное фактическое изменение - от 41 до 49 в строках)