为啥尝试绕行winapi时进程崩溃?

Posted

技术标签:

【中文标题】为啥尝试绕行winapi时进程崩溃?【英文标题】:Why is the process crashing when attempting to detour a winapi?为什么尝试绕行winapi时进程崩溃? 【发布时间】:2016-08-06 16:11:39 【问题描述】:

我正在尝试使用MS detours,我不知道我是否做错了什么;我似乎找不到我的问题的答案。

我曾尝试使用注入的 DLL 在一个进程中绕过几个函数,但每次尝试都会导致进程崩溃。

我尝试挂钩的功能之一是 winapi DirectDrawCreate:

DetourTransactionBegin();
DetourUpdateThread( GetCurrentThread() );
DetourAttach( (PVOID *)DirectDrawCreate, hkDirectDrawCreate );
DetourTransactionCommit();

hkDirectDrawCreate 定义为:

HRESULT __stdcall hkDirectDrawCreate( GUID *p1, LPDIRECTDRAW *p2, IUnknown *p3 )

    if( !pDDC )
        return 0x00;

    printf( "A call to hkDirectDrawCreate was made\n" );

    return DirectDrawCreate( p1, p2, p3 );

在调用 DetourAttach 时,进程崩溃;堆栈跟踪是:

myProj.dll!detour_skip_jmp(unsigned char * pbCode, void * * ppGlobals) Line 135 C++
myProj.dll!DetourCodeFromPointer(void * pPointer, void * * ppGlobals) Line 984  C++
myProj.dll!DetourAttachEx(void * * ppPointer, void * pDetour, _DETOUR_TRAMPOLINE * * ppRealTrampoline, void * * ppRealTarget, void * * ppRealDetour) Line 1456  C++
myProj.dll!DetourAttach(void * * ppPointer, void * pDetour) Line 1395   C++

代码在“0x68B028BD”处的“detour_skip_jmp”中断:

// First, skip over the import vector if there is one.
    if (pbCode[0] == 0xff && pbCode[1] == 0x25)    // jmp [imm32]
68B028B2  mov         ecx,1  
68B028B7  imul        edx,ecx,0  
68B028BA  mov         eax,dword ptr [pbCode]  
68B028BD  movzx       ecx,byte ptr [eax+edx]  
68B028C1  cmp         ecx,0FFh  
68B028C7  jne         detour_skip_jmp+82h (68B02912h)  
68B028C9  mov         edx,1  
68B028CE  shl         edx,0  
68B028D1  mov         eax,dword ptr [pbCode]  
68B028D4  movzx       ecx,byte ptr [eax+edx]  
68B028D8  cmp         ecx,25h  
68B028DB  jne         detour_skip_jmp+82h (68B02912h) 

编辑:ppGlobals 为 NULL,pbCode 给出错误 'Error reading characters of string'

回到 DetourCodeFromPointer ppGlobals 那里也是 NULL,但我想它应该是;这是电话:

 pDetour = DetourCodeFromPointer(pDetour, NULL);

【问题讨论】:

【参考方案1】:

毫无疑问,导入表已被移动或清理为一种反挂钩技术。只需在 DirectDrawCreate 的开头添加一个跳转到您的 hkDirectDrawCreate,然后在调用原始跳转回 DirectDrawCreate 时,但请确保它是在您跳转到您的钩子之后,否则您会陷入无限的递归循环。

【讨论】:

以上是关于为啥尝试绕行winapi时进程崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

MS Detours库,绕行非win api函数

如何获取具有可见窗口的任何进程的名称 - WinAPI?

使用 WinAPI 找出锁定文件的原因

为啥我使用 WinAPI C++ 录制的声音无法正常播放?

Heisenbug:WinApi 程序在某些计算机上崩溃

winapi为啥/如何反转消息的顺序?