Сейчас на форуме: Alf, Adler, Rio, vsv1, site-pro (+8 невидимых)

 eXeL@B —› Софт, инструменты —› SIDE.
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 13 . 14 . >>
Посл.ответ Сообщение


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 03 августа 2013 16:29 · Поправил: Dr0p
· Личное сообщение · #1

o x86, KM, MI, KDR; откат на 5.1, 6.1; недетект всяким аверским говном.

Пиздатый мотор для дебага всякой юзермодной погани. Теперь не нужно юзать ядерный дебаг, чтобы всякая хуита не вышла из под отладки. Возможность выбора сервисной таблицы.

Отлавливаются все сисколы в системе, редирект в юзермод, там наш фильтр их обрабатывает и вертает управленье в юзермод.

Возврат из ядра на адрес PEB[0xFFC], флаг по тому же смещенью в TEB запрещает обработку(по дефолту сброшен, тоесть пропускается).

При возврате имеем в rEax номер сервиса, на стеке:

Code:
  1. FSTATE struct
  2.          Ip      PVOID ?
  3.          Args    PVOID ?
  4. FSTATE ends


Прожект с vx.security-portal.cz

3ab6_03.08.2013_EXELAB.rU.tgz - SIDE.zip

| Сообщение посчитали полезным: hors, daFix, Lacoste, Paranoid Koneko, Abraham, JKornev, DenCoder, dosprog, Coderess, Tolkin, VanHelsing

Ранг: 44.8 (посетитель), 19thx
Активность: 0.040
Статус: Участник

Создано: 22 ноября 2013 16:49
· Личное сообщение · #2

фантом в ольке можно юзать, а это нечто как например к олли подрубить??




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 22 ноября 2013 17:38 · Поправил: Dr0p
· Личное сообщение · #3

SegFault

Регается как верифер. Фантом гавно.




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 22 ноября 2013 18:31
· Личное сообщение · #4

Dr0p пишет:
Регается как верифер.


не обессудь, но тебе бы взять и разок нормально документировать, как и для чего это делается. Может народ бы пользовать стал, да багрепорты бы пошли.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 23 ноября 2013 02:30 · Поправил: Dr0p
· Личное сообщение · #5

Gideon Vi

Вся необходимая инфа есть. На счёт багрепортов - это реально только имея сурсы сабжа. Там весьма сложный код, довольно сложно отлаживается(мотор изначально не предназначен дляработы с отладчиком, более того, сам механизм отладчик не поддерживает(KDR под портом не вызывается), фильтр для скрытия ольки всего лишь код, основанный на моторе. В мотор была введена только обработка тск, основная же его цель - скрытый мониторинг сервисов ядра(это руткит)). Они полупривад, так как очень мощный механизм получился. И некоторым(аверам в частности) не нужно в них копаться.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 26 ноября 2013 16:00
· Личное сообщение · #6

Вот наваял описание.

1e72_26.11.2013_EXELAB.rU.tgz - SIDE.zip

| Сообщение посчитали полезным: SegFault, Oott

Ранг: 2.2 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 28 ноября 2013 14:57
· Личное сообщение · #7

Может что не так делаю или чего иного ждал от софтины, но дела обстоят так:

1. Качнул какую-то из последних версий (с яндекс.диска)
2. Использую вмварю, хпсп3. Инсталлю дров (тупо запуск nthdrv.exe проходит без ошибок)
3. Затем использую содержимое архива api.zip - там запускаю батник TEST.EXE >> log.txt. Моментально создается чуть больше 100 кб лога, консолька висит, мессаджбокс с надписью "psapi.dll" тоже висит.
4. Запускаю хелловорлд Инди (на первой странице взял), делаю еще в системе некие манипуляции (терминейт пары процессов, добавление\удаление пары ключей в реестр)
5. Нажимаю в мессаджбоксе с надписью "psapi.dll" ОК и после чего открываю получившийся лог... и не вижу там никаких проделанных манипуляций

Особо в тему не вчитывался (много ругани), но выцепил следующее:
Dr0p пишет:
Точнее мониторятся нтапи на уровне ядра.

т.е я ожидал увидеть в логе некий результат мониторинга апи. помню, что шадов не перехватывается тулзой, ну, а все остальное? операции с процессами и т.д

Либо я что-то не правильно делаю, либо не понял для чего инструмент

| Сообщение посчитали полезным: Dr0p


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 28 ноября 2013 23:44
· Личное сообщение · #8

priag

Шадов тоже отслеживается. Это не инструмент, а мотор. Чтоб его юзать надо немного покодить




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 29 ноября 2013 01:59
· Личное сообщение · #9

3. Это был тестовый семпл:



Загрузочный лог снимался, прототипы доставались из базы, подставлялись аргументы и выводилось в консоль/файл.

4. Не могу ничего сказать, так как хз что вы запускали. Было очень много тестов, семплов и билдов.

> я ожидал увидеть в логе некий результат мониторинга апи

Не ведётся никакой лог. Кодес для скрытия дебаггера, который на этом моторе основам мониторит кучу сервисов, для некоторых выводится лог(нп waiters", счётчики). Не составляет вообще никакого труда реализовать монитор каких то действий. Оно элементарно на коленке пилится, вот например:

Code:
  1. _ZwQuerySystemTime struct
  2. SystemTime        PLARGE_INTEGER ?
  3. _ZwQuerySystemTime ends
  4.  
  5. ; +
  6. ;
  7. pZwQuerySystemTime proc C
  8.          assume ebx:ptr _ZwQuerySystemTime
  9.          inc g_nNtQuerySystemTime
  10. ifdef OPT_SUSPEND_SYSTEMTIME
  11.          invoke ZwQuerySystemTime, [Ebx].SystemTime  ; Валидация ссылки.
  12.          .if !Eax
  13.                  %RANDOM
  14.                  add D[g_SysTime],eax
  15.                  adc D[g_SysTime + 4],0
  16.                  mov ecx,[ebx].SystemTime
  17.                  mov eax,D[g_SysTime]
  18.                  mov edx,D[g_SysTime + 4]
  19.                  mov D[ecx],eax
  20.                  mov D[ecx + 4],edx
  21.                  jmp FleaveOk
  22.          .endif
  23. endif
  24.          ret
  25. pZwQuerySystemTime endp


Не знаю что может быть не понятно, я же всё подробнейшим образом разжевал.

Единственная проблема может возникнуть со слепками, это когда сервис вызывается из процедуры, которая вызывается из другой процедуры етц и нужно идентифицировать вызов из нужной процедуры. В этом случае весь код процедуры нужной описавыется слепком(массив описателей блоков, составляющих процедуру). В неё находится адрес возврата и выполняется маршрутизация. Иногда многократная, бывает весьма сложным запутанным образом

Про щадов мало сказано, потому что в отличие от сервисов базовых, для этих нет конкретных стабов, чтобы можно было номер сервиса получить. Лишь для некоторых. Вот например скрывается окно отладчика:
Code:
  1. _NtUserBuildHwndList struct
  2. hdesk       HANDLE ?
  3. hwndNext          HWND ?
  4. fEnumChildren     BOOLEAN ?
  5. idThread          DWORD ?
  6. cHwndMax          UINT ?
  7. phwndFirst        PVOID ?
  8. pcHwndNeeded      PULONG ?
  9. _NtUserBuildHwndList ends
  10.  
  11. pNtUserBuildHwndList proc
  12. Local N:ULONG
  13. Local Pid:HANDLE
  14.          assume ebx:ptr _NtUserBuildHwndList
  15.          mov edx,ebx
  16.          %NTCALL NTSTATE.Cpu.R.rEax[Edi], Ebx
  17.          cld
  18.          test eax,eax
  19.          mov edi,[ebx].pcHwndNeeded         ; N
  20.          .if !Zero?
  21.                  leave
  22.                  jmp Fleave
  23.          .endif
  24.          mov edi,D[edi]
  25.          mov N,eax
  26.          .if Edi
  27.                  mov esi,[ebx].phwndFirst
  28.                  .repeat
  29.                         lodsd
  30.                         lea ecx,Pid
  31.                         push ecx
  32.                         push eax
  33.                         Call g_UserApi.pGetWindowThreadProcessId
  34.                         .if Eax
  35.                               invoke IsProtectedProcess, Pid
  36.                               test eax,eax
  37.                               jnz @f
  38.                               invoke IsDebugProcess, Pid
  39.                               .if Eax
  40.                         @@:
  41.                                    ; Удаляем описатель из массива.
  42.                                    mov eax,edi
  43.                                    mov ecx,edi
  44.                                    mov edx,esi
  45.                                    lea edi,[esi - 4]
  46.                                    rep movsd
  47.                                    mov edi,eax
  48.                                    lea esi,[edx - 4]
  49.                                    inc N
  50.                               .endif
  51.                         .endif
  52.                         dec edi
  53.                  .until Zero?
  54.                  mov eax,N
  55.                  mov ecx,[ebx].pcHwndNeeded
  56.                  sub D[ecx],eax
  57.          .endif
  58.          leave
  59.          jmp FleaveOk
  60. pNtUserBuildHwndList endp


Можно конечно таблицами эти сервисы запилить, но это весьма не труъ. Их можно получить иначе, для примера выше - обёртка EnumWindows(). Значит при инициализации мы дёргаем эту апи, а в процедуре фильтрации сохраняем ID.

Ещё одна проблема есть с шадовом, это стартап кода, до загрузки юзер32. Например из верифера или при инжекте в процессы. Если поток не GUI, тоесть вызывает теневой сервис в первый раз, а как следствие и апи user/gdi, то это приведёт к крэшу - ядро вызовет колбек в юзермод(apfnDispatch[]), а так как юзер не проинициализирован и массив векторов не загружен, всё отвалится.
Посему шадов можно дёргать только после инициализации user32. И это событие нужно отловить, если есть необходимость свой код выполнять раньше например инициализации статики. Решается просто - описывается слепком UserClientDllInitialize(), она же дллмейн; фильтр для всякого теневого сервиса раскручивает стек и находит вызов из этой процедуры. Если это обнаружено, то выполняется маршрутизация - это ожидание возврата из процедуры. Когда тред вернётся в загрузчик, он покинет дллмейн юзер32, то только тогда можно юзать шадов.

В целом в этом сложного ничего нет.



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 29 ноября 2013 02:19
· Личное сообщение · #10

Dr0p пишет:
Кодес для скрытия дебаггера
...
Не знаю что может быть не понятно, я же всё подробнейшим образом разжевал.

Запили готовый плагин к ольке и 99,9% вопросов отпадут сами собой, в том же стронге тыкают себе флажки и большинству пох, как оно работает.

| Сообщение посчитали полезным: bizdon


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 29 ноября 2013 02:23 · Поправил: Dr0p
· Личное сообщение · #11

F_a_u_s_t

Плаг не заведётся в контексте процесса да есчо и до старта кернел. Более того, весь запуск сводится к копированию дллки в сис32 и созданию ключа в реестре. Да и плаги я хз как собирать, никада это не изучал.



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 29 ноября 2013 02:32
· Личное сообщение · #12

Dr0p пишет: Плаг не заведётся в контексте процесса да есчо и до старта кернел
Дык никто не говорит, что код нужно засунуть в dll, туда впихнуть установку драйвера с конфигурацией.
Примеров плагинов куча на том же масме, если нужно могу у себя глянуть исходники.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 29 ноября 2013 02:33
· Личное сообщение · #13

F_a_u_s_t

Так а зачем плаг ваще тогда нужен, если он к отладчику никакого отношения не имеет.. да и дебаггер же не обязательно олли.



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 29 ноября 2013 02:39
· Личное сообщение · #14

Dr0p пишет: Так а зачем плаг ваще тогда нужен, если он к отладчику никакого отношения не имеет
Установщик с луна-парком, что бы избавит себя от вопросов, как установить и как использовать.
Олли не обязательно, но в основном ее то используют.
Хз, сам смотри.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 29 ноября 2013 02:45 · Поправил: Dr0p
· Личное сообщение · #15

F_a_u_s_t

Лишнее это имхо. Имя поменять в реестре не проблема

Я вообще плаги не юзаю никогда. У меня конпилер все задачи быстро решает

Наверно самый не проработанный нюанс это опции. Тоесть их много:

Code:
  1. RANDOM_DELTA_MASK          equ 11B ; [1 % 4], Max. dTSC
  2.  
  3. OPT_STACK_ALIGN     equ 4     ; Выравнивание стека.
  4.  
  5. ; Обязательная опция!
  6. ; Корректировка смещения для отладочного билда.
  7. OPT_DEBUG_BUILD     equ TRUE
  8.  
  9. OPT_ENABLE_RF            equ TRUE   ; Разрешает установку RF(инструкция скипается) при возврате из сисколов.
  10.  
  11. OPT_ENABLE_SEP         equ TRUE  ; Коррекция rEcx & rEdx для фастколов.
  12.  
  13. OPT_FAST_SNAPSHOT          equ TRUE         ; Отключает рефреш буфера в GetSnapObjects().
  14.  
  15. OPT_SUSPEND_SYSTEMTIME     equ TRUE     ; Эмуляция SystemTimeOfDayInformation.
  16.  
  17. OPT_ENABLE_DBG_LOG                 equ TRUE        ; Разрешает отладочный вывод.
  18.  
  19. OPT_LOG_SETTIMER   equ TRUE ; Лог NtSetTimer.
  20.  
  21. OPT_LOG_WAITERS     equ TRUE  ; Лог сервисов, выполняющих задержку.
  22.  
  23. OPT_BREAK_STARTUP          equ TRUE         ; Останов в DLL_PROCESS_VERIFIER.
  24.  
  25. OPT_CLEAR_DBG            equ TRUE   ; Очистка PEB.BeingDebugged при вызове фильтра.
  26.  
  27. OPT_LOCAL_BREAK     equ TRUE  ; Останов посредством Int3, а не DbgBreakPoint(eg Obsidium 1.4).
  28.  
  29. ;OPT_ENABLE_RWL equ TRUE ; Разрешает использовать RWL синхронизаю.
  30.  
  31. OPT_HIDE_THREAD     equ TRUE  ; Скрытие удалённого потока(DbgUiRemoteBreakin()).
  32.  
  33. OPT_ENABLE_DIALOG          equ TRUE         ; Разрешает вывод диалога.
  34.  
  35. ;OPT_DISABLE_BREAKS equ TRUE ; Запрещает останов по Int3.
  36.  
  37. OPT_THREAD_LIST     equ TRUE  ; Аллокация тлс при старте потоков.
  38.  
  39. ;OPT_FAST_TSC equ TRUE ; Замена rdtsc на эмулирующий код.
  40.  
  41. FAST_TSC_LIMIT         equ 8     ; Лимит rdtsc, после которого выполняется замена ^
  42. TROUTE_DELAY               equ 128     ; Лимит циклов NtYieldExecution при захвате контекстов.
  43.  
  44. ;OPT_NO_TRACE equ TRUE ; Сброс TF, вне зависимости от причины останова.
  45. ...


И нужно ребилдить при изменении каждой, что есно не имея сурсов сделать не получится. Наверно нужно будет их динамическими сделать.



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 29 ноября 2013 02:56
· Личное сообщение · #16

Dr0p пишет: У меня конпилер все задачи быстро решает
Python не многим медленнее.

Dr0p пишет: Наверно нужно будет их динамическими сделать.
Дык, а в чем сложность запилить if ( OPT_ENABLE_DBG_LOG == TRUE ) { write_dbg_log(); } ?
ну кроме лени конечно.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 29 ноября 2013 03:08
· Личное сообщение · #17

F_a_u_s_t

> Python не многим медленнее.

У него не системная область юзания, это же скрипт.)

> Дык, а в чем сложность запилить if ( OPT_ENABLE_DBG_LOG == TRUE ) { write_dbg_log(); } ?

Не совсем просто. Некоторые опции весьма сильно изменяют обработку, что в статике гораздо проще сделать на макро.

| Сообщение посчитали полезным: dosprog

Ранг: 2.2 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 29 ноября 2013 13:13
· Личное сообщение · #18

т.е в текущей реализации нельзя дернуть какую-нибудь flt.dll и от определённого приложения (или даже от всей системы) залогировать апи в файл? нужно все самому закодить используя основой уже готовую дровину?



Ранг: 2.2 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 29 ноября 2013 13:20
· Личное сообщение · #19

лично мне данный инструмент будет полезен, т.к достаточно часто приходится реверсить нечто, использующее sysenter и вызовы ntdll - на это уходит много времени (даже до понимания того в каком порядке какие функи юзаются может до пары часов уйти)




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 29 ноября 2013 13:56
· Личное сообщение · #20

priag

Flt.dll это тулза для анти анти дебага. В принципе ничего не мешает добавить необходимую апи/сервис, но для этого нужно иметь сурсы её. Вы можите собрать свой фильтр, конпилите длл, в процедуре фильтрации определяете нужный вам сервис. Закончу разбирать аверскую дровину, сделаю вам шаблон.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 29 ноября 2013 15:39 · Поправил: Dr0p
· Личное сообщение · #21

Вот шаблон.



4c41_29.11.2013_EXELAB.rU.tgz - Model.zip




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 29 ноября 2013 16:00 · Поправил: Dr0p
· Личное сообщение · #22

Загрузочный лог(OPT_CHECK_BUILD) блокнота:

--> Link <--

Debug string: Filter(NTID{Rva: 0xDE8E, Id: 0x103, Name: ZwTestAlert}
Debug string: Fret): 0x103
Debug string: Filter(NTID{Rva: 0xD05E, Id: 0x20, Name: ZwContinue}
Debug string: Fret): 0x20

- поток покинул стартап апк.




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 29 ноября 2013 21:01 · Поправил: Rainbow
· Личное сообщение · #23

Я просто в осадке с этой темы ))) Dr0p иди пойди в автомастерской моторы пособирай )) может хоть там от тебя польза будет ))))

P.S. Dr0p пишет:
Плаг не заведётся в контексте процесса да есчо и до старта кернел.


А почему бы из плага-длл не загрузиться в ядро ?

Dr0p пишет:
Более того, весь запуск сводится к копированию дллки в сис32 и созданию ключа в реестре.


Нахера ей там делать в сис32 че она там забыла ?

Да и плаги я хз как собирать, никада это не изучал.

...



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 30 ноября 2013 02:09
· Личное сообщение · #24

Rainbow пишет: Dr0p иди пойди в автомастерской моторы пособирай ))
Да нормальный Инде мужик, зря так травите его, покрайне мере, в отличии от школяров если он где то не прав, то 99,9% прочитает матчасть, за что ему респект.



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 30 ноября 2013 02:17
· Личное сообщение · #25

Dr0p пишет: У него не системная область юзания, это же скрипт.)
Дык это понятно, никто и не говорит, что нужно собирать на нем дрова, просто удобный ( для меня ) способ автоматизации рутины.
Раньше не перле говнокодил, но сцуко со своими $ @ неудобен что звездец и располагает к говнокоду, а так никто не говорит о замене с\с++ асму, хотя иногда дрова загружаю из скрипта.)




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 30 ноября 2013 03:46 · Поправил: Модератор
· Личное сообщение · #26

Rainbow

> А почему бы из плага-длл не загрузиться в ядро ?

И что дальше делать ?

Сабж создан для того, чтобы перенести обработку в юзермод.



Ранг: 431.7 (мудрец), 391thx
Активность: 0.730.32
Статус: Участник

Создано: 30 ноября 2013 07:25
· Личное сообщение · #27

) Ну, в автомастерскую ещё поди не устроишься, там нездоровая конкуренция. Дело-то не особо хитрое.
Обойдутся там без Dr0p'a. Пускай всё остаётся, как есть.



Ранг: 2.2 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 30 ноября 2013 15:53
· Личное сообщение · #28

Dr0p, спасибо за шаблон, но что-то завести его у меня не получилось. Сорри за нубство, но как юзать? Допустим, есть у меня тушка, которая через сисентер получает список процессов и через тот же сисентер сохраняет в файл. Хочу отмониторить с помощью мотора эти действия. Как?



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 30 ноября 2013 20:50
· Личное сообщение · #29

priag пишет:
но что-то завести его у меня не получилось

так с этом и соль. Dr0p пишет: Чтоб его юзать надо немного покодить это типа я написал gui - на дельфи например, компанентов бы накидал на форму мышкой, но функционал к гую пилите сами .
как в старые добрые времена клерк пилилт что-то пилит, а запиленного - так чтоб юзать - ничего небыло и нет




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 01 декабря 2013 02:02
· Личное сообщение · #30

priag

Что именно не получилось. Таким же образом, как вы выше заводили

> Хочу отмониторить с помощью мотора эти действия. Как?

Добавляете ссылку в массив нтапи(ZwList[]) на имя и хэш от имени. В батник дописываете свой обьектник(.obj) и дефейните прототип(public/extern blabla). Потом билдите. Если код на масме, то не вижу никаких проблем.

> а запиленного - так чтоб юзать - ничего небыло и нет

Тонны готового кода есть. Если ты про гуй, где мыщем по кнопкам тыкать, то да, такого у меня нет. Я последний раз гуй собирал пару лет назад.



Ранг: 2.2 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 02 декабря 2013 15:33 · Поправил: priag
· Личное сообщение · #31

Получилось завести только в отладчике (flt в АП процесса для исследования, а его в отладчик, тогда сыпятся дбг-алерты и пишется лог), а вот если взять из второго сообщения темы CUI версию и поменять flt на шаблон (последнее сообщение), то будет ошибка:
The procedure entry point g_Init could not be located in the dynamic link library Flt.dll.

Глянь в Личные сообщения


<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 13 . 14 . >>
 eXeL@B —› Софт, инструменты —› SIDE.
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати