MS Detours库,绕行非win api函数

Posted

技术标签:

【中文标题】MS Detours库,绕行非win api函数【英文标题】:MS Detours Library, detouring non win api function 【发布时间】:2011-01-07 22:43:40 【问题描述】:

我想使用windows detours库来绕过一个非win api函数。该函数是 Qt 库 (QtGui4.dll) 的一部分。我想知道如何设置函数签名:

void QPainter::drawText ( const QPointF & position, const QString & text )

我对此进行了尝试,它收到了我通常的错误,对需求的一些解释也会很有趣:

void (QPainter * real_drawText)(const QPointF & position, const QString & text) = drawText

这是它们在 Windows API 下 TextOut 的样子:

BOOL (WINAPI * Real_TextOut)(HDC a0, int a1, int a2, LPCWSTR a3, int a4) = TextOutW;
BOOL WINAPI Mine_TextOut(HDC hdc,int X,int Y,LPCWSTR text,int textLen)

BOOL rv = Real_TextOut(hdc, X, Y, text, textLen);

HWND hWindow = WindowFromDC(hdc);

SendTextMessage(hWindow, text);

return rv;

所以,我尝试了 Gene 的建议:

typedef void (QPainter::* Real_qp_drawText)(const QPointF & position, const QString & text);

void Mine_drawText(const QPointF & position, const QString & text)


    Real_qp_drawText(position,text);


但是得到了错误,'a function-style conversion to an built-in type can only take one parameter.

所以不管怎样,他们都说有点当众羞辱对灵魂有好处,我的灵魂一定是度过了最美好的时光......

谢谢。

【问题讨论】:

【参考方案1】:

你的函数类型是 FnType:

typedef void (QPainter::*FnType)(const QPointF &, const QString &);

但看起来他们期望的是 WINIAPI = __stdcall C 函数。您可能会想是否可以将您的函数包装成 C 函数。

【讨论】:

对不起,吉恩,这对我来说是全新的,所以我想问一下,我该怎么做?【参考方案2】:

请记住,非静态成员函数确实有一个隐式的this 指针作为参数,您必须在绕行时声明它。

【讨论】:

以上是关于MS Detours库,绕行非win api函数的主要内容,如果未能解决你的问题,请参考以下文章

Detours - 挂钩类成员函数 - 设置目标函数偏移的语法?

Linux Ubuntu下的绕行功能

C++——Detours(Win32 API劫持)——劫持类方法

C++——Detours(Win32 API劫持)——劫持类方法

运用Detours库hook API(原理是改写函数的头5个字节)

MS Detours 2.1 - 出栈