使用 Microsoft Detours 时访问冲突

Posted

技术标签:

【中文标题】使用 Microsoft Detours 时访问冲突【英文标题】:Access violation when using Microsoft Detours 【发布时间】:2015-12-12 21:49:05 【问题描述】:

我在使用 Microsoft Detours 时遇到访问冲突问题。我制作了一个加载到第三方应用程序中的 dll。我正在使用 Detours 对 Ida Pro 显示为的未记录函数制作蹦床函数:

void __thiscall sub_6142E0(int a2, int a3)

我的代码如下所示: #include “stdafx.h” #包括 #包括

typedef void(__stdcall* pFunc)(int d1, int d2);
pFunc FuncToDetour = (pFunc)(0x6142EC);

void MyFunc(int d1, int d2)//Function does not mach call convension __thiscall. Possible problem?

    printf("a2 %i, a1 %i);\n", d1, d2);
    FuncToDetour(d1, d2);


void Init()

    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)FuncToDetour, MyFunc);
    DetourTransactionCommit();

我要截取的函数原来的汇编是这样的:

sub_6142E0 proc near

arg_0= dword ptr  8
arg_4= dword ptr  0Ch

push    ebp
mov     ebp, esp
mov     eax, [ecx+8]
mov     ecx, [ebp+arg_4]
mov     edx, [ebp+arg_0]

Detours 所做的改动会导致:

.text:006142EC jmp     near ptr unk_F9C6802
...
d3d9.dll:0F9C6802 jmp     near ptr unk_F9D5FE0 //jump to function in my dll
...
void MyFunc(int d1, int d2)//my function

    printf("updateHealth(%i, %i);\n", d1, d2);

...
Stack[00004A8C]:0019FB4C sub     ah, bh
Stack[00004A8C]:0019FB4E sbb     [eax], eax //eax=0x491B -> access violation
Stack[00004A8C]:0019FB50 cmc
Stack[00004A8C]:0019FB51 inc     si
Stack[00004A8C]:0019FB53 add     [eax], dl
Stack[00004A8C]:0019FB55 add     [eax], eax
Stack[00004A8C]:0019FB57 add     [eax+80019FDh], cl
Stack[00004A8C]:0019FB5D add     byte_19FC6415[eax], dh
Stack[00004A8C]:0019FB5D ; -------------------------------------------------

我得到的错误信息是:

The instruction 0x19FB4E referenced memory at 0x491B. The memory could not be written -> 0000491B (exc.code c0000005, tid 19084)

【问题讨论】:

【参考方案1】:

我将尝试回答我自己的问题。

这归结为两个函数之间的调用约定不匹配。我要挂钩的函数是使用__thiscall,而我的函数是使用__cdecl(默认调用约定)。 __thiscall 用作类中成员函数的调用约定,其中在调用成员函数时将“this 指针”传递到 ecx 寄存器中。

在我的情况下,ecx 是在调用 MyFunc 以设置堆栈帧时写入的(我认为)。当我从我的蹦床函数中调用它时,我挂钩的函数将得到一个无效的 this 指针。

查看link,了解如何正确执行此操作的一些解释和示例。

【讨论】:

以上是关于使用 Microsoft Detours 时访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

构建 32 位 Detours 库

Microsoft Detours 如何工作以及如何使用它来获取堆栈跟踪?

可以使用 Microsoft Detours 来挂钩系统范围的调用而不注入每个 proc 吗?

Microsoft Detours 2.1简介

C/C++ Detours 库 - 在哪里可以找到?

Detours简介 (拦截x86机器上的任意的win32 API函数)