Добрый вечер. Для внедрение dll в сторонний процесс использую метод из книги Рихтера. Суть этого метода - создать удаленный поток в нужном процессе, в качестве функции указать LoadLibrary с необходимой dll. Если программа, dll и процесс одинаковой битности, то проблем нет. А как сделать, чтобы можно было из 32-битной программы также внедрять 64-битные dll в 64-битные процессы? Код (Text): BOOL WINAPI InjectLibW(DWORD dwProcessId, PCWSTR pszLibFile) { BOOL fOk = false; HANDLE hProcess = NULL, hThread = NULL; PWSTR pszLibFileRemote = NULL; __try { // Получаем описатель целевого процесса. hProcess = OpenProcess( PROCESS_ALL_ACCESS /* PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ */, FALSE, dwProcessId); if (hProcess == NULL) __leave; // Определяем, сколько байтов нудно для строки с полным именем DLL. int cch = 1 + lstrlenW(pszLibFile); int cb = cch * sizeof(WCHAR); // Выделяем блок памяти под эту строку. pszLibFileRemote = (PWSTR)VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE); if (pszLibFileRemote == NULL) __leave; // Копируем эту строку в адресное пространство удаленного процесса. if (!WriteProcessMemory(hProcess, pszLibFileRemote, (PVOID)pszLibFile, cb, NULL)) __leave; // Получем истинный адрес LoadLibraryW в Kernel32.dll PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); if (pfnThreadRtn == NULL) __leave; // Создаем удаленный поток, вызывающий LoadLibraryW hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRtn, pszLibFileRemote, 0, NULL); DWORD err = GetLastError(); if (hThread == NULL) __leave; // Ждем завершение удаленного потока. WaitForSingleObject(hThread, INFINITE); fOk = TRUE; } __finally{ // Очистка. if (pszLibFileRemote != NULL) VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); } return fOk; } То есть, каким-то образом надо получить точку входа для функции LoadLibraryW в 64-битном процессе. Код (Text): // Получем истинный адрес LoadLibraryW в Kernel32.dll PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); Подскажите, пожалуйста.
Я, конечно, ничем подобным не занимался, однако гугл дает возможность ответить на этот вопрос https://stackoverflow.com/questions...s-memory-of-a-64-bit-process-from-a-32bit-app http://www.cyberforum.ru/win-api/thread932651.html
Вообще можно так извратиться https://github.com/OpenWireSec/meta...source/common/arch/win/i386/base_inject.c#L68 Ага, прочитать != сделать инжект
https://gist.github.com/David-Reguera-Garcia-Dreg/cc8dde5901d51a922c8c336b5adb7374 https://github.com/rwfpl/rewolf-wow64ext/ https://www.opensc.io/showthread.php?t=18507 будет полезно, почти готовое решение
unc1e, Это все совсем не полное решение. Револьф работает, но надо пулы домерджить для потока. Потом надо шеллы запилить под 2 платформы - если ПЕ грузить. Надо определить битность процесса итд. Но если через лоадлайбрари, то там можно с колес на револьфе сделать, добавить X64Call для этой апи.
При внедрении из процесса x86 в x64, вся магия заключается в переводе процессора из режима x86 в x64. В x86 процессе грузятся 2 ntdll, переводим процессор в нужный контекст, ищем адреса и стартуем. Описание можно посмотреть здесь. http://blog.rewolf.pl/blog/?p=102
unc1e, Нет никакой проблемы переключать моды на асм. Вы просто не понимаете проблему - они не могут сделать это на си и прочем скрипте. В этом и суть вопроса. При смене мода кодировка инструкций изменяется и код, который выдал компилер становится нерабочим. По этой причине они и задают эти вопросы. Решения нет - кроме как учить матчасть.
Как нельзя, asm вставкой для си. В x64 asm нужно добавить 0x48 опкод перед командами и все, компиль x86 с x64 asm.
так избитая тема уже... пилишь шелл на сишечке, компилишь для двух архитектур, вырезаешь полученный код, вставляешь в асм: .code32 xor eax, eax inc eax nop jz _x64 _x86: <32-битный шелл> _x64: <64-битный шелл> если процессор в 64-битном режиме, то он расценивает этот код как xor eax, eax и nop с префиксом... эта херня частенько используется в сплойтах, какие проблемы использовать в своем коде?
Indy_, все ссылки уже есть. и револьф тоже. для ТС работы на 10 минут под его задачу. Это с клоном с гитхаба и всовыванием в свой проект. Darkness Archangel, уже все ссылки привели.