Доброго времени суток всем! У меня такая проблема: // Пишу в Borland C++ Builder 6.0 Хочу внедрить свою DLL в чужой процесс. И хочу, чтобы код в DllEntryPoint выполнился. Вот код DLL: Код (Text): #include <vcl.h> #include <windows.h> #pragma hdrstop // в дальнейшем я хочу показывать форму из DLL, но пока здесь только сообщение #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { ShowMessage("Hello from DLL"); return 1; } Вот код внедрения: Код (Text): DWORD dwProcessId = StrToInt(PIDEdit->Text); HWND hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | // Required by Alpha PROCESS_CREATE_THREAD | // For CreateRemoteThread PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx PROCESS_VM_WRITE, // For WriteProcessMemory FALSE, dwProcessId); if(hProcess == NULL) { ShowMessage("ERROR: Process not opened"); }; int iDllNameSize = 30; LPVOID lpvRemouteDllStringAddr = VirtualAllocEx( hProcess, NULL, iDllNameSize, MEM_COMMIT, PAGE_READWRITE); if(lpvRemouteDllStringAddr == NULL) { ShowMessage("ERROR: lpvRemouteDllStringAddr is NULL"); }; LPVOID lpBuffer = "G://PROJECTS//CPP//HelloFromDll//dllhello.dll"; bool boolWritedInProcess = WriteProcessMemory( hProcess, // handle to process whose memory is written to lpvRemouteDllStringAddr, // address to start writing to lpBuffer, // pointer to buffer to write data to iDllNameSize, // number of bytes to write NULL // actual number of bytes written ); if(!boolWritedInProcess) { ShowMessage("ERROR: DLL name not writed in Process memory"); }; HMODULE hModuleHandle = GetModuleHandle(TEXT("Kernel32")); if(hModuleHandle == NULL) { ShowMessage("GetModuleHandle Kernel32 ERROR"); }; PTHREAD_START_ROUTINE pThreadFunction = (PTHREAD_START_ROUTINE) GetProcAddress(hModuleHandle, "LoadLibraryA"); if(pThreadFunction == NULL) { ShowMessage("GetProcAddress LoadLibraryA ERROR"); }; HANDLE hThread = CreateRemoteThread( hProcess, // handle to process to create thread in NULL, // pointer to thread security attributes 0, // initial thread stack size, in bytes pThreadFunction, // pointer to thread function lpvRemouteDllStringAddr,// pointer to argument for new thread 0, // creation flags NULL); // pointer to returned thread identifier if(hThread == NULL) { ShowMessage("CreateRemoteThread ERROR"); }; Всё гладко. Ошибок не выдает. В диспетчере занимаемая процессом память увеличивается примерно на размер файла dll. Но как добиться выполнения кода в Dll ? Буду рад любой помощи, ссылкам и так далее.
_Demon_ Код (Text): static DWORD dwTlsIndex; // address of shared memory // DllMain() is the entry-point function for this DLL. BOOL DllMain(HINSTANCE hinstDLL, // DLL module handle DWORD fdwReason, // reason called LPVOID lpvReserved) // reserved { LPVOID lpvData; BOOL fIgnore; switch (fdwReason) { // The DLL is loading due to process // initialization or a call to LoadLibrary. case DLL_PROCESS_ATTACH: // Allocate a TLS index. if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) return FALSE; // No break: Initialize the index for first thread. // The attached process creates a new thread. case DLL_THREAD_ATTACH: // Initialize the TLS index for this thread. lpvData = (LPVOID) LocalAlloc(LPTR, 256); if (lpvData != NULL) fIgnore = TlsSetValue(dwTlsIndex, lpvData); break; // The thread of the attached process terminates. case DLL_THREAD_DETACH: // Release the allocated memory for this thread. lpvData = TlsGetValue(dwTlsIndex); if (lpvData != NULL) LocalFree((HLOCAL) lpvData); break; // DLL unload due to process termination or FreeLibrary. case DLL_PROCESS_DETACH: // Release the allocated memory for this thread. lpvData = TlsGetValue(dwTlsIndex); if (lpvData != NULL) LocalFree((HLOCAL) lpvData); // Release the TLS index. TlsFree(dwTlsIndex); break; default: break; } return TRUE; UNREFERENCED_PARAMETER(hinstDLL); UNREFERENCED_PARAMETER(lpvReserved); } from SDK. Переделай только на создание потка, а не на инициализацию ТЛС.
Он там есть (смотрел в оле). Да я и к эксплореру атачил длл-ку. Он полюбому запускает юзер32. Надо как-то стартовать внедряемую библиотеку что ли. Передать ей управление. Или еще что-то.
dead_body да раз библиотека грузится, то DllMain полюбому исполняется, не важно идет там проверка DWORD fdwReason или нет. только я не помню подружаются ли либы который нужны этой библиотеке... тут ведь не винАПИ-шная функция вызывается (тока щас заметил). _Demon_ ты попробуй не ShowMessage, а нормальную апишную функцию вызывать MessageBoxA да и проверяй нормально, грузится она или нет, через бряк на создание нового потока (аттач к процессу в который внедряешься и галку на "break on new thread"
Переделал DLL вот так: Код (Text): #include <windows.h> #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { LPCSTR lpText = "Hello From DLL"; LPCSTR lpCaption = lpText; UINT uType = 2; HWND hHandle; MessageBoxA(hHandle, lpText, lpCaption, uType); return 1; } Только не знаю как получить хэндл dll. Попробовал через GetModuleHandle: Код (Text): HMODULE hHandle = GetModuleHandle(TEXT("dllhello")); dllhello - это имя без расширения самой длл, которая внедряется. Не получается.
Я думал что она получает управление как дополнительный поток к приложению после её загрузки. Видимо это не так. Сейчас ищу информацию по этой теме..
dead_body, ведь когда подключаешь библиотеку, то она как-то инициализируется вызывающим процессом. Уже при загрузке в память. Я в этом убедился когда нажимаю в проводнике на скомпилированной dll которую приводил выше. Когда нажимаю правой кнопкой на этой библиотеке то её код в DllEntryPoint тут же выполняется. То есть на экране появляется сообщение (значит с получением хендла нет проблемы). Когда я нажимаю на ОК, то уже потом контекстное меню проводника появляется. Я читал в книге Г. Хоглунда "Руткиты. Внедрение в ядро Windows", что можно свою dll внедрить в другой процесс посредством CreateRemoutThread. Но больше там ничего по этому поводу не сказано. Моя цель не сделать руткит, это вобще моя курсовая (сделать программу невидимую в диспетчере и выгружающую из памяти заданные приложения). Все сделано. Сейчас я добиваюсь скрытия процесса из диспетчера задач. Вернее dll-ки. Перехват и замена API-функции, которой пользуется диспетчер задач для получения списка, не катит. Нужно именно внедрением. Сейчас всё вроде сделано как нужно, но код в dll не выполняется. Вот я и думаю, что не учел какой-то мелочи. Может библиотеке не знает что она загружена. Или процесс в который она внедрена не знает о её существовании.. Может еще что-то. Подобные вещи должны быть известны людям, которые пишут программы с поддержкой плагинов. Но я к сожалению не нашел такой информации пока.
Ёбта... // dll Код (Text): #include <windows.h> #pragma comment(linker,"/ignore:4078") #pragma comment(linker,"/nodefaultlib") #pragma comment(linker,"/entry:DllMain") #pragma comment(linker,"/filealign:0x200") #pragma comment(linker,"/subsystem:windows") #pragma comment(linker,"/section:.text,rwx") #pragma comment(linker,"/merge:.rdata=.text") DWORD WINAPI RunMessageBox(LPVOID lpVoid) { for (DWORD i = 0; i < 10; i++) { MessageBox(NULL, "Hello from hell", "Information", MB_OK); } return 0; } BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { CreateThread(NULL, 0, RunMessageBox, NULL, NULL, &dwReason); } return TRUE; } // внедрение Код (Text): #include <windows.h> #include <Tlhelp32.h> #pragma comment(linker,"/merge:.rdata=.text") #pragma comment(linker,"/filealign:0x200 /section:.text, rwx /ignore:4078") #pragma comment(linker,"/entry:entry") #pragma comment(linker,"/nodefaultlib") #pragma comment(linker,"/subsystem:windows") #define szProcessName "you_process_name.exe" #define szDllName "C:\\path_to_you_dll.dll" DWORD FindProcess() { DWORD dwProcessId = 0xFFFFFFFF; PROCESSENTRY32 pe; pe.dwSize = sizeof( PROCESSENTRY32 ); HANDLE hSnapshot = CreateToolhelp32Snapshot(2, 0); if (hSnapshot != INVALID_HANDLE_VALUE) { if (Process32First(hSnapshot, &pe)) { do { if (!lstrcmpi(pe.szExeFile, szProcessName)) { dwProcessId = pe.th32ProcessID; break; } } while (Process32Next(hSnapshot, &pe)); } } return dwProcessId; } void entry(void) { DWORD dwProcessId = FindProcess(); HANDLE hProcess; if ((hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcessId)) !=NULL) { LPVOID lpBase = VirtualAllocEx(hProcess, 0, 16, MEM_COMMIT+MEM_RESERVE, PAGE_READWRITE); if (lpBase !=NULL) { if (WriteProcessMemory(hProcess, lpBase, szDllName, 9, 0)) { CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE) &LoadLibrary, lpBase, 0, 0); CloseHandle(hProcess); } } } }
lamer2k, твой код DLL работает c моим кодом внедрения. Но не могу понять почему твой код внедрения выдаёт ошибку. Да это уже и не важно. Всем спасибо за помощь.