注入/挂钩目标应用程序崩溃

时间:2010-07-01 21:18:24

标签: c++ winapi gdi

我已将我的DLL注入到目标应用程序中,我已经连接了几个WINAPI函数 同样。其中一个是DrawTextExW。我正在尝试将所有'l'字母替换为'!'之前 它打印出来。我的解决方案工作正常几秒钟,但然后目标应用程序崩溃。我真的不明白为什么。

这是功能:

编辑 - 工作解决方案:

int WINAPI DetouredDrawTextExW(__in    HDC hdc,
                               __inout LPWSTR lpchText,
                               __in    int cchText,
                               __inout LPRECT lprc,
                               __in    UINT dwDTFormat,
                               __in    LPDRAWTEXTPARAMS lpDTParams)
{
    std::wstring s_wc(lpchText, cchText);

    std::replace(s_wc.begin(), s_wc.end(), L'l', L'!');

    return ::DrawTextExW(hdc, const_cast<wchar_t *>(s_wc.c_str()), 
        s_wc.length(), lprc, dwDTFormat, lpDTParams);
}

那么,有人可以向我指出我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

我看到你忽略了cchText,你是否会收到一个非NULL终止的字符串,其中cchText为正值,导致读取超出字符串结尾的无效内存?但是,在s_wc的构造函数中,该错误将作为Win32异常出现。

此外,您未在DT_MODIFYSTRING参数中检查dwDTFormat。如果该标志存在,那么:: DrawTextExW()可能会覆盖无效的内存。这将在:: DrawTextExW()中显示为Win32异常,或者可能在s_wc析构函数中显示为C ++异常。

修改

以下是我认为遵守::DrawTextExW()

合同的未编译未经测试代码
int WINAPI DetouredDrawTextExW(__in    HDC hdc,
                               __inout LPWSTR lpchText,
                               __in    int cchText,
                               __inout LPRECT lprc,
                               __in    UINT dwDTFormat,
                               __in    LPDRAWTEXTPARAMS lpDTParams)
{
    std::vector<wchar_t> v_wc;
    int strSize = cchText == -1 ? wcslen(lpchText) : cchText;
    v_wc.resize(strSize + 4);
    std::copy(lpchText, lpchText + strSize, &v_wc.front());
    std::replace(v_wc.begin(), v_wc.end() - 4, L'l', L'!');

    int result = ::DrawTextExW(hdc, &v_wc.front(), 
        strSize, lprc, dwDTFormat, lpDTParams);
    if (dwDTFormat & DT_MODIFYSTRING)
    {
      std::copy(&v_wc.front(), &v_wc.front() + v_wc.size(), lpchText);
    }
}