Перехватил в юзер-моде сабж и пытаюсь внедрить свою длл в процесс хендл которого получается в 1-м параметре у NtCreateProcessEx и новый процесс умирает без всяких слов ( Код (Text): void AttachDll(HANDLE ProcessHandle, LPSTR DllName) { PVOID AllocBuffer = VirtualAllocEx(ProcessHandle,NULL,lstrlen(DllName) + 1,MEM_COMMIT, PAGE_READWRITE); if(AllocBuffer == NULL) return; DWORD BytesWritten, ThreadID, ExitCode; if(!WriteProcessMemory(ProcessHandle, AllocBuffer, (PVOID)DllName, lstrlen(DllName) + 1, &BytesWritten)) return; PVOID ProcAddr = GetProcAddress(LoadLibrary("kernel32.dll"), "LoadLibraryA"); if(ProcAddr == NULL) return; HANDLE ThreadHndl = CreateRemoteThread(ProcessHandle, NULL, 0, (LPTHREAD_START_ROUTINE)ProcAddr, AllocBuffer, 0, &ThreadID); WaitForSingleObject(ThreadHndl, INFINITE); GetExitCodeThread(ThreadHndl, &ExitCode); CloseHandle(ThreadHndl); VirtualFreeEx(ProcessHandle, AllocBuffer, 0, MEM_RELEASE); } DWORD __stdcall HOOK_NtCreateProcessEx( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ParentProcess, IN BOOLEAN InheritObjectTable, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL, IN HANDLE Unknown) { DWORD ret = ORIG_NtCreateProcessEx(ProcessHandle,DesiredAccess,ObjectAttributes,ParentProcess,InheritObjectTable,SectionHandle,DebugPort,ExceptionPort,Unknown); MessageBox(0,"TEST","HOOK_NtCreateProcessEx",0); AttachDll(*ProcessHandle,"С:\\this_dll.dll"); return ret; }
такс... баг нумбер ван PVOID AllocBuffer = VirtualAllocEx(ProcessHandle,NULL,lstrlen(DllName) + 1,MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE); вот так будет вернее... ну и соответственно... VirtualFreeEx(ProcessHandle, AllocBuffer, 0, MEM_RELEASE or MEM_DECOMMIT); И наконец - где это ты передаешь удаленному треду(в данном случае LoadLibraryA) строку с либой, которую надо грузить? А если и передаешь, то где она лежит - в главном процессе, или в том, который ты патчишь? Вот так вот - что-то я не вижу этого...
Эта строка в коде процедуры AttachDll Код (Text): if(!WriteProcessMemory(ProcessHandle, AllocBuffer, (PVOID)DllName, lstrlen(DllName) + 1, &BytesWritten)) return; Код (Text): CreateRemoteThread(ProcessHandle, NULL, 0, (LPTHREAD_START_ROUTINE)ProcAddr, AllocBuffer, 0, &ThreadID); В AllocBuffer (который находится в новом процесее) как я понимаю уже должна быть эта строка
Хм, в общем то ты прав, я просто не заметил, ибо на С не кодил... Тогда посмотри под отладчиком что происходит с препарируемым процессом(через debug active process) и узнай ГДЕ именно происходит ошибка
В продолжении темы - поборол вышеописаный глюк, благодаря статьи Мс-рема про хук-апи #1, теперь возникла другая проблема, при инжекте своей ДЛЛ в адрес-спэйс EXPLORER.EXE последний тут же почему то от нее избавляется, т.е. мой проверочный мессадж-бокс на DLL_PROCESS_DETACH срабатывает сразу после инжекта, с другими процессами такого не происходит, ну еще TOTALCMD.EXE иногда подглючивает при инжекте ну это уже не суть важно.
supersonic777 А почистить dllcache забыл ?! Там непатченная версия хранится, а механизм защиты ее восстанавливает
При чем тут dllcache ? Я ж не физически файл на диске зяменяю, а его образ в памяти, для сравнения я ижектил длл в cmd.exe и все ОК
supersonic777 1) exlorer мог "завалится" и автоматом перезапуститься. Правда в этом случае все "навески" в трее исчезнут( это чтоб проверить ситуацию). 2) В eplorer-е более десятка потоков/thread и внедрение туда наверняка имеет свои особенности.
1. Сплорер не падает 2. Хм...но ведь этот инжект стандартный, что может быть особенного в новом потоке + к тому что моя dll пустая за исключением МессаджБоксов
Вот вот. В XP-х я тоже столкнулся с "падением" процессов после инжекта. Хотя делаешь вроде все как учили... Смерь приходит почти сразу после CreateRemoteThread(...,via LoadLibrary, ...), при read address <по разному> процессом. VirtualAlloc, WriteVirtualMemory выполняются без ошибок.