我已将我的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);
}
那么,有人可以向我指出我做错了什么吗?
答案 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);
}
}