@armadillo-cld

Не получается внедрить dll в процесс?

Всем привет.
Есть такой код инжекта длл в процесс
HANDLE h_process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

	char fullDLLPath[_MAX_PATH];
	GetFullPathNameA(file_name.c_str(), _MAX_PATH, fullDLLPath, NULL);

	LPVOID DLLPath_addr = VirtualAllocEx(h_process, NULL, _MAX_PATH,
		MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
	WriteProcessMemory(h_process, DLLPath_addr, fullDLLPath,
		strlen(fullDLLPath), NULL);

	LPVOID LoadLib_addr = GetProcAddress(GetModuleHandleA("Kernel32"),
		"LoadLibraryA");

	HANDLE h_rThread = CreateRemoteThread(h_process, NULL, 0,(LPTHREAD_START_ROUTINE)LoadLib_addr, DLLPath_addr, 0, NULL);

	WaitForSingleObject(h_rThread, INFINITE);

	DWORD exit_code;
	GetExitCodeThread(h_rThread, &exit_code);                                         
	CloseHandle(h_rThread);
	VirtualFreeEx(h_process, DLLPath_addr, 0, MEM_RELEASE);
	CloseHandle(h_process);

	return (HANDLE)exit_code;

Но когда я вызываю её вот так:
di.inject_DLL("module.dll", di.GetPID("winhex.exe"));

P.S. Это класс. Вот ещё функция GetPID
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(PROCESSENTRY32);
	if (hSnap) {
		if (Process32First(hSnap, &pe32)) {
			if (strcmp(pe32.szExeFile, processname.c_str()) == 0) {
				return pe32.th32ProcessID;
			}
		}

		while (Process32Next(hSnap, &pe32)) {
			if (strcmp(pe32.szExeFile, processname.c_str()) == 0) {
				return pe32.th32ProcessID;
			}
		}

		CloseHandle(hSnap);
		return 0;
	}
	else {
		return 0;
	}

Так вот.
После вызова - ничего не происходит.
Инжект делаю не в системный процесс.
Пробовал инжектить через Process Hacker и всё работало.
В чём может быть проблема?
  • Вопрос задан
  • 375 просмотров
Решения вопроса 1
@armadillo-cld Автор вопроса
Сам смеялся. Решение было достаточно лёгким.
Я вызывал функцию не правильно.
Вызывал:
di.inject_DLL("winhex.exe", di.GetPID("winhex.exe"));

Нужно:
di.inject_DLL("module.dll", di.GetPID("winhex.exe"));

Всем спасибо за помощь.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@cython
Попробуйте так:
LPVOID LoadLib_addr = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");

И сделайте проверку, удалось ли загрузить DLL:
if (h_rThread)
{
  <код>
}
Ответ написан
Комментировать
@none7
Я конечно понимаю, что лень, но всегда нужно писать обработку ошибок, тогда было бы очевидно где проблема. У меня есть 2 варианта почему может не работать:
1. Разрядность Вашего приложения не та же, что и у атакуемого процесса.
2. Расположение kernel32 в атакуемом процессе отличается от расположения в Вашем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы