NtCreateProcessEx(перехват для внедрения DLL)

Тема в разделе "WASM.WIN32", создана пользователем supersonic777, 4 сен 2006.

  1. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    Перехватил в юзер-моде сабж и пытаюсь внедрить свою длл в процесс хендл которого получается в 1-м параметре у NtCreateProcessEx и новый процесс умирает без всяких слов (
    Код (Text):
    1. void AttachDll(HANDLE ProcessHandle, LPSTR DllName)
    2. {
    3. PVOID AllocBuffer = VirtualAllocEx(ProcessHandle,NULL,lstrlen(DllName) + 1,MEM_COMMIT, PAGE_READWRITE);
    4. if(AllocBuffer == NULL) return;
    5. DWORD BytesWritten, ThreadID, ExitCode;
    6. if(!WriteProcessMemory(ProcessHandle, AllocBuffer, (PVOID)DllName, lstrlen(DllName) + 1, &BytesWritten)) return;
    7. PVOID ProcAddr = GetProcAddress(LoadLibrary("kernel32.dll"), "LoadLibraryA");
    8. if(ProcAddr == NULL) return;
    9. HANDLE ThreadHndl = CreateRemoteThread(ProcessHandle, NULL, 0, (LPTHREAD_START_ROUTINE)ProcAddr, AllocBuffer, 0, &ThreadID);
    10. WaitForSingleObject(ThreadHndl, INFINITE);
    11. GetExitCodeThread(ThreadHndl, &ExitCode);
    12. CloseHandle(ThreadHndl);
    13. VirtualFreeEx(ProcessHandle, AllocBuffer, 0, MEM_RELEASE);
    14. }
    15.  
    16.  
    17. DWORD __stdcall HOOK_NtCreateProcessEx(
    18.   OUT PHANDLE ProcessHandle,
    19.   IN ACCESS_MASK DesiredAccess,
    20.   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    21.   IN HANDLE ParentProcess,
    22.   IN BOOLEAN InheritObjectTable,
    23.   IN HANDLE SectionHandle OPTIONAL,
    24.   IN HANDLE DebugPort OPTIONAL,
    25.   IN HANDLE ExceptionPort OPTIONAL,
    26.   IN HANDLE Unknown)
    27. {
    28.     DWORD ret = ORIG_NtCreateProcessEx(ProcessHandle,DesiredAccess,ObjectAttributes,ParentProcess,InheritObjectTable,SectionHandle,DebugPort,ExceptionPort,Unknown);
    29.     MessageBox(0,"TEST","HOOK_NtCreateProcessEx",0);
    30.     AttachDll(*ProcessHandle,"С:\\this_dll.dll");
    31.     return ret;
    32. }
     
  2. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    такс... баг нумбер ван
    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) строку с либой, которую надо грузить? А если и передаешь, то где она лежит - в главном процессе, или в том, который ты патчишь? Вот так вот - что-то я не вижу этого...
     
  3. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    Эта строка в коде процедуры AttachDll
    Код (Text):
    1. if(!WriteProcessMemory(ProcessHandle, AllocBuffer, (PVOID)DllName, lstrlen(DllName) + 1, &BytesWritten)) return;
    Код (Text):
    1. CreateRemoteThread(ProcessHandle, NULL, 0, (LPTHREAD_START_ROUTINE)ProcAddr, AllocBuffer, 0, &ThreadID);
    В AllocBuffer (который находится в новом процесее) как я понимаю уже должна быть эта строка
     
  4. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Хм, в общем то ты прав, я просто не заметил, ибо на С не кодил... Тогда посмотри под отладчиком что происходит с препарируемым процессом(через debug active process) и узнай ГДЕ именно происходит ошибка
     
  5. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    В продолжении темы - поборол вышеописаный глюк, благодаря статьи Мс-рема про хук-апи #1, теперь возникла другая проблема, при инжекте своей ДЛЛ в адрес-спэйс EXPLORER.EXE последний тут же почему то от нее избавляется, т.е. мой проверочный мессадж-бокс на DLL_PROCESS_DETACH срабатывает сразу после инжекта, с другими процессами такого не происходит, ну еще TOTALCMD.EXE иногда подглючивает при инжекте ну это уже не суть важно.
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    supersonic777
    А почистить dllcache забыл ?! Там непатченная версия хранится, а механизм защиты ее восстанавливает :)
     
  7. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    При чем тут dllcache ? Я ж не физически файл на диске зяменяю, а его образ в памяти, для сравнения я ижектил длл в cmd.exe и все ОК
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    supersonic777
    1) exlorer мог "завалится" и автоматом перезапуститься. Правда в этом случае все "навески" в трее исчезнут( это чтоб проверить ситуацию).
    2) В eplorer-е более десятка потоков/thread и внедрение туда наверняка имеет свои особенности.
     
  9. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    1. Сплорер не падает
    2.
    Хм...но ведь этот инжект стандартный, что может быть особенного в новом потоке + к тому что моя dll пустая за исключением МессаджБоксов
     
  10. Engineer

    Engineer New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    7
    Вот вот. В XP-х я тоже столкнулся с "падением" процессов после инжекта. Хотя делаешь вроде все как учили... Смерь приходит почти сразу после CreateRemoteThread(...,via LoadLibrary, ...), при read address <по разному> процессом. VirtualAlloc, WriteVirtualMemory выполняются без ошибок.
     
  11. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    У меня при инжекте в некоторые процессы при вызове MessageBox вообще комп перезагружается