Русский / Russian English / Английский

Сейчас на форуме: _MBK_, Bad_guy, HaRpY (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Протекторы —› VMProtect 3.2: запуcтить приложение и остановить его на указанном адресе
<< . 1 . 2 . 3 .
Посл.ответ Сообщение


Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 22 ноября 2018 10:47 New!
Цитата · Личное сообщение · #1

Доступ к оригинальному коду приложения защищенного любым протектором до недавнего времени выполнялся довольно просто - любой дебагер с защитой от антидебага и далее дело техники, поиск ОЕП, бряк и дамп.
Сейчас же протекторы сделали шаг вперед и вся защита от антидебага уже не действует. Конкретный пример, вмпрот версии 3.2 + x64dbg + ScillaHide дает отрицательный результат что при прямом старте, что при аттаче. Драйверный же TitanHide на Windows 10 вообще не удается установить. Пока найдено такое решение вопроса - запуск приложения, дамп его процесса, загрузка в дебаг/дизасм и реверс кода. Довольно хорошая утилитка для этого имеется, например --> Process Dump <--. Но с восстановлением импорта в ней имеются недоработки, местами ломает код самого приложения, но решение тоже имеется - делать два дампа, один с импортом для дизасма, а второй без импорта для дебагера. Всё прекрасно и всё работает, основная задача получить доступ к оригинальному коду для его исследования решена. Но есть одно но, в данном случае теряется начальная инициализация статических переменных, а их первоначальное значение важно для правильного реверса кода. Вопрос, имеются ли какие либо инструменты позволяющие запуcтить приложение и остановить его на указанном адресе?
Была тут одна интересная тема от Инде по поиску ЕП, но он её закрыл. В принципе, я думаю, эту задачу его визору решить по силам, только нужно изменить формулировку, не искать ОЕП, т.к. в общем случае её может и не быть, а довести приложение до заданного адреса.


Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 6 декабря 2018 23:19 New!
Цитата · Личное сообщение · #2

Да вы чего, по таким трассам изучать защиту, 55 * 5078 ~= 280тыс инструкций говна, из них будет чистого кода порядка 1000 инструкций.


Ранг: 327.4 (мудрец)
Статус: Участник

Создано: 6 декабря 2018 23:40 · Поправил: difexacaw New!
Цитата · Личное сообщение · #3

gggeorggge

Спасибо.

Я имел ввиду иное. Такой кусок можно и отладчиком выдрать. Как оно работает в целом, в реальном времени и есчо скажите, не важны нюансы, но оно под данной тулзой доходит до запуска, тоесть пин проходит слой пакера ?

Добавлено спустя 16 минут
Vamit

Если оно работает, то можно свернуть.


Ранг: 545.1 (!)
Статус: Участник
оптимист

Создано: 7 декабря 2018 00:12 New!
Цитата · Личное сообщение · #4

Vamit пишет:
То что ты писал - это частично и сидит оно далеко и глубоко, после микст кода, и это далеко ещё не всё, а разбирать код в середине вм не зная ни истинных регистров, ни инструкций способны только мозахисты

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


Ранг: 327.4 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 00:32 · Поправил: difexacaw New!
Цитата · Личное сообщение · #5

ClockMan

Не нужно обобщать. Антидамп"(анклав, подмена данных через их выборку) он не решил, как и никто иной, понятие ввёл я, как и саму технику. А антиотладка - просто забудь про это, используй норм инструменты.


Ранг: 669.3 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 7 декабря 2018 01:50 New!
Цитата · Личное сообщение · #6

difexacaw

Не смог бы в вашем мире по понятиям я жить

Ранг: 18.4 (новичок)
Статус: Участник

Создано: 7 декабря 2018 07:14 · Поправил: gggeorggge New!
Цитата · Личное сообщение · #7

Vamit пишет:
Да вы чего, по таким трассам изучать защиту, 55 * 5078 ~= 280тыс инструкций говна, из них будет чистого кода порядка 1000 инструкций.

Это просто пример полной трассировки, никто не мешает превратить это в компактный трейс.
Вот в такой например:
opcode 0x5f12c8 0x604fcb
Read 0 = *(UINT32*)0012FBA4 0
Write *(UINT32*)0012FAE8 = 0
opcode 0x5e6c0c 0x604fc6
Read 0x12ff98 = *(UINT32*)0012FBA8 0
Write *(UINT32*)0012FB04 = 0x12ff98
opcode 0x5ef943 0x604fc1
Read 0x400000 = *(UINT32*)0012FBAC 0
Write *(UINT32*)0012FAFC = 0x400000
opcode 0x5f1ea6 0x604fbc
Read 0x7c809bd7 = *(UINT32*)0012FBB0 0
Write *(UINT32*)0012FB20 = 0x7c809bd7


Ранг: 572.4 (!)
Статус: Участник
_Вечный_Студент_

Создано: 7 декабря 2018 07:54 · Поправил: plutos New!
Цитата · Личное сообщение · #8

difexacaw пишет:
Антидамп"(анклав, подмена данных через их выборку)


пожалуйста обьясните, что означает термин "анклав" в данном контексте и откуда он взялся, а то я уже совсем запутался.
В общепринятом смысле "анклав" - это территория одного государства, полностью окруженная территорией другого.
Разнобой в терминологии ведет к непониманию и недоразyмениям.


Ранг: 327.4 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 08:46 · Поправил: difexacaw New!
Цитата · Личное сообщение · #9

plutos

Есть 4-ре публикации на васме.

Суть в том, что память(те данные в ней) существует лишь при её выборке(data fetch). Выборка может быть отслежена и изменена на уровне потока инструкций. Тогда выборка изменяется и таким образом реализуется софтверный анклав. Это не существующая область памяти, либо обычно иная, нежели та, которая адресуется. А так как виртуальный" блок формируется при самой выборке, то никаким образом его нельзя прочитать без выборки в том же режиме. Примеров было достаточно.

Добавлено спустя 40 минут
plutos

Были обсуждения про не ясное описание.

Если углубиться в тех. детали, то это работает следующим образом.

Адресная трансляция выполняется на уровне декодера инструкций, у неё есть формат - modrm.

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

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

Адресная компонента может измяться двумя путями - по контексту или по кодировке инструкции. В первом случае для реализации нужен эмулятор, так как адресный регистр может быть приёмником данных(reader), нп: add r,[r]. Во втором случае изменяется поле modrm в инструкции, добавляется адресное смещение. Тогда первой проблемы нет, а обращение происходит в заданную память. В случае защиты памяти от чтения адрес смещается на временный буфер, в который дешифруется читаемый блок.

Именно это всё я имел ввиду, говоря про вм. Так как у вм есть адресный декодер. Она может быть элементарно изменена для реализации анклавов.

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

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



Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 09:50 · Поправил: Vamit New!
Цитата · Личное сообщение · #10

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


Ранг: 327.4 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 09:58 New!
Цитата · Личное сообщение · #11

Vamit

> Исходный код нелинейной функции из трейса никогда не получить.

Не правда. Вы имеете ввиду покрытие - поток ветвлений даёт начало для описания функции. Это входы, по которым строится граф.


Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 12:32 New!
Цитата · Личное сообщение · #12

поток ветвлений даёт начало для описания функции.
Наверное не функции, а блока кода в функции, а во вторых внутри вм нет ветвлений, в теме декомпилятора вм я приводил схему как устроен условный переход, трейсеры ни один из них не найдут.


Ранг: 327.4 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 15:07 · Поправил: difexacaw New!
Цитата · Личное сообщение · #13

Vamit

В теме декомпилятора вм"

Вы наверно забыли --> Link <--

- и следующий пост.


Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 15:54 · Поправил: Vamit New!
Цитата · Личное сообщение · #14

difexacaw
Да вот оно --> Link <--, твой пост сразу за ним, т.ч. я думал что ты читал...


Ранг: 327.4 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 16:45 · Поправил: difexacaw New!
Цитата · Личное сообщение · #15

Vamit

Там же весь цикл вм выделялся конструктором. Визор(трассировкой) выделял входа(на основе которых конструктор покрывает весь код процедуры), затем выполнялась свёртка. А вы говорите не найдут".


Ранг: 64.5 (постоянный)
Статус: Участник

Создано: 7 декабря 2018 17:01 New!
Цитата · Личное сообщение · #16

difexacaw
Бро, ты можешь написать конкретику? если ты знаешь и умещь
хули ты мозги сектымишь?
четко описал вариант решения проблем и все)


Ранг: 327.4 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 17:07 New!
Цитата · Личное сообщение · #17

BlackCode

Для этого вы должны чётко спросить, сформулировать тз, а то я и сам общего смысла не понимаю


Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 21:25 · Поправил: Vamit New!
Цитата · Личное сообщение · #18

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

Добавлено спустя 12 минут
Вот оно тельце этого примитива
Code:
  1. 02810096: sub esi, 1                         ; смещение указателя ленты пикода
  2. 028100EA: movzx ecx, byte ptr [esi]  ; чтение из ленты кол-ва аргументов
  3. 02810115: xor cl, bl                          ; декодировка кол-ва аргументов и апдейт хеша
  4. 02810189: sub cl, 0x17
  5. 028101E0: not cl
  6. 0281020A: add cl, 0xEE
  7. 0281022B: xor cl, 0x18
  8. 028102A4: xor bl, cl
  9. 028102FC: test [edi], 0x00008000    ; edi - указатель стека вм (SVM)
  10. 0281049B: jz 0x0281054C
  11. 02810E1D: call far 0x33:0x01D043F4
  12. 02810096: sub esi, 4                       
  13. 028100DC: mov edx, dword ptr [esi] ; чтение из ленты смещения адреса обработчика следующего примитива
  14. 02810108: xor edx, ebx                   ; декодировка адреса и апдейт хеша
  15. 0281016A: add edx, 0x5F552FAD
  16. 02810186: rol edx, 2
  17. 0281020B: sub edx, 0x444623F8
  18. 02810255: bswap edx
  19. 028102CE: xor ebx, edx
  20. 0281035A: add ebp, edx
  21. 02810377: push ebp                           ; исполнение следующего примитива
  22. 028103B5: ret 
  23. 0281054C:
  24. 0281058E: push esi                  ; сохранение адреса ленты (EIP вм)
  25. 02810594: push ebp                 ; сохранение Offset Prm
  26. 0281059A: mov ebp, edi           ; SVM в ebp
  27. 028105A6: push ebx                 ; сохранение хеша
  28. 028105AC: mov ebx, ecx          ; кол-во аргументов в стеке вм
  29. 028105B8: mov edx, ebx
  30. 028105DE: mov eax, ebp
  31. 028105C4: shl edx, 2
  32. 028105F0: add eax, edx
  33. 0281060D: mov dword ptr [ebp + 0xFFFFFFFC], eax  ; будущий SVM (сдвиг на размер всех аргументов)
  34. 0281065C: test ebx, ebx
  35. 02810690: mov dword ptr [ebp + 0xFFFFFFF8], esp  ; сохранение реального стека
  36. 028107D2: jz 0x02810BA0
  37. 02810883: 
  38. 028108C5: mov eax, dword ptr [ebx * 4 + ebp + 0] ; копирование аргументов из SVM в реальный стек
  39. 02810907: sub ebx, 1
  40. 028109C3: push eax
  41. 02810AEF: jnz 0x02810883
  42. 02810BA0: 
  43. 02810BE2: mov eax, dword ptr [ebp + 0]
  44. 02810C9D: call 0x015835B1                   ; вызов sysenter
  45. 028101F5: mov esp, dword ptr [ebp + 0xFFFFFFF8] ; восстановление реального стека
  46. 0281020F: mov ecx, dword ptr [ebp + 0xFFFFFFFC] ; новый SVM (без аргументов)
  47. 0281022C: mov edi, ecx
  48. 0281023E: mov dword ptr [ecx + 0], eax ; результат вызова в SVM
  49. 02810256: pop ebx                                 ; восстановление базовых регистров вм (хеш, OffPrm, пикоде)
  50. 0281025C: pop ebp
  51. 02810262: pop esi
  52. 02810268: sub esi, 4
  53. 028102AE: mov ecx, dword ptr [esi]  ; чтение из ленты смещения адреса обработчика следующего примитива
  54. 028102C9: xor ecx, ebx                    ; декодировка адреса и апдейт хеша
  55. 0281033C: add ecx, 0x5F552FAD
  56. 02810379: rol ecx, 2
  57. 028103DD: sub ecx, 0x444623F8
  58. 02810490: bswap ecx
  59. 028104B8: xor ebx, ecx
  60. 0281052C: add ebp, ecx
  61. 02810549: push ebp
  62. 02810587: ret                                 ; исполнение следующего примитива


Ранг: 327.4 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 22:01 · Поправил: difexacaw New!
Цитата · Личное сообщение · #19

Vamit

> 02810C9D: call 0x015835B1 ; внутри sysenter

В это можно было бы поверить, если бы не вызов wow(либо это os-case):

> 02810E1D: call far 0x33:0x01D043F4



Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 7 декабря 2018 22:20 · Поправил: Vamit New!
Цитата · Личное сообщение · #20

difexacaw
Что за ерунду ты пишешь, call 0x015835B1 и call far 0x33:0x01D043F4 никак не связаны и находятся в разных ветках исполнения, а внутри этого вызова call far 0x33:0x01D043F4 входят в х64 код и выходят из него там же.
Вот только декомпильнуть его не могу, там все под вм, а свипер х64 код не декомпилит.

Добавлено спустя 21 минуту
Вот он в микст коде вход 64х разрядную вм
Code:
  1. push 1FFABF3A
  2. push 1D043FE
  3. pushfq 
  4. push r11
  5. cmp rbp,r13
  6. push rdi
  7. push rbp
  8. push r14
  9. shl rdi,B9
  10. rcl rbp,cl
  11. xor rbp,r9
  12. push r8
  13. ror dil,cl
  14. rol r8w,cl
  15. movzx bp,r13b
  16. push rax
  17. push r9
  18. add r8b,r12b
  19. sar dil,cl
  20. add rdi,2EF40C0B
  21. push r13
  22. push rbx
  23. rcl r9b,cl
  24. push r12
  25. push rsi
  26. or r12b,bl
  27. push r15
  28. mov r8b,dl
  29. rcr r9w,cl
  30. inc r12b
  31. push rcx
  32. shld bp,r13w,4C
  33. push rdx
  34. push r10
  35. test r12w,2E3E
  36. or dil,C7
  37. movsx r8d,cx
  38. mov ebp,0
  39. not r10
  40. movsxd rbp,ebp
  41. bswap r12
  42. sub r9b,al
  43. movsx r9d,r14w
  44. push rbp
  45. xor di,ax
  46. mov rdi,qword ptr ss:[rsp+90]
  47. btr r10d,ebp
  48. rcl r12,66
  49. sub edi,6224FF8
  50. bswap edi
  51. xor edi,4320612F
  52. inc edi
  53. bts r9d,eax
  54. lea rdi,qword ptr ds:[rdi+rbp]
  55. rol r12,cl
  56. mov r10,rsp
  57. mov r8b,86
  58. not r12b
  59. movzx rbx,r13w
  60. sub rsp,140
  61. and rsp,FFFFFFFFFFFFFFF0
  62. mov r12,rdi
  63. movsx rbx,di
  64. shld r9w,r13w,CD
  65. mov r9b,91
  66. mov r8d,0
  67. neg r9
  68. adc r9,2B25B31
  69. movsxd r8,r8d
  70. sub r12,r8
  71. lea rbx,qword ptr ds:[14172D5D7]
  72. rol r9d,EC
  73. movzx r9w,r9b
  74. sub rdi,4
  75. mov r9d,dword ptr ds:[rdi]
  76. xor r9d,r12d
  77. clc 
  78. cmc 
  79. bswap r9d
  80. rol r9d,3
  81. stc 
  82. xor r9d,4FF334D8
  83. cmp dil,r11b
  84. sub r9d,41E0598D
  85. cmc 
  86. cmp dx,r8w
  87. push r12
  88. btc r12,r12
  89. xor dword ptr ss:[rsp],r9d
  90. shl r12b,cl
  91. pop r12
  92. movsxd r9,r9d
  93. clc 
  94. test r13w,r8w
  95. add rbx,r9
  96. jmp rbx


А инструменты под х64 у меня ещё не написаны, нет ни деобфускатора, ни декомпилятора((…
Ладно, пока будем разбираться без этого, ещё условие выбора есть (а от чего оно зависит пока не ясно) или через sysenter идет или через микст код.


Ранг: 545.1 (!)
Статус: Участник
оптимист

Создано: 8 декабря 2018 00:15 New!
Цитата · Личное сообщение · #21

Vamit
Ты хотябы файл выложил на котором опыты проводишь


Ранг: 2008.6 (!!!!)
Статус: Модератор
retired

Создано: 8 декабря 2018 05:11 New!
Цитата · Личное сообщение · #22

Vamit пишет:
ещё условие выбора есть (а от чего оно зависит пока не ясно) или через sysenter идет или через микст код

Видимо, зависит от проверки, работает на WOW64, тогда можно делать переход в x64 и там вызов, либо на нативной x86, тогда вызов напрямую.


Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 8 декабря 2018 10:00 New!
Цитата · Личное сообщение · #23

Добавил в тело примитива комментарии (пост #18) для лучшего понимания
Видимо, зависит от проверки, работает на WOW64, тогда можно делать переход в x64 и там вызов, либо на нативной x86, тогда вызов напрямую.
Полностью согласен, в микст коде должна быть та же часть что и приведенная ниже в х86 коде, аргументы же в стеке вм общие.


Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 14 декабря 2018 18:08 New!
Цитата · Личное сообщение · #24

Вот тут --> Link <-- можно взять файлик с полным восстановленным кодом протектора и загрузчика вмпрота, даже пожратая им функа на ОЕП девиртуализовалась.
Можно его грузить хоть в Ида, хоть в любой другой дебагер, изучать код и вырабатывать противодействие антиотладке. В общем делайте с ним всё что хотите, только прошу о разобранных и изученных функах сообщать в тему.
Код должен быть рабочим, но Свипер не идеален, т.ч. могут встречаться ошибки, о них так же прошу сообщать.

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



Ранг: 572.4 (!)
Статус: Участник
_Вечный_Студент_

Создано: 16 декабря 2018 01:44 New!
Цитата · Личное сообщение · #25

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

Этот file ProtectVmp32.exe это результат работы Свипера над другим файлом, который в свою очередь был подвергнут VMProtect? Я правильно понимаю?
Если "да", то можно выложить тот самый первоначальный файлик? Хотелось бы самому проследить всю цепочку преобразований, так до меня легче доходит.
А если "нет", то пожалуйста, поправте!


Ранг: 528.5 (!)
Статус: Участник
5KRT

Создано: 16 декабря 2018 02:27 New!
Цитата · Личное сообщение · #26

plutos
Да, это exe одной реальной проги, глянь в свойства файла, увидишь название.
На семёрке не взлетает на SYSENTER

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



Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 16 декабря 2018 10:49 · Поправил: Vamit New!
Цитата · Личное сообщение · #27

это результат работы Свипера над другим файлом, который в свою очередь был подвергнут VMProtect? Я правильно понимаю?
Неправильно, это первоначальный файл, защищенный вмпротом 3.2, с добавленной секцией в которой весь восстановленный код вплоть до ОЕП. ЕП файла осталась оригинальная, первый вход в вм заменен на jmp в восстановленный код, все ссылки на данные реальны, они обработке не подвергались и расположены на своих местах.

На семёрке не взлетает на SYSENTER
Да, тут есть пара ошибок, эту функу из виртуализованного примитива добавлял вручную, короче нужно первый аргумент из стека выгружать в eax, и сдвигать стек на +8, примерно вот так
Code:
  1. 028389F2: mov eax, [esp + 4]
  2. 028389F3: lea edx, [esp + 8]
  3. 028389F4: sysenter
  4. 028389F5: ret

Но на Вин10 sysenter не работает, для неё тестируется другое решение.

Добавлено спустя 1 час 18 минут
При изучении защиты можно использовать наработки --> из этой темы <--, они аналогичны и похоже что разработчики вмп большую часть этого кода добавили в свой протектор v3.2

Добавлено спустя 1 час 49 минут
Может кто знает, что означает старшее слово для syscall вызовов
Code:
  1. .code:02839EB6                 or      edi, 2008000h                   ; NtSetInformationThread
  2. .code:02839EBC                 or      [ebp+NtClose], 8000h
  3. .code:02839EC3                 or      ebx, 6008000h                  ;NtOpenFile
  4. .code:02839EC9                 or      esi, 3008000h                   ;NtQueryInformationProcess
  5. .code:02839ECF                 or      [ebp+NtProtectVirtualMemory], 1008000h
  6. .code:02839ED6                 or      [ebp+NtMapViewOfSection], 4008000h
  7. .code:02839EDD                 or      [ebp+NtUnmapViewOfSection], 5008000h
  8. .code:02839EE4                 or      [ebp+NtCreateSection], 7008000h
  9. .code:02839EEB                 or      [ebp+NtQueryVirtualMemory], 8008000h


по маске 0x7FFF находится номер системного вызова, флаг 0x8000 определяет режим, если установлен то вызов через микст код syscall для Wow64 систем, если сброшен, то вызов через sysenter, а вот старшее слово для Wow64 систем мне неизвестно.

Добавлено спустя 7 часов 35 минут
Вот рабочее решение для syscall и sysenter одном пакете для любой операционки, кому нужно можете изменить код в файле
Code:
  1. 028389F0: mov eax, [esp + 4]
  2. 028389F1: test eax, 0x00008000
  3. 028389F2: jne 0x028389F6
  4. 028389F3: lea edx, [esp + 8]
  5. 028389F4: sysenter
  6. 028389F5: ret
  7. 028389F6:
  8. 028389F7: and eax, 0x7fff
  9. 028389F8: jmp dword ptr fs:[0xC0]

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



Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 17 декабря 2018 11:13 · Поправил: Vamit New!
Цитата · Личное сообщение · #28

Первая проверка на Вин10, которая ловит дебагер
Code:
  1. ULONG pdoh = 0;
  2. if (do_syscall(NtQueryInformationProcess, -1, ProcessDebugObjectHandle, &pdoh, 4, &pdoh) >= 0 || pdoh == 0)
  3.     goto DEBUGGER_IS_DETECTED;

при наличии дебагера NtQueryInformationProcess возвращает 0, при его отсутствии 0xC0000353 -STATUS_PORT_NOT_SET

Добавлено спустя 22 минуты
Вторая проверка отключает отладчик от исследуемого процесса
Code:
  1. do_syscall(NtSetInformationThread, -2, ThreadHideFromDebugger, 0, 0);


Добавлено спустя 1 час 45 минут
Восстановленная функция 02838DC0 VmpUnpackSection не работает, вместо неё нужно вызывать оригинальную функу по адресу 01CF9BBA

Добавлено спустя 2 часа 7 минут
Следующая проверка, которая ловит дебагер, вызывается после распаковки кода секций
Code:
  1. __try
  2. {
  3.     __asm pushfd
  4.     __asm pop ecx
  5.     __asm or ecx, V86FLAGS_TRACE
  6.     __asm push ecx
  7.     __asm popf
  8.     __asm rdtsc
  9.     __asm nop
  10.     goto DEBUGGER_IS_DETECTED;
  11. }
  12. __except(info = GetExceptionInformation(), EXCEPTION_EXECUTE_HANDLER)
  13. {
  14.     if (info->ExceptionRecord->ContextFlags & CONTEXT_DEBUG_REGISTERS)
  15.     {
  16.         DWORD value = 0;
  17.         value |= info->ExceptionRecord->Dr2;
  18.         value |= info->ExceptionRecord->Dr3;
  19.         value |= info->ExceptionRecord->Dr1;
  20.         value |= info->ExceptionRecord->Dr0;
  21.         if (value)
  22.             goto DEBUGGER_IS_DETECTED;
  23.     }
  24. }

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


Ранг: 65.0 (постоянный)
Статус: Участник

Создано: 17 декабря 2018 20:51 New!
Цитата · Личное сообщение · #29

Code:
  1.     
  2.     __asm pushfd
  3.     __asm pop ecx
  4.     __asm or ecx, V86FLAGS_TRACE
  5.     __asm push ecx
  6.     __asm popf
  7.     __asm rdtsc

А дебагер эту сэпшн не ловит ли сам?
И не совсем понятно как это робит. В TF 0 или 1 (без и с трэйсом) OR'им с V86FLAGS_TRACE (1) и получаем 1, popf, на rdtsc должно single step exception, её ловит дбг не уходя в __except. Или не ловит?
Меня б насторожило шо софт сэпшны ставит... или оно там с кучой мусора, мол на сэпшн, ройся?

Обход вроде у Скиллы норм, передавай singlestep сэпшн софту (он тогда идёт в свой __except) и пряч DRx, так?


Ранг: 327.4 (мудрец)
Статус: Участник

Создано: 17 декабря 2018 21:15 · Поправил: difexacaw New!
Цитата · Личное сообщение · #30

hash87szf

Ну а что тут не понятно, устанавливается TF и в ловушке проверяется дебаг контекст. Так как в ловушке никаких проверок нет, то способ вызова исключения значения не имеет. Рассчитано(#DB) на то, что отладчик сам обработает трап, тем самым не передав управление для обработки ловушки.

push/pop это морф/макро, нужно что бы сохранить часть контекста, но при этом установить флажок(TF). Иначе было бы push 0x100/popfd.

> пряч DRx

А как он их спрячет, если не может мониторить сервисный шлюз(так как он судя по всему перемещён в памяти), те сервисный запрос контекста, нп NtGetContextThread

Добавлено спустя 19 минут
Vamit

Что же вы копаетесь в такой мелочи, в штатных способах детекта отладчика, это ведь плагины делают

А что бы вы делали если бы был допустим замер дельты по системному таймингу, те например вызываем ловушку и прерывание, затем измеряем время обработки и их отношение. Результат будет однозначный - дельта в сотни/тысячи крат, при этом без вызова нтапи


Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 17 декабря 2018 22:59 New!
Цитата · Личное сообщение · #31

В дополнение к сказанному...
Все остальные проверки некритичны, прога распаковалась и запустилась без проблем под дебагером.
<< . 1 . 2 . 3 .
 eXeL@B —› Протекторы —› VMProtect 3.2: запуcтить приложение и остановить его на указанном адресе

Видеокурс ВЗЛОМ