@sddvxd

Почему приложение с внедренной DLL «вылетает»?

Доброго времени суток

Решил написать свой первый инжектор с библиотекой, библиотека инжектируется за счет CreateRemoteThread и передачи в качестве входной функции адреса LoadLibraryW и передачи адреса заранее выделенной памяти с аргументом для этой функции:

//Инжектор
LPTHREAD_START_ROUTINE lpThreadSR = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32")),"LoadLibraryW");
HWND hwnd = FindWindow(NULL, TEXT("cpp"));
DWORD pID;
GetWindowThreadProcessId(hwnd, &pID);
HANDLE hProcess = OpenProcess(
                              PROCESS_CREATE_THREAD | // для CreateRemoteTnread
                              PROCESS_VM_OPERATION | // для VirtualAllocEx/VirtualFreeEx
                              PROCESS_VM_WRITE, // для WriteProcessMemory
                              FALSE, pID);
LPCWSTR path = L"C:\\cpp\\dll\\mydll";
DWORD sizeP = (lstrlenW(path)+1)*sizeof(wchar_t);
PVOID addr_VP = VirtualAllocEx(hProcess, NULL, sizeP, MEM_COMMIT, PAGE_READWRITE);
SIZE_T t;
if(WriteProcessMemory(hProcess, addr_VP, (LPCVOID)path, sizeP, &t)){
  cout<<t<<endl;
}
HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, lpThreadSR, addr_VP, 0, NULL);
WaitForSingleObject(hRemoteThread, INFINITE);
cout<<"Ready!"<<endl;
//lpThreadSR = //(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32")),"FreeLibrary");
//hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, lpThreadSR, addr_VP, 0, NULL); //С этим плохо работало - закоментил
VirtualFreeEx(hProcess, addr_VP, sizeP, MEM_RELEASE);
cout<<hRemoteThread;
cin.get();


И сама DLL:

BOOL WINAPI DllMain(HINSTANCE hH, DWORD fdwReason, PVOID){
  if(fdwReason==DLL_PROCESS_ATTACH){
    HWND hwnd = FindWindow(NULL, TEXT("cpp"));
    MessageBoxW(hwnd, L"э", L"э?", MB_OK);
  }
  return TRUE;
}


В моем случае я открываю в проводнике папку "cpp" и запускаю приложение. Инжект проходит успешно - смотрю через ProcessHacker. В некоторых версиях даже получалось показывать всплывающее окно, правда оно после закрытия либо опять "выбывало" приложение, либо всплывающие окна бесконечно появлялись (после нажатия на "Ок" всплывало новое)
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Kobalt_x
C++ developer
GetProcAddress -- возвращает адрес из текущего процесса инжектора.
А в структуре у вас должен быть адрес в инжектируемом процессе, соответственно как вариант вычисляем offset от начала image в инжекторе и потом прибавляем этот offset к базовому адресу инжектируемого процесса.
Ответ написан
Ваш ответ на вопрос

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

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