我正在尝试解决这种情况。 我有 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/