Привет.Смог внедрить dll с помощью библиотеки Detours. Но вот беда-выгрузить ее не получается..... Через CreateRemouteThread и FreeLibrary не получается.Только выгружаются те,кого загрузил в процесс с помощью CreateRemouteThread и LoadLibrary.
А ничего.Все ок! Код (Text): BOOL fOk = FALSE; // Assume that the function fails HANDLE hthSnapshot = NULL; HANDLE hProcess = NULL, hThread = NULL; // Grab a new snapshot of the process hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId); if (hthSnapshot == NULL) { if (hthSnapshot != NULL) CloseHandle(hthSnapshot); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Get the HMODULE of the desired library MODULEENTRY32W me = { sizeof(me) }; BOOL fFound = FALSE; BOOL fMoreMods = Module32FirstW(hthSnapshot, &me); for (; fMoreMods; fMoreMods = Module32NextW(hthSnapshot, &me)) { fFound = (lstrcmpiW(me.szModule, pszLibFile) == 0) || (lstrcmpiW(me.szExePath, pszLibFile) == 0); if (fFound) break; } if (!fFound) { if (hthSnapshot != NULL) CloseHandle(hthSnapshot); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Get a handle for the target process. hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | // Required by Alpha PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION, // For CreateRemoteThread FALSE, dwProcessId); if (hProcess == NULL) { if (hthSnapshot != NULL) CloseHandle(hthSnapshot); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Get the real address of LoadLibraryW in Kernel32.dll PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "FreeLibrary"); if (pfnThreadRtn == NULL) { if (hthSnapshot != NULL) CloseHandle(hthSnapshot); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Create a remote thread that calls LoadLibraryW(DLLPathname) hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRtn, me.modBaseAddr, 0, NULL); if (hThread == NULL) { if (hthSnapshot != NULL) CloseHandle(hthSnapshot); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return FALSE; } // Wait for the remote thread to terminate DWORD ww= WaitForSingleObject(hThread, INFINITE); fOk = TRUE; // Everything executed successfully ////////////////////////////////////////////////////////////// ///////////////////////////////// if (hthSnapshot != NULL) CloseHandle(hthSnapshot); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess); return fOk; Ни одного исключения.Все отлично... Блин,уже запарился..
Раз либа сидит, значит что-то не верно. Ты перечисляешь либы с помощью тулхелп - если нужная либа подгружалась не с помощью обычной LoadLibrary, а с помощью какого либо изврата, то перечисляться она, скорее всего, не будет.
Нет..Либа перечисляется.. Т.е. в списке модулей она есть. А догружалась она с помощью библиотеки и мелкософтовский DetourCreateProcessWithDll
Посмотрел исходники DetourCreateProcessWithDll.Пишет стандартно,через WriteProccessMemory Интересно,если таким образом внедрит длл,то можно будет ее выгрузить через CreateRemoteThread?
Имелось в виду: Код (Text): while (1) { CreateRemoteThread(); WaitXXXX if (status == SUCCESS) continue; else break; } FreeLibrary(lib) нужно делать столько же, сколько было LoadLibrary(lib). Возможно её кто-то ещё подгружал, потому с первого раза она и не выгружается.
Погляди это. Там жёстко зашиты адреса апишек (XP SP2, энтузиасты пишут динамику (а мне было лень), мне статики хватает, тулза только для ознакомления и усовершенствования).
asmfan Спасибо,но в асме я полный ноль.. Но увидел,что выгружаешь ты через CreateRemoteThread. Я тоже так выгружаю. Только проблема в том,что выгружаюсь из тех приложений, в которые загрузился через CreateRemoteThread.А если через WriteProccessMemory-тогда полный голяк.Хотя все отрабатывает по функциям.. Пробывал на глаз цикл из 20 шагов.Бестолку..... while сделать не могу,т.к. все функции возвращают ОК,и тогда петля...
Ага..Стоп..А у тебя есть в коде WriteProcessMemory.. Или это ты загружаешь..? Вообще тяжело..Я на С++ пишу..
короче стоит сделать примерно так Код (Text): struct ThreadArgs { BOOL (WINAPI *FreeLibrary)(HMODULE); HMODULE BaseAddress; }; DWORD CALLBACK UnloadLibraryThread( LPVOID Args ) { while( ((ThreadArgs*)Args)->FreeLibrary(((ThreadArgs*)Args)->BaseAddress) ); return 0; } void EndThread(){} void yourcode() { ... open process etc. ... void* Thread = VirtualAllocEx( hProcess, 0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE ); WriteProcessMemory( hProcess, Thread, UnloadLibraryThread, (ULONG)EndThread-(ULONG)UnloadLibraryThread, 0 ); ThreadArgs Args; *(FARPROC*)&Args.FreeLibrary = GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "FreeLibrary"); Args.BaseAddress = me.modBaseAddr; DWORD id; hThread = CreateRemoteThread( hProcess, 0, 0, Thread, Args, 0, &id ); .. wait for thread ... }
Great Единственное отличие от Рихтера (я приводил выше его код), так то, что при ВЫГРУЗКЕ ты делаешь опять же WriteProcessMemory,а функция UnloadLibraryThread-у тебя CALLBACK и в ней цикл.. Ну что ж,ок..Сейчас попробую..