最近学习了Inline hook,也就是常用的5字节跳转法
然后我采用该方法测试了一些API的hook都没有问题。
但是在对chrome的WSASend进行HOOK时,必然导致chrome崩溃,一开始怀疑这个hook的方法是否有问题,于是我自己写了一个调用了WSASend的网络程序,自己HOOK自己,经测试没有发生崩溃的现象。
而且经过调试,感觉不是多线程引起的问题。崩溃发生在代理函数里面对原始函数的调用,请高手帮忙分析下原因。另外不是特别想用detours,我还观察了wsockexpert这个抓包软件,同样也是5字节Inline hook,能够成功抓到chrome的包,不这个软件是否采用了detours。
下面贴上APIHOOK的源码,我封装成了一个类
CAPIHook::CAPIHook(LPCTSTR ModName, LPCSTR ProcName, PVOID pNewProc, UINT len)
{
m_Stub = NULL;
m_OrigProc = NULL;
m_CopyLen = 0;
if (len >= 5)
{
m_CopyLen = len;
HMODULE hMod = GetModuleHandle(ModName);
// if ModName isn't loaded, do nothing
if (hMod != NULL)
{
m_Stub = new BYTE[len + 5];
m_OrigProc = GetProcAddress(hMod, ProcName);
if (m_OrigProc != NULL)
{
DWORD dwOldProtect;
VirtualProtect(m_OrigProc, len, PAGE_EXECUTE_READWRITE, &dwOldProtect);
// 1.backup old instructions
CopyMemory(m_Stub, m_OrigProc, len);
*(m_Stub + len) = 0xE9; // jmp near
*(PUINT)(m_Stub + len + 1) = (UINT)((PBYTE)m_OrigProc - m_Stub - 5);
// 2.overwrite target procedure
*(PBYTE)m_OrigProc = 0xE9;
*(PUINT)((PBYTE)m_OrigProc + 1) = (UINT)pNewProc - (UINT)m_OrigProc - 5;
VirtualProtect(m_OrigProc, len, dwOldProtect, &dwOldProtect);
}
}
}
}
CAPIHook::~CAPIHook()
{
if (m_Stub != NULL)
{
if (m_CopyLen > 0)
{
if (m_OrigProc != NULL)
{
DWORD dwOldProtect;
VirtualProtect(m_OrigProc, m_CopyLen, PAGE_EXECUTE_READWRITE, &dwOldProtect);
CopyMemory(m_OrigProc, m_Stub, m_CopyLen);
VirtualProtect(m_OrigProc, m_CopyLen, dwOldProtect, &dwOldProtect);
}
if (m_Stub != NULL)
{
delete [] m_Stub;
}
}
m_Stub = NULL;
}
}
// 以下部分为m_stub备份的原函数的头5字节代码然后一个跳转
06A055A0 8B FF mov edi,edi ----->执行此句的时候出现访问非法
06A055A2 55 push ebp
06A055A3 8B EC mov ebp,esp
06A055A5 E9 55 13 02 6B jmp 71A268FF
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课