2012-02-16 30 views
13

Tôi đang làm việc với ocx Adobe Flash bằng cách tải nó vào chương trình C++ của tôi. Các ocx được coi là 64 bit nhưng đối với một số lý do nó có vấn đề khi tôi biên dịch với nền tảng x64. Tôi đã đọc về điều này và thấy rằng có khả năng một số chức năng nhận được DWORD userData thay vì void* userData thông qua một số cấu trúc và sau đó đưa nó vào một con trỏ đối tượng. Tính năng này hoạt động tốt trong môi trường 32 bit nhưng bị lỗi trong 64 bit.MASM Sửa lỗi 64 bit trong một DLL

Các tháo của hàm gọi bên trong ocx mà gây ra tai nạn là những dòng sau:

mov   ecx,r8d 

Bản sao hoạt động đầu tiên chỉ thấp 32-bit R8D-ECX (ECX là 32-bit).

cmp   dword ptr [rcx+11BCh],0 

Thao tác thứ hai truy cập thanh ghi 64 bit, trong đó 32 bit thấp chứa địa chỉ chính xác và 32 bit cao chứa một số rác. Dẫn đến một vụ tai nạn, tất nhiên.

Giải pháp

Tôi đã đọc rằng một giải pháp khả thi là phải làm như sau:

  1. Tạo một file asm có chứa đoạn mã sau:

    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. Xây dựng tệp obj bằng tệp asm này và MASM.exe

  3. Mở tệp obj bằng trình chỉnh sửa hex và xác định số 90 đại diện cho nop
  4. Trong ocx Flash xác định chuỗi byte đầu tiên giữa các bước nhảy và thay thế bằng chuỗi byte mới xuất hiện sau các bước nhảy . Điều này sẽ thay đổi nó từ các cuộc gọi hàm 32 bit đến 64 bit.

Vấn đề

tôi đã cố gắng này bằng cách làm cho file asm sau và xây dựng nó với ml64.exe (Tôi không có masm.exe nhưng tôi nghĩ rằng ml.exe là mới phiên bản 32 bit của nó, và mã này sẽ chỉ xây dựng với ml64.exe, có lẽ vì các nhà khai thác chỉ 64-bit):

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 

tôi gặp rắc rối khi nó để xây dựng (tôi liên tục nhận được các lỗi về phù hợp với chiều dài lệnh) cho đến khi tôi thay đổi r8d thành r8 trong phần thứ hai.

Tôi nhận được obj này để xây dựng và mở nó bằng trình chỉnh sửa hex và có thể định vị hai chuỗi byte. Nhưng vấn đề của tôi là khi tôi tìm chuỗi byte đầu tiên phải ở trong ocx flash, tôi không thể tìm thấy nó. Nó không có ở đó, vì vậy tôi không thể thay thế nó bằng cái thứ hai.

Tôi đang làm gì sai?

Cảm ơn!

+2

Bạn có thể là người thông minh nhất trong cộng đồng Flash tại đây. heh –

+0

ha Tôi muốn .. Tôi thực sự muốn tôi biết nhiều hơn về lắp ráp và có thể nhận được điều này để làm việc. Tôi gần như tích cực, tôi biết vấn đề là gì, dường như không thể sửa được nó! –

+0

Bạn có nói rằng bạn đã giải quyết được sự cố của mình bằng cách chỉnh sửa thủ công tệp Flash OCX không? – Gabe

Trả lời

0
  1. Tạo một file asm có chứa đoạn mã sau:

    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. Xây dựng một tập tin obj sử dụng tập tin asm này và MASM.exe

  3. mở file obj với một trình soạn thảo hex và xác định vị trí số 90 đại diện cho nop
  4. Trong ocx Flash xác định chuỗi byte đầu tiên giữa các bước nhảy và thay thế bằng chuỗi byte mới xuất hiện sau các bước nhảy. Điều này sẽ thay đổi nó từ các cuộc gọi hàm 32 bit đến 64 bit.

tôi đã thực hiện các tập tin asm sau và xây dựng nó với 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 

tôi nhận này obj để xây dựng và mở nó bằng một trình soạn thảo hex và đã có thể xác định vị trí hai chuỗi byte. Tôi tìm thấy chuỗi byte đầu tiên trong Flash OCX và thay đổi nó thành chuỗi thứ hai. (Thay đổi thực tế duy nhất là từ 41 đến 49 trong chuỗi)