一段HOOK API 实现patch HWID 程序框架
采用模拟API函数拦截,进行HOOKtypedef struct _NTHook{
FARPROC hAddr;
BYTE dwOldValue;
BYTE dwNewValue;
} NTHook,*PNTHook;
DWORD dwProtect,dwWriteByte,dwReadByte;
NTHookhNt;
BOOLIsHook;
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=0xE9;
//计算patch函数的地址指令,计算方法:指向地址-EIP-5
*((PDWORD)(&(hNt->dwNewValue)))=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;
}
///////////////////////////////////////////////////////////////////////////////////////////// 很好的框架,学习了 Np1.7的替换机器码? 不错看看 楼主幸苦了
嗯看看怎么样,
页:
[1]