Так недавно я сделал свой собственный инжектор dll, чтобы иметь возможность отлаживать другое приложение путем внедрения в него отладочной dll; Использование c ++ / cli для интерфейса и c ++ для кода.
Я протестировал тот же код, что и в этом проекте, на проекте консольного приложения C ++ , и он работал без каких-либо проблем.
Внедрение происходит внутри файла Init.cpp
, который, по сути, получает указанный путь к dll в виде C:\\user\\documents\\debug.dll
и проверяет, существует ли он. После этого он получает идентификатор процесса, передавая имя, в данном случае myotherapp.exe
, в качестве параметра. В случае успеха он получает дескриптор процесса и сохраняет его в g.h_process
, он продолжает, выделяя читаемую / записываемую память в процессе, а затем записывает в эту память путь к dll и, наконец, использует LoadLibraryA
для загрузки dll. внутри процесса.
Init.cpp
:
void Injector::Init(void)
{
if (g.debug) {
cout << "????????????????????? <FrameInjector> ?????????????????????" << endl;
cout << endl;
}
Inject::Checks((char*)g.dll_path, g.procName);//checking for dll validity
}
bool Injector::Inject::Checks(char* dll_path, PCSTR procName)
{
if (!Utils::file_exists(dll_path))
return Utils::error("File does not exist.");
Utils::successInput("Prepared DLL for injection");
//get process id
Utils::getProcId(procName, g.proc_id);
if (!g.proc_id) {
return Utils::error("Could not find specified process.");
}
cout << "[?] Got process! ID: " << (int)g.proc_id << endl;
g.h_process = OpenProcess(PROCESS_ALL_ACCESS, NULL, g.proc_id);
if (!g.h_process) {
return Utils::error("Failed to open a handle to process");
}
Utils::successInput("Attached to process ");
//void* can point to anything so allocMem is a pointer to anything here to pointed memory
g.allocatedMemory = VirtualAllocEx(g.h_process, nullptr, MAX_PATH, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);//mem_reserver reserve memory then commit memory to be able to write to that memory
//allocate memory
Allocate(g.allocatedMemory, dll_path);
//create thread and execute LoadLibraryA
Llib();
Utils::successInput("Loaded dll into target");
Release(dll_path, g.allocatedMemory);
Utils::successInput("Successfully released memory");
if (g.msgBoxes)
Utils::msgBox("Successfully injected dll!");
if (g.closeOnInjection)
exit(0);
return 0;
}
bool Injector::Inject::Allocate(void* allocatedMemory, char* dll_path)
{
if (!allocatedMemory)
return Utils::error("Failed to allocate memory");
if (!WriteProcessMemory(g.h_process, g.allocatedMemory, g.dll_path, MAX_PATH, nullptr))//writing dll path in allocated memory
return Utils::error("Failed to write process");
return true;
}
bool Injector::Inject::Llib() {
HANDLE h_thread = CreateRemoteThread(g.h_process, nullptr, NULL, LPTHREAD_START_ROUTINE(LoadLibraryA), g.allocatedMemory, NULL, nullptr);
if (!h_thread)
return Utils::error("Failed to create remote thread");
return true;
}
bool Injector::Inject::Release(PCSTR dll_path, void* allocatedMemory)
{
//close handle
CloseHandle(g.h_process);
VirtualFreeEx(g.h_process, allocatedMemory, NULL, MEM_RELEASE);
return true;
}
Полный файл: Начальный cpp
g.debug
- это просто флаг, который сообщает нам, включена консоль или нет. находится в globals.hpp , который содержит только глобальные переменные. Вы также можете проверить пространство имен Utils
здесь .
Ошибка:
Проблема, с которой я здесь сталкиваюсь, заключается в том, что я DLL в процесс, мой инжектор работает нормально без ошибок, но когда я подключаюсь к процессу, который хочу ввести в , я получаю сообщение об ошибке Access Violation
с завершением процесса с кодом ошибки.
Я не понимаю, я не вижу, откуда я обращаюсь к недействительной памяти.
Заранее спасибо.