У меня есть функция для ввода dll, а второй параметр - char*
. Итак, я пытаюсь конвертировать мой полный путь к DLL (включая ваше имя + расширение), то есть CString
- char*
, но генерирует странные символы.CString to char * преобразование, генерирующее странные символы
Кто-то может мне помочь, пожалуйста?
Вот:
bool Inject(DWORD pId, char *dllName); // Signature of my dll inject method
CString szMyDllName = L"myDll.dll";
CString MyDllPath = L"";
void CSpecialLauncherDlg::OnBnClickedStartDebugging() {
wchar_t path[MAX_PATH] = {0};
GetModuleFileName(NULL, path, _MAX_PATH);
CString szPath = path;
int pos = szPath.ReverseFind('\\');
if (pos < 0)
pos = 1;
else
pos += 1;
MyDllPath = szPath.Left(pos);
MyDllPath.AppendFormat(szMyDllName);
}
void CSpecialLauncherDlg::DebuggerThreadProc() {
// Here is my conversion from CString to char*
char* pStr = CT2A(MyDllPath);
LPCTSTR pszCharacterString = CA2W(pStr);
AfxMessageBox(pszCharacterString);// Generating strange characters here
Inject(pi.dwProcessId, pStr); // Then, dll injection fails :-(
}
EDIT:
Dll впрыснуть метод ниже
bool Inject(DWORD pId, char *dllName)
{
EnableDebugPrivilege();
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, pId);
if(h)
{
LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
LPVOID dereercomp = VirtualAllocEx(h, NULL, strlen(dllName), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
WriteProcessMemory(h, dereercomp, dllName, strlen(dllName), NULL);
HANDLE asdc = CreateRemoteThread(h, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, 0, NULL);
WaitForSingleObject(asdc, INFINITE);
VirtualFreeEx(h, dereercomp, strlen(dllName), MEM_RELEASE);
CloseHandle(asdc);
CloseHandle(h);
return true;
}
return false;
}
Выполняет ли 'Inject (pi.dwProcessId, CT2A (MyDllPath)) работу? Некоторые из этих макросов генерируют анонимные временные значения, что означает, что вы не можете использовать указатель вне инструкции. – Bathsheba
Есть ли причина, по которой вы хотите использовать char * в отличие от wchar *? –
@RJProgrammer, да, потому что в методе инъекции в 'strlen (dllName)', 'strlen' требуется параметр' const char * '. PS: 'VirtualAllocEx'. – Saulo