我正在尝试使用 MSDN Detours 3.0 绕道来注册ExtTextOut()从第三方软件绘制的文本。我创建了一个 DLL,将其注入目标软件。当我绕过 ExtTextOut 时,我尝试复制发送到该方法的字符串并将文本读取到修改格式的文本文件中。由于输入字符串是 UTF-16 并且我只对保持 ASCII 字符低于 127 感兴趣,我为此做了一些逻辑。
但是,问题是我的程序在注入目标后会崩溃一段时间。我怀疑它可能与malloc 函数有关。
如果我使用 malloc 在进程中定位内存,我可以保证这不会覆盖目标进程中的任何内存吗?如果是这种情况,我如何创建一个函数来确保我的 malloc 不会干扰目标进程。
编码:
BOOL WINAPI Mine_ExtTextOut(HDC hdc, int X, int Y, UINT options, RECT* lprc, LPCWSTR text, UINT cbCount, INT* lpSpacingValues)
{
//
if(reinterpret_cast<const char*>(text)[0] == '>'){
//wstring_convert<codecvt_utf8_utf16<wchar_t>,wchar_t> convert;
//string utf8_string = convert.to_bytes(text);
//int n = utf8_string.length();
int n = cbCount;
char *buffer = (char*) malloc (n+1);
char *bufferCopy = (char*) malloc (n+1);
for (int i=0; i<n; i++){
if((long) text[i] > 127){
buffer[i] = ' ';
continue;
}
buffer[i]= (char) text[i];
}
buffer[n]='\0';
bool wasBlank = false;
int ix = 0;
for(int i = 0; i<n; ++i){
if(buffer[i] == ' '){
if(wasBlank || i < 2) continue;
bufferCopy[ix++] = buffer[i];
wasBlank = true;
continue;
}
wasBlank = false;
if(buffer[i] == '>') continue;
bufferCopy[ix++] = buffer[i];
}
bufferCopy[ix]='\0';
ofstream myFile;
myFile.open("C:\\temp\\textHooking\\textHook\\example2.txt", ios::app);
if(buffer[0] == '>'){
//myFile.write(reinterpret_cast<const char*>(text), cbCount*sizeof(*text));
myFile.write(bufferCopy, ix*sizeof(*bufferCopy));
myFile << endl;
}
free(buffer);
free(bufferCopy);
}
BOOL rv = Real_ExtTextOut(hdc, X, Y, options, lprc, text, cbCount, lpSpacingValues);
return rv;
}