首页
社区
课程
招聘
[求助]inline hook导致Chrome崩溃
发表于: 2013-4-25 17:30 5435

[求助]inline hook导致Chrome崩溃

2013-4-25 17:30
5435
最近学习了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直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 12
活跃值: (773)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Hook_WSASend直接调用系统的WSASend也crash?
2013-4-26 12:46
0
雪    币: 365
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
问题已解决,备份的头5bytes是在堆里面,该空间不具有可执行权限,这个只针对chrome,在我的机器上chrome也没有被DEP保护,不知chrome是搞了个什么办法。
2013-4-26 14:22
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
4
DEP是可以主动用API开启的,具体是怎么写忘记了,外事google内事baidu...
2013-4-26 14:47
0
雪    币: 365
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
chrome的确动态开启了dep,具体代码在dep.cc,有兴趣的可以去瞧瞧
2013-4-26 15:23
0
游客
登录 | 注册 方可回帖
返回
//