Tôi quan tâm đến hooking và tôi quyết định xem tôi có thể móc một số chức năng. Tôi không thích sử dụng thư viện như đường vòng vì tôi muốn có kinh nghiệm tự làm nó. Với một số nguồn tôi tìm thấy trên internet, tôi đã có thể tạo mã bên dưới. Đó là cơ bản, nhưng nó hoạt động ổn. Tuy nhiên khi hooking chức năng được gọi là bởi nhiều chủ đề nó chứng minh là cực kỳ không ổn định. Nếu hai cuộc gọi được thực hiện gần như cùng một lúc, nó sẽ sụp đổ. Sau một số nghiên cứu, tôi nghĩ rằng tôi cần phải tạo ra một chức năng trampoline. Sau khi tìm kiếm tất cả các giờ, tôi đã không thể tìm thấy bất cứ điều gì khác mà một mô tả chung về những gì một tấm bạt lò xo được. Tôi không thể tìm thấy bất cứ điều gì đặc biệt về cách viết một chức năng trampoline, hoặc làm thế nào họ thực sự làm việc. Nếu bất kỳ ai có thể giúp tôi viết một bài, đăng một số nguồn, hoặc ít nhất là chỉ cho tôi đúng hướng bằng cách giới thiệu một số bài viết, trang web, sách, v.v. Tôi rất cảm kích nó.Làm thế nào để tạo ra một chức năng trampoline cho móc
Dưới đây là mã tôi đã viết. Nó thực sự cơ bản nhưng tôi hy vọng những người khác có thể học hỏi từ nó.
test.cpp
#include "stdafx.h"
Hook hook;
typedef int (WINAPI *tMessageBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
DWORD hMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
hook.removeHook();
tMessageBox oMessageBox = (tMessageBox)hook.funcPtr;
int ret =oMessageBox(hWnd, lpText, "Hooked!", uType);
hook.applyHook(&hMessageBox);
return ret;
}
void hookMessageBox()
{
printf("Hooking MessageBox...\n");
if(hook.findFunc("User32.dll", "MessageBoxA"))
{
if(hook.applyHook(&hMessageBox))
{
printf("hook applied! \n\n");
} else printf("hook could not be applied\n");
}
}
hook.cpp
#include "stdafx.h"
bool Hook::findFunc(char* libName, char* funcName)
{
Hook::funcPtr = (void*)GetProcAddress(GetModuleHandleA(libName), funcName);
return (Hook::funcPtr != NULL);
}
bool Hook::removeHook()
{
DWORD dwProtect;
if(VirtualProtect(Hook::funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect))
{
WriteProcessMemory(GetCurrentProcess(), (LPVOID)Hook::funcPtr, Hook::origData, 6, 0);
VirtualProtect(Hook::funcPtr, 6, dwProtect, NULL);
return true;
} else return false;
}
bool Hook::reapplyHook()
{
DWORD dwProtect;
if(VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect))
{
WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::hookData, 6, 0);
VirtualProtect(funcPtr, 6, dwProtect, NULL);
return true;
} else return false;
}
bool Hook::applyHook(void* hook)
{
return setHookAtAddress(Hook::funcPtr, hook);
}
bool Hook::setHookAtAddress(void* funcPtr, void* hook)
{
Hook::funcPtr = funcPtr;
BYTE jmp[6] = { 0xE9, //jmp
0x00, 0x00, 0x00, 0x00, //address
0xC3 //retn
};
DWORD dwProtect;
if(VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect)) // make memory writable
{
ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::origData, 6, 0); // save old data
DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5); //((to)-(from)-5)
memcpy(&jmp[1], &offset, 4); // write address into jmp
memcpy(Hook::hookData, jmp, 6); // save hook data
WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, jmp, 6, 0); // write jmp
VirtualProtect(funcPtr, 6, dwProtect, NULL); // reprotect
return true;
} else return false;
}
Tôi sẽ đăng liên kết tới GD, nhưng tôi vừa nhận thấy bạn cũng là thành viên ở đó. Bạn đã thử sử dụng chức năng tìm kiếm của họ chưa? Nó đi kèm với tấn ví dụ :) –
Bạn có thể kiểm tra mã của EasyHook, tôi tin rằng đó là mã nguồn mở. Ngoài ra còn có rất nhiều ví dụ khác xung quanh. Nếu bạn dự định sử dụng ứng dụng này trong một ứng dụng được triển khai, tôi khuyên bạn nên sử dụng thư viện (như EasyHook) có thể xử lý đệ quy trên móc/tấm bạt lò xo, luồng và một số nội dung thú vị. – ssube
@Tom Knapen Tôi đã tìm kiếm GD, MPGH và một vài trang web khác trước khi đăng. Tìm kiếm 'tấm bạt lò xo' trên GD trả lại một số bài đăng có liên quan đến một chút nhưng không phải những gì tôi đang tìm kiếm. – Stratus