- UID
- 65321
注册时间2010-2-1
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 怒 2021-3-15 02:34 |
---|
签到天数: 347 天 [LV.8]以坛为家I
|
采用模拟API函数拦截,进行HOOK
typedef struct _NTHook{
FARPROC hAddr;
BYTE dwOldValue[5];
BYTE dwNewValue[5];
} NTHook,*PNTHook;
DWORD dwProtect,dwWriteByte,dwReadByte;
NTHook hNt;
BOOL IsHook;
BYTE HWID[]={0x6E, 0x74, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x49, 0x00, 0x08,
0x02, 0x00, 0x7A, 0x06, 0x01, 0x00, 0x00, 0x26, 0x55, 0x3F,
0xDB, 0x1A}; 自定的HWID
void RWHOOK(PNTHook hNt,DWORD hProc)
{
//记录原指令指向
ReadProcessMemory(GetCurrentProcess(), (LPVOID)hNt->hAddr, (LPVOID)hNt->dwOldValue, 5, &dwReadByte);
VirtualProtect ( (LPVOID)hNt->hAddr, 5, PAGE_READWRITE, &dwProtect );
hNt->dwNewValue[0]=0xE9;
//计算patch函数的地址指令,计算方法:指向地址-EIP-5
*((PDWORD)(&(hNt->dwNewValue[1])))=hProc-DWORD(hNt->hAddr)-5;
//修改JMP指向到patch代码
WriteProcessMemory( GetCurrentProcess(), (LPVOID)hNt->hAddr, (LPVOID)hNt->dwNewValue, 5, &dwWriteByte ) ;
}
//patch HWID过程函数
__declspec(naked) void NewProc()
{
_asm
{
pushad //保留现场
mov edi,edx //让EDI指向到HWID( 取得OD分析中的HWID数据地址)
lea esi,HWID // 让ESI指向到我们的自定的HWID
mov ecx,16H //定义要patch的字节数
rep movsb //patch HWID
}
//恢复原指令修正指向
WriteProcessMemory( GetCurrentProcess(), (LPVOID)hNt.hAddr, (LPVOID)hNt.dwOldValue, 5, &dwWriteByte ) ;
IsHook=FALSE;
_asm
{
popad //恢复现场
jmp hNt.hAddr
}
}
void Hook()
{
//OD分析中关键地址,在这修改指向到patch代码
hNt.hAddr=(FARPROC)0x004C44E8;
if (IsHook==FALSE)
{
RWHOOK(&hNt,(DWORD)NewProc);
IsHook=TRUE;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
// 要HOOK的函数
ALCDECL AheadLib_GetAdaptersInfo(void)
{
Hook(); 调用HOOK过程
GetAddress("GetAdaptersInfo"); 获取原来API的地址,返回到EAX
__asm JMP EAX;
}
///////////////////////////////////////////////////////////////////////////////////////////// |
|