Я работаю с 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, я не могу ее найти. Его нет, поэтому я не могу заменить его вторым.
Что я делаю неправильно?
Спасибо!