2016-12-12 13 views
5

Tôi đã đặt một hàm bên trong tệp thực thi mà tôi muốn gọi từ tệp DLL của mình. Địa chỉ của nó sẽ là 0x0090DE00 theo OllyDbg. Tôi đã cố gắng để gọi nó là trực tiếp:Làm thế nào để gọi một hàm nằm trong một tập tin thực thi từ một DLL nạp?

luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00)); 

mà còn với việc thêm các căn cứ của xử lý module để nó như đề xuất here:

uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe"); 

luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00)); 

Dường như đây không phải là làm việc như tôi có thể truy cập ngoại lệ vi phạm - có vẻ như con trỏ không hợp lệ.

Vì vậy: Làm cách nào để gọi hàm này bằng cách sử dụng địa chỉ của nó?


Tôi vừa chèn một hướng dẫn đơn giản RET tại 0x00C0B530. Mã của tôi giờ đây trông như sau:

typedef void (*test)(); 

EXTERN_DLL_EXPORT void initialize(lua_State *L) 
{ 
    // Adding this should not be necessary. I get 0x00C0B530 from 
    // OllyDbg where the offset 0x00401000 is included 
    uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe"); 

    test *f = NULL; 

    f = ((test*)(0x00C0B530)); 

    (*f)(); // Crashing 
} 

Những gì tôi không hoàn toàn hiểu được là tại sao tôi nhận được một địa chỉ khác trong thông điệp ngoại lệ:

ngoại lệ ném vào 0x909090C3 trong ForgedAlliance1.exe: 0xC0000005 : Truy cập vị trí thực thi vi phạm 0x909090C3.


UPDATE: Tôi chỉ nhận ra rằng 0x909090C3 không chỉ là một con trỏ ở đây, nó là mã bản thân

90 | NOP 
90 | NOP 
90 | NOP 
C3 | RETN 

Có vẻ tôi đang rối tung lên một cái gì đó với con trỏ. Tại sao nó cố gắng thực hiện "vị trí" 0x909090C3. Đó không phải là vị trí.

+1

Khi kiểm tra với olly, bạn có chắc chắn rằng chức năng không được lưu trữ bên trong một mô-đun khác mà 'ForgedAlliance1.exe' sử dụng và không chính xác thực thi? – Bauss

+0

@Bauss Hm, tôi là một chút mới cho tất cả điều này nhưng tôi có thể cho bạn biết làm thế nào tôi có địa chỉ: Tôi chỉ cần mở tập tin thực thi. Khi tôi gỡ lỗi thông qua nó, tôi thấy rằng địa chỉ bắt đầu là '0x00401000'. Vì vậy, tôi giả định rằng tất cả những gì tôi thấy trong cửa sổ cụ thể này là thực thi của tôi. Mỗi khi tôi lưu một số thay đổi vào mã assembly của tập tin thực thi, tôi sẽ ghi đè lên tập tin thực thi «ForgedAlliance1.exe'. Vì vậy, miễn là OllyDbg không hiển thị các vùng khác của bộ nhớ của tôi, địa chỉ phải chính xác và một phần của tệp thực thi. – displayname

+1

Bạn đã xem bài viết này chưa? https://www.codeproject.com/articles/1045674/load-exe-as-dll-mission-possible – Alden

Trả lời

2

Được rồi, nó chỉ là một con trỏ lộn xộn. Xin lỗi vì điều đó - đã không viết trong C trong một thời gian dài. Tôi đã làm điều đó đúng, về cơ bản, nhưng vấn đề với

f = ((test*)(0x00C0B530)); 
(*f)(); 

là, (*f)0x909090C3 - hướng dẫn bên trong thực thi - và đây là địa chỉ các chương trình cố gắng nhảy đến đó là tất nhiên không hợp lệ.

Vì vậy, các trick là:

int test_addr = 0x00C0B530 
f = ((test*)(&test_addr)); 
(*f)(); 

Tôi chắc chắn điều này có thể được thực hiện đơn giản hơn một chút nhưng điều này đang làm việc bây giờ.

Các vấn đề liên quan