| 
注册时间2010-2-1
阅读权限30
最后登录1970-1-1UID65321 龙战于野 
 
 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;
 }
 /////////////////////////////////////////////////////////////////////////////////////////////
 | 
 |