2012-03-03 27 views
10

Tôi có ít vấn đề. Tôi đã nạp DLL vào quá trình (nó không phải của tôi) và tôi phải sử dụng chức năng bên trong nó. Tôi đã có bù đắp cho chức năng này vì vậy chỉ có những gì tôi phải làm là để có được địa chỉ DLL và thêm nó để bù đắp để có được chức năng. GetModuleHandle() trả về HMODULE biến nhưng thực sự tôi không biết những gì HMODULE là. Có địa chỉ của DLL nạp hoặc một số loại nhãn hiệu khác?HMODULE là gì?

Và nếu nó không phải là địa chỉ của nơi mà DLL được tải, làm thế nào tôi có thể nhận được địa chỉ này? Tôi hy vọng tôi làm cho bản thân mình rõ ràng.

Trả lời

8

Phương pháp bạn đề xuất sẽ hoạt động tốt.

Dường như bạn đã tiêm một dll vào một quá trình đích và muốn lấy địa chỉ của hàm trong dll đó trong quá trình đích từ quá trình tiêm dll.

Tôi giả định rằng bạn cũng có dll được tải trong quá trình tiêm dll vào quá trình đích và bạn muốn tạo một chuỗi từ xa trong quá trình đích và làm cho nó thực thi hàm đích trong quá trình đích.

Vì dll mà bạn đã tiêm có thể không được nạp tại cùng địa chỉ trong quá trình đích vì nó đang trong quá trình tiêm, bạn không thể sử dụng địa chỉ mà bạn nhận được từ gọi GetProcAddress trên hàm trong quá trình tiêm .

HMODULE chỉ là địa chỉ cơ sở của DLL (xem this answer để biết chi tiết). Vì vậy, bạn có thể lấy HMODULE của dll trong quá trình tiêm của bạn và trừ nó từ địa chỉ trả về bởi GetProcAddress về chức năng của bạn. Sau đó bạn có thể thêm HMODULE của dll được tiêm vào quá trình đích để bù đắp này để lấy địa chỉ của hàm đích trong dll được tiêm trong tiến trình đích. Giả sử hàm này có chữ ký chính xác, hãy chuyển nó làm hàm chuỗi cho cuộc gọi của bạn để tạo chuỗi từ xa và bạn hiện đang chạy hàm đích trong quá trình đích.

Tôi giải thích chi tiết hơn trong this answer.

+0

Cảm ơn. Tôi có một vấn đề khác. Khi tôi đang làm như thế này -> http://wklej.org/id/700802/ Tôi nhận được số tiền sai. Tôi có nên làm như thế -> http://wklej.org/id/700803/ ?? – Blood

+0

@Blood: Cả hai thứ đó đều không có ý nghĩa gì cả. Bạn đã thêm offset (để đi từ cơ sở đến hàm) nhưng quên trừ nó (để lấy base ở vị trí đầu tiên). Xem câu trả lời của tôi. Vì bạn phải làm cả hai, và họ hủy bỏ, bạn cũng có thể không bận tâm. –

+0

David, thời gian duy nhất nó hủy bỏ là nếu dll được nạp tại cùng một địa chỉ cơ sở trong cả hai quá trình. Nếu không câu trả lời của tôi hoạt động và bạn không :). –

4

Gọi GetProcAddress. Việc bù trừ hủy bỏ, như bạn phải thêm cả hai (để có được chức năng) và trừ nó (để có được địa chỉ cơ sở), vì vậy bạn có thể cũng không bận tâm.

1

Nó tương tự như void* được trả về bởi chức năng POSIX dlopen() (có thể eben là typedef - nhưng tôi không biết chắc chắn). Bạn chuyển nó tới số GetProcAddress làm đối số. Wen bạn đã làm xong bạn cũng chuyển nó đến FreeLibrary để dỡ bỏ DLL.

+0

typedef void * HANDLE; typedef HANDLE HMODULE; vì vậy HMODULE bị vô hiệu *. – quantum