Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Протекторы —› Статическая трассировка кода
<< . 1 . 2 . 3 . 4 . 5 . 6 . >>
Посл.ответ Сообщение


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

Создано: 11 декабря 2017 18:39 · Поправил: Boostyq
· Личное сообщение · #1

Всем привет,
Изучаю x86 драйвер, он защищен с помощью vmp
Случай достаточно простой, только некоторые функции мутированы (обфусцированы?), даже нет внешней упаковки
Для того чтобы посмотреть обфускацию целиком, нужна трасса от и до
Дебажить его у меня нет возможности, да и вообще хочу попробовать сделать это статически
Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций (операции стека, прыжки, вызовы), который бы "выполнял" код до тех пор пока не встретиться выход из функции
Правда не ясно что делать c вызовами API, stdcall мы же очищаем стек, но вот с другими соглашениями?
Дело даже не в проте, а вообще в целом
Я пыталась делать парсер конкретных команд под конкретный прот, но дело в том, что это не возможно реализовать, ибо число нелогичных приемов может быть очень большое, поэтому нужно спуститься на самый нижний уровень, для того чтобы выполнять код как сам процессор это делает
Возможно кто-то даст дельный совет, может кто-то уже делал подобное?
Так же я пыталась найти псевдо-код, как процессор выполняет команды, т.к. вмпрот любит использовать редкие команды, может у кого то есть линки?
Спасибо

-----
В облачке многоточия




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 16 декабря 2017 20:14
· Личное сообщение · #2

difexacaw пишет: я говорил про снятие профайла

Все замечательно, только ТС не упоминал rtime от слова совсем, в данный момент задача в анализе блоков, а в этой задаче rtime не требуется.




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

Создано: 16 декабря 2017 20:16
· Личное сообщение · #3

SegFault

Я не даун. Почему вы меня так называете. Я не побежал стучать", а отписал об вашем удалении. Вы тут помеха в серьёзной теме, клоун если прямо сказать. Меня не приняли в модеры, поэтому я не могу провести чистку. Это должны сделать другие люди.

Добавлено спустя 3 минуты
shellstorm

Я ответил тс в виде совета и привёл пример. Дальше начались не нормальные вопросы про профайл. Но это не решает задачу. Всё равно остаётся вопрос стабильности. А главное сама архитектура - зачем эмулить каждую инструкцию, если это может сделать cpu ?

-----
vx




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

Создано: 16 декабря 2017 20:25
· Личное сообщение · #4

difexacawdifexacaw пишет:
Я не даун. Почему вы меня так называете.

потому что уровень интеллекта такой, вероятно воздействие норкотеков или других препаратов сказалось, вы же на них сидели одно время ( а стало быть и по сей день )
difexacaw пишет:
Всё равно остаётся вопрос стабильности. А главное сама архитектура - зачем эмулить каждую инструкцию, если это может сделать cpu ?

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

Все что нужно ТС это взять нормальный фреймворк, позволяющий делать анализ и свертку кода ( symbolic execution + jitter (эмулятор) ), ознакомиться с примерами и снять обфускацию. Скорее всего даже солвера хватит для этого. Свои инструменты мб тоже можно пописать, чисто для самообразования, в этом ничего плохого нет.




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

Создано: 16 декабря 2017 20:29
· Личное сообщение · #5

shellstorm пишет:
Все замечательно, только ТС не упоминал rtime от слова совсем, в данный момент задача в анализе блоков, а в этой задаче rtime не требуется.

Угу, я говорю именно про то, чтобы сделать это статически
difexacaw пишет:
Я ответил тс в виде совета и привёл пример. Дальше начались не нормальные вопросы про профайл. Но это не решает задачу. Всё равно остаётся вопрос стабильности. А главное сама архитектура - зачем эмулить каждую инструкцию, если это может сделать cpu ?

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

-----
В облачке многоточия





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

Создано: 16 декабря 2017 20:29
· Личное сообщение · #6

SegFault

Вам же дали понять что сюда не нудно отвечать бредом. Значит вы не понимаете.

-----
vx




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

Создано: 16 декабря 2017 20:32
· Личное сообщение · #7

difexacaw
ты слился, несите следующего
Boostyq
Всё так, попробуйте https://github.com/cea-sec/miasm, там есть и SE и эмуляция, а также куча примеров. Думаю, это сэкономит не мало времени на собственную реализацию эмуля

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

Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 16 декабря 2017 20:35
· Личное сообщение · #8

Boostyq пишет: Угу, я говорю именно про то, чтобы сделать это статически

Никсы, но хз, может пригодится, при написании sbi обычно отталкиваются от этого проекта https://github.com/mlaurenzano/PEBIL



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

Создано: 16 декабря 2017 20:37
· Личное сообщение · #9

Boostyq
Еще есть Metasm, с помощью него недавно неплохая статья вышла по деобфускации VM в ci.dll (виндовая security либа ), но там ruby и я не помню есть ли эмулятор.




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

Создано: 16 декабря 2017 20:38 · Поправил: difexacaw
· Личное сообщение · #10

Boostyq

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

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

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

-----
vx




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 16 декабря 2017 20:39
· Личное сообщение · #11

SegFault пишет: но там ruby

Есть python порт.



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

Создано: 16 декабря 2017 20:42
· Личное сообщение · #12

shellstorm
Ссылкой не поделитесь? в доках пишут что он full ruby




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

Создано: 16 декабря 2017 20:46 · Поправил: difexacaw
· Личное сообщение · #13

Boostyq

> символическое исполнение

Это мощная техника, но в вашей задаче она не нужна. Это глубокое абстрагирование от кода, связывание потока данных и их свёртка. Не туда смотрите

-----
vx




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 16 декабря 2017 20:59
· Личное сообщение · #14

SegFault пишет: Ссылкой не поделитесь? в доках пишут что он full ruby

Оригинал да, а порт, хз, я название не помню, автор свое придумал, в крайнем случае есть бридж который позволяет использовать ruby библиотеки в python, правда на счет его стабильности не знаю, никогда не пользовался, приходилось только java бриджем пользоваться.



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

Создано: 16 декабря 2017 21:04
· Личное сообщение · #15

difexacaw пишет:
Это мощная техника, но в вашей задаче она не нужна. Это глубокое абстрагирование от кода, связывание потока данных и их свёртка. Не туда смотрите

дибил это тебя забанить надо за тупые советы, все VM разбираются в настоящее время через SE(тот же вмпрот), а не твоим визором глючным

Добавлено спустя 2 минуты
SSTIC2017_Deobfuscation_of_VM_based_software_protection.pdf вот дока в качестве подтвержения тебе крелк, а дибил это не оскорбление, это совокупность выводов о тебе, знаешь как нейросеть, собирая признаки выдает вердикт, вот это и есть вердикт




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 декабря 2017 21:23
· Личное сообщение · #16

metasm на руби
miasm на питоне




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

Создано: 16 декабря 2017 23:59 · Поправил: Boostyq
· Личное сообщение · #17

SegFault пишет:
все VM разбираются в настоящее время через SE

Там даже видео есть
Правда ничего практического оттуда черпнуть нельзя, все, что ясно - надо изолировать код из функции и затем его прогнать через оптимизацию
При этом информации на русском одна статья, и та переведенная...
Кстати что такое вообще этот визор?

-----
В облачке многоточия




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 17 декабря 2017 01:03
· Личное сообщение · #18

Boostyq пишет: Там даже видео есть

у автора есть хаб на github и там есть проект атаки на vm.

Boostyq пишет: Кстати что такое вообще этот визор?

Забрало у шлема, у не курильщиков это монитор виртуальных машин\софта.

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


Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 17 декабря 2017 02:43 · Поправил: ClockMan
· Личное сообщение · #19

difexacaw пишет:
зачем эмулить каждую инструкцию, если это может сделать cpu ?

+
Нормальный эмуль так и работает получил размер выполнил инструкцию на CPU, записал данные в эмуль,быстро и надёжно а тупо эмулировать каждую инструкцию это жесть если там будет куча VRNDSCALEPD и т.д то обосра*ся можно

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





Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 17 декабря 2017 04:09
· Личное сообщение · #20

shellstorm пишет:
у автора есть хаб на github и там есть проект атаки на vm


Пожалуйста, ссылку можно?

-----
Give me a HANDLE and I will move the Earth.




Ранг: 15.8 (новичок), 3thx
Активность: 0.030.01
Статус: Участник

Создано: 17 декабря 2017 04:55
· Личное сообщение · #21

ClockMan пишет:
Нормальный эмуль так и работает получил размер выполнил инструкцию на CPU

pop word [rsp+rcx*4-0xFF345678]

?

Раскодировать ModR/M + SIB (согласно докам так называется) таки придется, чтоб колбэк слать: намечается доступ - нужен фэйковый/реальный адрес, но сначала вычислить нужно и вообще это из памяти в память - 2 адреса уже.

Т.е. надо какую-нибудь фичу сигнальную в железе.
Тут ещё смысл в том, чтобы побрутфорсить код или vm-ленту, сделать компактные undo/redo, зная куда записано было.




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

Создано: 17 декабря 2017 05:53 · Поправил: difexacaw
· Личное сообщение · #22

bizkitlimp

> pop word [rsp+rcx*4-0xFF345678]

MRM раскодируется общим способом для всех инструкций. Таким же общим способом может быть изменена адресная компонента и инструкция или их массив отправлена в процессор на выполнение. А эмулировать каждую как то глупо.

Добавлено спустя 5 минут
Code:
  1. ; +
  2. ; Decode effective address from ModR/M.
  3. ;
  4. ; o Return Rn as TSTATE index(inv).
  5. ;
  6.          assume fs:nothing
  7. DiMrmToEa32 proc uses ebx esi edi pModRM:PVOID, Ea:PEA
  8.          mov ebx,pModRM
  9.          xor edi,edi
  10.          movzx eax,B[ebx] ; ModR/M
  11.          mov esi,Ea
  12.          mov edx,eax
  13.          assume esi:PEA
  14.          and [esi].Flags,NOT((1 shl EA_FETCH) or (1 shl EA_BASE) or (1 shl EA_INDEX) or (1 shl EA_DISP8) or (1 shl EA_DISP32))
  15.          not al
  16.          rol dl,2
  17.          and al,MODRM_RM  ; R/M
  18.          and dl,(MODRM_MOD shr 6)  ; MOD
  19.          bts [esi].Flags,EA_FETCH
  20.          mov dh,dl
  21.          jz Mod00
  22.          dec dl
  23.          jz Mod01
  24.          dec dl
  25.          jz Mod10
  26. Mod11:
  27.          btr [esi].Flags,EA_FETCH
  28.          mov [esi].Base,eax
  29.          bts [esi].Flags,EA_BASE
  30. Exit:
  31.          mov eax,edi
  32. ; test [esi].Flags,-1
  33.          ret
  34. Mod00:
  35.          cmp al,MODRM_RM and NOT(101B)
  36.          je Mod00_101
  37.          Call SIB
  38.          jmp Exit
  39. Mod00_101:
  40.          bts [esi].Flags,EA_DISP32
  41.          mov [esi].Disp,1
  42.          jmp Exit
  43. Mod01:
  44.          Call SIB
  45.          inc edi
  46.          bts [esi].Flags,EA_DISP8
  47.          mov [esi].Disp,edi
  48.          jmp Exit
  49. Mod10:
  50.          Call SIB
  51.          inc edi
  52.          bts [esi].Flags,EA_DISP32
  53.          mov [esi].Disp,edi
  54.          jmp Exit
  55. SIB:
  56.          .if Al == MODRM_RM and NOT(100B)
  57.                  movzx eax,B[ebx][1]      ; SIB
  58.                  mov ecx,eax
  59.                  not al
  60.                  push eax
  61.                  rol cl,2
  62.                  shr eax,1
  63.                  and ecx,(SIB_SCALE shr 6)         ; Scale
  64.                  and eax,(SIB_INDEX shr 1)         ; Index
  65.                  .if Al != (NOT(100B shl 2) and (SIB_INDEX shr 1))
  66.                         shr eax,2
  67.                         or [esi].Flags,(1 shl EA_INDEX)
  68.                         mov [esi].Scale,ecx
  69.                         mov [esi].Index,eax
  70.                  .endif
  71.                  pop ecx
  72.                  and cl,SIB_BASE
  73.                  .if (Cl == (SIB_BASE and NOT(101B))) && !Dh          ; MOD: 00
  74.                         mov [esi].Disp,2
  75.                         bts [esi].Flags,EA_DISP32
  76.                         add edi,4
  77.                  .else
  78.                         mov [esi].Base,ecx
  79.                         bts [esi].Flags,EA_BASE
  80.                  .endif
  81.                  inc edi
  82.          .else
  83.                  mov [esi].Base,eax
  84.                  bts [esi].Flags,EA_BASE
  85.          .endif
  86.          retn 0
  87. DiMrmToEa32 endp
  88.  
  89. ;
  90.  
  91. DiDecode proc uses ebx esi Ip:PVOID, Ia:PIA
  92.          mov ebx,Ia
  93.          assume ebx:PIA
  94.          mov esi,Ip
  95.          and [ebx].Ea.Flags,0
  96.          invoke DiDisasm, Ip, Ebx
  97.          lea esi,[esi][eax]               ; @Opcode
  98.          jz Fail
  99.          movzx eax,B[esi]
  100.          .if Carry?       ; MRM
  101.          
  102.                  ; Calc offset to MRM.
  103.                  
  104.                  push esi
  105.                  .if Al == 0FH   ; 2B-esc.
  106.                         movzx eax,B[esi][1]
  107.                         .if (Al == 38H) || (Al == 3AH)   ; 3B-esc(66 pfx).
  108.                               inc esi       
  109.                         .endif
  110.                         inc esi
  111.                  .endif
  112.                  inc esi
  113.                  invoke DiMrmToEa32, Esi, addr [Ebx].Ea
  114.                  pop ecx
  115.                  bts [ebx].Ea.Flags,EA_MODRM
  116.                  movzx eax,B[ecx]
  117.                  mov edx,esi
  118.                  .if (Al == 8DH) || ((Al == 0FH) && (B[Ecx][1] == 1FH))       ; LEA & NOP
  119.                         btr [ebx].Ea.Flags,EA_FETCH
  120.                  .endif
  121.                  sub edx,ecx
  122.                  mov [ebx].Opcodes,edx
  123.          .else
  124.                  .if (Al >= 0A4H && Al <= 0A7H) || (Al >= 0ACH && Al <= 0AFH) ; str.
  125.                         bts [ebx].Ea.Flags,EA_XY
  126.                         mov [ebx].Ea.Base,eax
  127.                         bts [ebx].Ea.Flags,EA_FETCH
  128.                  .elseif (Al >= 0A0H) && (Al <= 0A3H)       ; MOV(offset in imm).
  129.                         bts [ebx].Ea.Flags,EA_DISP32
  130.                         mov [ebx].Ea.Disp,1
  131.                         bts [ebx].Ea.Flags,EA_FETCH
  132.                  .endif
  133.          .endif
  134.          mov eax,esi
  135.          sub eax,Ip
  136.          add [ebx].Ea.Disp,eax     ; +(offset to MRM)
  137.          ret
  138. Fail:
  139.          int 3
  140. DiDecode endp


-----
vx




Ранг: 15.8 (новичок), 3thx
Активность: 0.030.01
Статус: Участник

Создано: 17 декабря 2017 07:17
· Личное сообщение · #23

И после коррекции инструкции, которая с памятью, она внезапно запишет куда-то во внутренний сторадж. Я так понял, ассоциация типа map<uint64, uint64> (значение памяти/реальный источник). Так-то да, для тем более пакетного исполнения конечно unicorn там взять, готовое.

Эмуляция доступней как быстрокостыль: кода немного или понять хоть что-то в начале (если самому делать). Медленно / куча своих же ошибок эт 100%.




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

Создано: 17 декабря 2017 12:36 · Поправил: Boostyq
· Личное сообщение · #24

ClockMan пишет:
+
Нормальный эмуль так и работает получил размер выполнил инструкцию на CPU, записал данные в эмуль,быстро и надёжно а тупо эмулировать каждую инструкцию это жесть если там будет куча VRNDSCALEPD и т.д то обосра*ся можно

Я понимаю, у меня нет пока проблем с эмуляцией, магические прыжки он вычисляет, фиктивные может пропускать, стек эмулирует, при вызове апи выравнивает стек
Я не спорю, ошибок там миллион, так как что-то портировалось с си на питон, что-то по докам, которые не всегда верные
Все застряло на анализе веток, оказалось что анализировать ветку лишь однажды вовсе неверно, тут нужен более умный анализ, который закончит экстракцию кода, уже потом можно думать о сворачивании

-----
В облачке многоточия





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 17 декабря 2017 12:57 · Поправил: Bronco
· Личное сообщение · #25

ClockMan пишет:
получил размер выполнил инструкцию на CPU

наверное всё таки подразумевался блок_список инструкций(по сути шаблон_паттерн), чтобы свернуть_оптимизировать блок , ибо эмулить, одну инструкцию как-то тоже не вижу смысла.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





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

Создано: 17 декабря 2017 14:43 · Поправил: difexacaw
· Личное сообщение · #26

Boostyq

Для построения графа, те описания всего кода от изначальной точки используется конструктор. Он проходит по всем ветвям, выделяя таким образом весь код. Проблемой может быть выделение массива векторов(case-конструкции). Для выделения кода, который выполняет визор нужен кэш инструкций. Это битовая карта, которая отображается на всё ап, причём она должна расширяться для экономии памяти, так как имеет большой размер. Каждая инструкция(адрес) помечается в этой карте, так же там может сохраняться инфа декодера, что бы повторно не раскодировать Ip. Далее на основе этих адресов(битмапы) начинается сборка графа конструктором. Уже описанные адреса конструктор не обрабатывает. Для таких манипуляций нужно использовать AVL деревья, иначе будут большие тормоза.

Я использовал следующую модель кэша:

--> Link <--

Кстате может показаться странным, сохранение инфы декодера в битовой карте(использование её) почти не влияет на профайл.

-----
vx




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 17 декабря 2017 15:01
· Личное сообщение · #27

plutos пишет: Пожалуйста, ссылку можно?

https://github.com/JonathanSalwan/Tigress_protection

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

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

Создано: 17 декабря 2017 23:37
· Личное сообщение · #28

difexacaw пишет:
Для построения графа, те описания всего кода от изначальной точки используется конструктор.

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

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 17 декабря 2017 23:50
· Личное сообщение · #29

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

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





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

Создано: 18 декабря 2017 00:06 · Поправил: Boostyq
· Личное сообщение · #30

Bronco пишет:
VodoleY, задача ТС собрать промежуточный код, фильтруя "хвосты" примитивов гавнопрота. но в прежних билдах активно юзалась стрела пирса., отсюда ветвления.
для статичесого сбора. надо знать структуру и обработку ленты, для динамики выходом из цикла только передача управления с ресторе контекста цпу.

На данный момент удалось дойти до конца, трейсер прошел все ветви
Нет уверенности, что все верно, так же видно и очевидные ошибки
Получилось около 50.000 строк ассемблера, при это всего 5 вызовов апи внутри, при этом известные мне приемы занимают всего около 8.000 строк
Некоторые приемы обфускации понятны, убрать все руками реально
Но такой большой объем всего для одной функции, слишком дорого делать вручную
Пока не знаю, что дальше делать

-----
В облачке многоточия




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

Создано: 18 декабря 2017 00:58 · Поправил: dosprog
· Личное сообщение · #31

Ну, можно это всё распечатать, например. Да мало ли что ещё


<< . 1 . 2 . 3 . 4 . 5 . 6 . >>
 eXeL@B —› Протекторы —› Статическая трассировка кода
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати