2012-01-24 20 views
5

Thông tin giới thiệu: Windows 7 64 bit. C++. Ứng dụng 64 bit và DLL. Hooking mà không có MS Detours.API Hooking không có Đường vòng

Câu hỏi: Tôi đã gặp khó khăn về vấn đề nhận ví dụ đang hoạt động thể hiện sự hooking trong Windows. Hầu hết các tuts ra dường như đã được viết trong một thời gian mà Windows XP 32-bit là hệ điều hành duy nhất ... Tôi đã vượt qua những trở ngại 64-bit của sự hiểu biết và tiêm một DLL thành công. Bước tiếp theo của tôi trong hành trình tri thức này là hooking. Để phù hợp với nỗi nhớ của chủ đề, Đường vòng của MS không hỗ trợ 64-bit (miễn phí) và tôi chắc chắn không trả $ 10,000 cho bất cứ thứ gì. Vì vậy, tôi theo đuổi các phương pháp thông thường trong this tutorial.

tut này là tuyệt vời, nhưng tôi đang gặp một chút rắc rối hiểu phân khúc này:

void BeginRedirect(LPVOID newFunction) 
{ 
    BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3}; 
    memcpy(JMP, tempJMP, SIZE); 
    DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, 
       PAGE_EXECUTE_READWRITE, &oldProtect); 
    memcpy(oldBytes, pOrigMBAddress, SIZE); 
    memcpy(&JMP[1], &JMPSize, 4); 
    memcpy(pOrigMBAddress, JMP, SIZE); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL); 
} 

Đặc biệt, tôi đang phải vật lộn với các byte tempJMP và tất cả các memcpy xảy ra. Tôi có một địa chỉ cho hàm InsertDate() của Notepad mà tôi muốn chiếm quyền điều khiển, nhưng tôi không chắc phải nhắm đến đâu ... Đây có phải là địa chỉ của hàm mới không? Hay nó không tương đối? Idk, tôi chỉ tìm kiếm một số gợi ý.

Trả lời

1

Toàn bộ ý tưởng là để "ghi đè" mã ban đầu mà thực hiện MessageBox để:

JuMP <CustomMessageBoxFunction> 
RETurn (back to program execution) 

Vì vậy,

Đầu tiên ông bản shellcode của mình để mảng JMP:

memcpy(JMP, tempJMP, SIZE); 

Sau đó, anh ta sao chép byte mã assembly ban đầu từ địa chỉ gốc sang lưu trữ tạm thời của nó "oldBytes" để anh ta có thể sao chép nó trở lại sau khi chức năng tùy chỉnh của mình được thực thi:

memcpy(oldBytes, pOrigMBAddress, SIZE); 

Sau đó, ông bản sao kích thước địa chỉ trước đây ông tính toán để mảng JMP ngay sau khi lệnh jmp:

memcpy(&JMP[1], &JMPSize, 4); 

Cuối cùng JMP [] mảng của ông chứa shellcode cần thiết để gọi chức năng của mình, ví dụ

JMP 1234 
RET 

vì vậy bây giờ anh có để sao chép rằng trong byte gốc nơi chương trình hy vọng sẽ tìm thấy hàm MessageBox gốc:

memcpy(pOrigMBAddress, JMP, SIZE); 

Bây giờ đến câu hỏi của bạn, nếu bạn muốn treo InsertDate() sau đó thay vì sử dụng pOrigMBAddress bạn có thể sử dụng địa chỉ của InsertDate.

Nhưng tôi không chắc chắn điều này sẽ làm việc với các cửa sổ 64bit.

2

Chức năng Hotpatchable bắt đầu với lệnh sau mov edi, edi và đứng trước 5 hướng dẫn NOP (đoạn mã nếu tôi nhớ chính xác).

Khi hotpatching, mov edi, edi được ghi đè bằng một bước nhảy ngắn vào hang mã. Hang mã cũng được viết lại bằng cách nhảy tới trình xử lý hook của bạn (hàm mà bạn chặn cuộc gọi API rồi chuyển tiếp nó tới hàm API thực).

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