2012-02-16 21 views
13

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:

  1. 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 
    
  2. Zbuduj plik obj używając tego pliku ASM i MASM.exe

  3. Otwórz plik obj o edytor heksadecymalny i zlokalizować 90-tych, które reprezentują NOP
  4. 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!

+2

Możesz być najmądrzejszą osobą w społeczności Flash. heh –

+0

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ć! –

+0

Czy mówisz, że rozwiązałeś swój problem, ręcznie edytując plik Flash OCX? – Gabe

Odpowiedz

0
  1. 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 
    
  2. zbudować plik obj za pomocą tego pliku ASM i MASM.exe

  3. otworzyć plik obj o edytor heksadecymalny i lokalizowania 90-te, które reprezentują nop
  4. W Flash ocx zlokalizuj pierwszy ciąg bajtów między nopsami i zastąp go nowym łańcuchem bajtów, który pojawia się za nopsami. Spowoduje to zmianę z 32 do 64-bitowych wywołań funkcji.

zrobiłem następujący plik asm i zbudował go z 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 

Mam ten obj budować, a otwarto go w edytorze hex i był w stanie zlokalizować dwa ciągi bajtów. Znalazłem pierwszy ciąg bajtów w Flash OCX i zmieniłem go na drugi. (Jedyną zmianą było 41 do 49 w łańcuchach)