C++ DLL 注入(inject) : path with special characters

标签 c++ qt dll code-injection

我正在尝试解决这种情况。 我有 win32 程序,等待特定进程“Example.exe”启动,然后程序将“my.dll”注入(inject)进程“Example.exe”

它工作正常,直到用户在具有特定但允许字符的文件夹下安装程序,例如在我的国家默认文件夹名称是“Nová složka”(新文件夹)

我尝试使用相对路径

"//my.dll"
"/my.dll"
"\\my.dll"
"\my.dll"

不成功......我也尝试了不同的方法将字符串(QString)转换为字符数组。

在 Qt 5.1.1 中开发

这是程序查找.dll路径的代码

QString actualPath(QDir::currentPath() + "/my.dll");
ui->lblDebug->setText(actualPath);
const char* myChar = QString(actualPath.toUtf8()).toStdString().c_str();
QString q = QString::fromStdString(myChar);
ui->lblDebug->setText(q);

这里是注入(inject)部分

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PE32.th32ProcessID);
hModule = (LPVOID)VirtualAllocEx(hProcess, NULL, 512, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, hModule, (LPVOID)myChar, 512, NULL);
CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"kernel32"), "LoadLibraryA"), hModule, NULL, NULL);
CloseHandle(hProcess);
CloseHandle(hSnapshot);
qDebug() << "INJECT:DONE!";
return true; ExitProcess(0);
break;

您有什么想法,如何以正确的字符传递给函数 WriteProcessMemory 正确的路径?谢谢。

最佳答案

您正在使用 LoadLibrary 的 ANSI 版本。然后您应该使用本地 8 位编码,不是 UTF-8。您为获得路径的 ANSI 版本而经历的旋转是不必要的。您也不应该使用固定的缓冲区大小。

QString const actualPath(QDir::currentPath() + "/my.dll");
// This byte array must exist until the `WriteProcessMemory` call.
QByteArray const path = actualPath.toLocal8Bit();
int const bufLen = path.size() + 1;

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PE32.th32ProcessID);
hModule = VirtualAllocEx(hProcess, NULL, bufLen, 
                         MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, hModule, (LPVOID)path.constData(), bufLen, NULL);
CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)
  GetProcAddress(GetModuleHandle(L"kernel32"), "LoadLibraryA"),
  hModule, NULL, NULL);
CloseHandle(hProcess);

不过,您真正应该做的是将 UCS-2 编码与 LoadLibraryW 一起使用:

QString const path(QDir::currentPath() + "/my.dll");
int const bufLen = (path.length()+1) * 2;

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PE32.th32ProcessID);
hModule = VirtualAllocEx(hProcess, NULL, bufLen,
                         MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, hModule, (LPVOID)path.constData(), bufLen, NULL);
CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)
  GetProcAddress(GetModuleHandle(L"kernel32"), "LoadLibraryW"),
  hModule, NULL, NULL);
CloseHandle(hProcess);

关于C++ DLL 注入(inject) : path with special characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22617809/

相关文章:

c++ - 在 NetBeans 中编译基于 Qt 的 C++ 代码时出错

c++ - 为 QMaps 格式化 qDebug 的输出

c - Excel 加载项 : Assignment in for loop causes segmentation fault but line-by-line assignments work. 为什么?

mysql - Perl MYSQL 错误 : libmysql. dll

python - Python ctypes 的数组输出?

c++ - constexpr 在变量声明中的位置

c++ - 使用 C++ 在 Qt 脚本中进行异常处理?

c++ - 注入(inject)的 DLL 中的异常是否会导致整个程序崩溃?

c++ - constexpr 的运行时错误

c++ - VST 音频输入值与 Matlab 中完全不同