Pracuję z Adobe Flash ocx, ładując go do mojego programu C++. Ocx ma być 64-bitowy, ale z jakiegoś powodu ma problemy podczas kompilacji z platformą x64. Przeczytałem o tym i stwierdziłem, że jest prawdopodobne, że pewna funkcja odbiera DWORD userData
zamiast void* userData
przez jakąś strukturę, a następnie rzuca ją do wskaźnika obiektu. Działa to dobrze w środowisku 32-bitowym, ale zawiesza się w 64-bitowym.Naprawianie 64-bitowe przycinanie MASM w bibliotece DLL
demontaż funkcji połączenia wewnątrz ocx będące przyczyną awarii są następujące linie:
mov ecx,r8d
Pierwsze kopiuje pracy tylko niskie 32 bitów z R8D
do ECX
(ECX jest 32-bitowa).
cmp dword ptr [rcx+11BCh],0
Druga operacja dostępu 64-bitowego rejestru, w którym niskie 32 bitów zawiera prawidłowy adres i wysoki 32 bitów zawiera pewną ilość śmieci. Oczywiście prowadzi do katastrofy.
Rozwiązanie
Czytałem, że jednym z możliwych rozwiązań jest wykonanie następujących czynności:
Utwórz plik asm zawierający następujący kod:
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
Zbuduj plik obj używając tego pliku ASM i MASM.exe
- Otwórz plik obj o edytor heksadecymalny i zlokalizować 90-tych, które reprezentują NOP
- W Flash OCX zlokalizować pierwszy ciąg bajtów pomiędzy NOP i zastąpić go nowym ciąg bajtów, które przychodzi po NOP . Spowoduje to zmianę z 32 do 64-bitowych wywołań funkcji.
Problem
próbowałem to poprzez następujący plik asm i budowanie go z ml64.exe (nie mam masm.exe ale myślę, że jest nowy ml.exe 32-bitowa wersja niego, a ten kod będzie budować tylko z ml64.exe, prawdopodobnie ze względu na zaledwie 64-bitowych operatorów):
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
miałem problemy z dostaniem go zbudować (Ciągle otrzymuję błędy temat dopasowywanie długości instrukcji) aż do I zmienił r8d na r8 w drugiej sekcji.
Mam ten obiekt do zbudowania i otworzyłem go za pomocą edytora szesnastkowego i udało mi się zlokalizować dwa ciągi bajtowe. Ale gdzie pojawia się mój problem, kiedy szukam pierwszego ciągu bajtów, który powinien znajdować się w flash ocx, nie mogę go znaleźć. Nie ma go, więc nie mogę go zastąpić drugim.
Co robię źle?
Dzięki!
Możesz być najmądrzejszą osobą w społeczności Flash. heh –
ha Chciałabym .. Naprawdę chciałabym, bym wiedział jeszcze więcej o montażu i mógł sprawić, żeby to zadziałało. Jestem prawie pewien, że wiem, jaki jest problem, po prostu nie mogę tego naprawić! –
Czy mówisz, że rozwiązałeś swój problem, ręcznie edytując plik Flash OCX? – Gabe