?? thunk.h
字號:
/*
Copyright 2006 - 2008
ZhangLuduo <zhangluduo@msn.com>
All Rights Reserved.
thunk - 動態(tài)替換CPU指令
利用這個類可以將Windows API的回調(diào)函數(shù)封裝
成C++類成員.這份代碼只能在x86的CPU上執(zhí)行.
作者 - 張魯奪(zhangluduo)
MSN - zhangluduo@msn.com
QQ群 - 34064264
為所有愛我的人和我愛的人努力!
*/
#ifndef _THUNK_H
#define _THUNK_H
#ifndef _UNION_CAST
#define _UNION_CAST
template <class ToType, class FromType>
ToType union_cast (FromType f)
{
union
{
FromType _f;
ToType _t;
} ut;
ut._f = f;
return ut._t;
}
#endif
class Thunk
{
private:
// unsigned char m_ThiscallCode[10];
// unsigned char m_StdcallCode [16];
#pragma pack(push, 1)
typedef struct _THUNK_THISCALL
{
unsigned char Mov; // 0xB9
unsigned long This; // this pointer
unsigned char Jmp; // 0xE9
unsigned long Adrr; // target address
} THUNK_THISCALL, *PTHUNK_THISCALL;
typedef struct _THUNK_STDCALL
{
unsigned char Push[3]; // push dword ptr [esp] ;
unsigned long Move; // mov dword ptr [esp + 4], ?? ?? ?? ?? ;
unsigned long This; // this pointer
unsigned char Jmp; // 0xE9
unsigned long Adrr; // target address
} THUNK_STDCALL, *PTHUNK_STDCALL;
#pragma pack(pop)
THUNK_THISCALL m_THISCALL;
THUNK_STDCALL m_STDCALL;
public:
template <typename T> static unsigned long GetMemberFxnAddr(T MemberFxnName)
{
return union_cast<unsigned long>(MemberFxnName);
}
void* Thiscall(void* pThis, unsigned long MemberFxnAddr);
void* Stdcall (void* pThis, unsigned long MemberFxnAddr);
};
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -