在網(wǎng)上查了一些資料,做了一個Thunk模板,能夠正確調(diào)用成員函數(shù)。但是在做取成員函數(shù)地址操作時比較麻煩,需要用到匯編。 //取成員函數(shù)地址 DWORD_PTR off = 0; _asm { mov eax, Class::MemFunc mov DWORD PTR [off], eax } 每指定一個成員函數(shù)作為一個回調(diào)函數(shù)就要做如上操作。本想將Class和MemFunc作為兩個參數(shù)定義一個宏包含匯編語言部分, 但不知道怎樣編寫匯編部分。如果有知道怎么編寫的,希望能不吝賜教^_^ // Thunk 具體實現(xiàn) #pragma pack( push, 1 ) struct Thunk_struct { BYTE op_movecx; // as operation "mov" in asm DWORD_PTR val_ecx; BYTE op_call; // as operation "jmp" in asm DWORD_PTR val_address; }; #pragma pack( pop ) template < class TCallback, class TClass > class Thunk { public: TCallback MemFuncToCallback( TClass* pObject, DWORD_PTR pMemFuncAddress ) { // 0xB9是“mov ecx, 數(shù)值”的機器碼 m_thunk.op_movecx = 0xB9; // 將對象指針pObject賦值給ecx m_thunk.val_ecx = (DWORD_PTR)pObject; // 0xE9是“jmp 相對地址”的機器碼 m_thunk.op_call = 0xE9; // 利用成員函數(shù)的具體地址pMemFuncAddress計算jmp的相對地址 m_thunk.val_address = pMemFuncAddress - ((DWORD_PTR)(&m_thunk.val_address) + sizeof(DWORD_PTR)); |
|
來自: SamBookshelf > 《Hook》