0

我有一个用于注入的 DLL。这是通过 CBT-hook 注入的。现在,当通过 CBT 遇到所需的进程时,我已经用我自己的绕过了 WinAPI 的 ExtTextOutW。ExtTextOutW 的规范是:


BOOL ExtTextOutW(HDC         hdc,
                 INT         x,
                 INT         y,
                 UINT        flags,
                 const RECT* lprect,
                 LPCWSTR     str,
                 UINT        count,
                 const INT*  lpDx)

在我绕道的 ExtTextOutW 中,我试图使用以下代码将 str (LPCWSTR) 转换为多字节:


BOOL Mine_ExtTextOutW(HDC         hdc,
                      INT         x,
                      INT         y,
                      UINT        flags,
                      const RECT* lprect,
                      LPCWSTR     str,
                      UINT        count,
                      const INT*  lpDx)
{
        BOOL rv = Real_ExtTextOutW(hdc, x, y, flags, lprect, str, count, lpDx);

        HANDLE h = ::WindowFromDC(hdc);

        if (!h || !str)
                return ev;

        CHAR *buffer = (CHAR *)::LocalAlloc(count + 1);

        int l = ::WideCharToMultiByte(CP_APC, 0, str, count, buffer, count, NULL, NULL);

        if (l > -1) {
                buffer[l] = '\0';

                g_pClient->SendViaIPC(buffer);
        }

        ::LocalFree(buffer);

        return rv;
}

不幸的是,这不起作用。WideCharToMultiByte 挂起注入的进程。为什么?

4

2 回答 2

2

你的代码看起来有点奇怪,它可以编译吗?

LocalAlloc 应该有两个参数,你的意思是 CP_ACP。无论如何,我会:

  • 向 WideCharToMultiByte 询问正确的大小,以防您将来更改代码页。
  • 检查 > 0(失败由 0 表示,而不是 -1)
  • 使用 std 字符串只是为了确保您没有任何内存泄漏、异常等。

所以是这样的:

int nMultiByteSize = ::WideCharToMultiByte( CP_ACP, NULL, str, count, NULL, 0, NULL, NULL );
if ( nMultiByteSize > 0 )
{
    std:string strMulti;
    strMulti.resize( nMultiByteSize );

    if ( ::WideCharToMultiByte( CP_ACP, NULL, str, count, &strMulti[0], (int)strMulti.size(), NULL, NULL ) > 0)
    {
        g_pClient->SendViaIPC(strMulti.c_str());
    }
}
于 2009-09-06T16:34:36.013 回答
0

我不知道为什么它会挂起你的进程,它看起来对我来说应该可以正常工作。您确定是 WC2MB 调用导致它吗?一些可能性:

  1. 你为什么使用LocalAlloc?在堆栈上使用缓冲区还不够吗?
  2. 也许是挂着的“SendViaIPC”?
  3. 您要转换的字符串有多大?也许缓冲区大小不足?

WC2MB 的返回值是多少?如果不成功,该函数返回 0。

LocalAlloc 的返回值是多少?也许分配返回 null 表示分配内存失败?然后,您将为缓冲区传递 NULL,但为计数传递大于 0 的某个数字可能会导致崩溃。

于 2009-09-04T09:09:46.260 回答