Я работаю с 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 разряда содержат некоторый мусор. Конечно, это приведет к катастрофе.
Решение
Я прочитал, что одно из возможных решений - это сделать следующее:
Создать файл asm, содержащий следующий код:
nop
нет
нет
mov ecx, r8d
cmp dword ptr [rcx + 11BCh], 0
нет
нет
нет
mov rcx, r8d // Я заменил ecx на rcx здесь
cmp dword ptr [rcx + 11BCh], 0
Создайте файл obj, используя этот файл asm и MASM.exe
Проблема
Я попытался это сделать, создав следующий файл 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, я не могу ее найти. Его там нет, поэтому я не могу заменить его вторым.
Что я делаю не так?
Спасибо!