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

 eXeL@B —› Основной форум —› Vmprotect. Хитрая защита от отладки.
<< . 1 . 2 . 3 . 4 . 5 . >>
Посл.ответ Сообщение


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

Создано: 24 мая 2017 20:14 · Поправил: Vamit
· Личное сообщение · #1

При реверсе одной проги встретил хитрую защиту от отладки: она не позволяет работать проге под дебагером, после F9 терминация, приаттачиться к работающей то же нельзя - сразу терминация. Приложение накрыто последним Vmprotect, все функции защиты также под протектором, основные виртуализованы, остальные обфусцированы, а всего их более 200шт. Терминирует именно защита, а не вмпрот. В TLS сидят 2 каллбака защиты, первый из них есть в листинге. Дебаг работает только до первого каллбака, тут можно снять дамп проги и девиртуализовать вмпрот. А суть задачи такова: прога посылает запрос на сервер, в котором одним из куков является состояние защиты (32 бита), проэмулировать мне его не удалось и сервак не отвечает.
Прошу любые идеи как победить, или идентифицировать защиту, она явно не самописная, и прилинкована к проге из какой-то либы.
Вот листинг нескольких функций ядра защиты, вытащенных из под Vmprotect:
Code:
  1. .text:004894F0 sub_4894F0      proc near
  2. .text:004894F0                 dec     esp
  3. .text:004894F1                 mov     edx, ecx
  4. .text:004894F3                 mov     eax, 0Ah
  5. .text:004894F8                 syscall
  6. .text:004894FA                 retn
  7. .text:004894FA sub_4894F0      endp
  8.  
  9. .text:004894FB sub_4894FB      proc near
  10. .text:004894FB arg_0           = dword ptr  4
  11. .text:004894FB
  12. .text:004894FB                 push    0
  13. .text:004894FD                 push    4
  14. .text:004894FF                 push    [esp+8+arg_0]
  15. .text:00489503                 push    7
  16. .text:00489505                 push    0FFFFFFFFh
  17. .text:00489507                 mov     eax, 9Ah
  18. .text:0048950C                 push    0
  19. .text:0048950E                 call    sub_489522
  20. .text:00489513                 add     esp, 18h
  21. .text:00489516                 retn
  22. .text:00489516 sub_4894FB      endp
  23.  
  24. .text:00489517 sub_489517      proc near
  25. .text:00489517                 dec     esp
  26. .text:00489518                 mov     edx, ecx
  27. .text:0048951A                 mov     eax, 16h
  28. .text:0048951F                 syscall
  29. .text:00489521                 retn
  30. .text:00489521 sub_489517      endp
  31.  
  32. .text:00489522 sub_489522      proc near
  33. .text:00489522                 mov     edx, esp
  34. .text:00489524                 sysenter
  35. .text:00489526                 retn
  36. .text:00489526 sub_489522      endp
  37.  
  38. .text:00489527 sub_489527      proc near
  39. .text:00489527                 push    0
  40. .text:00489529                 push    0
  41. .text:0048952B                 push    11h
  42. .text:0048952D                 push    0FFFFFFFEh
  43. .text:0048952F                 push    0
  44. .text:00489531                 mov     eax, 0E5h
  45. .text:00489536                 call    sub_489522
  46. .text:0048953B                 add     esp, 14h
  47. .text:0048953E                 retn
  48. .text:0048953E sub_489527      endp
  49.  
  50. .text:0048953F sub_48953F      proc near
  51. .text:0048953F                 mov     eax, offset sub_489517
  52. .text:00489544                 cmp     dword ptr [eax], 0B8D18B4Ch
  53. .text:0048954A                 jnz     short locret_489587
  54. .text:0048954C                 add     eax, 4
  55. .text:0048954F                 cmp     dword ptr [eax], 16h
  56. .text:00489552                 jnz     short locret_489587
  57. .text:00489554                 mov     eax, offset sub_4894F0
  58. .text:00489559                 cmp     dword ptr [eax], 0B8D18B4Ch
  59. .text:0048955F                 jnz     short locret_489587
  60. .text:00489561                 add     eax, 4
  61. .text:00489564                 cmp     dword ptr [eax], 0Ah
  62. .text:00489567                 jnz     short locret_489587
  63. .text:00489569                 mov     eax, offset sub_489522
  64. .text:0048956E                 cmp     dword ptr [eax], 340FD48Bh
  65. .text:00489574                 jnz     short locret_489587
  66. .text:00489576                 mov     eax, offset sub_489595
  67. .text:0048957B                 cmp     dword ptr [eax], 99C32DCDh
  68. .text:00489581                 jnz     short locret_489587
  69. .text:00489583                 mov     ax, 0
  70. .text:00489587 locret_489587:
  71. .text:00489587                 retn
  72. .text:00489587 sub_48953F      endp
  73.  
  74. .text:00489595 sub_489595      proc near
  75. .text:00489595                 int     2Dh
  76. .text:00489597                 retn
  77. .text:00489597 sub_489595      endp
  78.  
  79. .text:0048A845 sub_48A845      proc near
  80. .text:0048A845 arg_4           = byte ptr  8
  81. .text:0048A845
  82. .text:0048A845                 cmp     dword_C45424, 0
  83. .text:0048A84C                 jnz     short loc_48A854
  84. .text:0048A84E loc_48A84E:
  85. .text:0048A84E                 mov     edx, esp
  86. .text:0048A850 loc_48A850:
  87. .text:0048A850                 sysenter
  88. .text:0048A852                 jmp     short locret_48A85A
  89. .text:0048A854 loc_48A854:
  90. .text:0048A854                 lea     edx, [esp+arg_4]
  91. .text:0048A858                 int     2Eh
  92. .text:0048A85A locret_48A85A:
  93. .text:0048A85A                 retn
  94. .text:0048A85A sub_48A845      endp
  95.  
  96. .text:0048A877 sub_48A877      proc near
  97. .text:0048A877                 mov     eax, offset loc_48A850
  98. .text:0048A87C                 cmp     word ptr [eax], 340Fh
  99. .text:0048A881                 jnz     short locret_48A89E
  100. .text:0048A883                 mov     eax, offset loc_48A854
  101. .text:0048A888                 cmp     dword ptr [eax], 824548Dh
  102. .text:0048A88E                 jnz     short locret_48A89E
  103. .text:0048A890                 add     eax, 4
  104. .text:0048A893                 cmp     word ptr [eax], 2ECDh
  105. .text:0048A898                 jnz     short locret_48A89E
  106. .text:0048A89A                 mov     ax, 0
  107. .text:0048A89E locret_48A89E:
  108. .text:0048A89E                 retn
  109. .text:0048A89E sub_48A877      endp
  110.  
  111.  
  112. .text:0062C6F0 TlsCallback_1   proc near
  113. .text:0062C6F0 Reason          = dword ptr  0Ch
  114. .text:0062C6F0
  115. .text:0062C6F0                 push    ebp
  116. .text:0062C6F1                 mov     ebp, esp
  117. .text:0062C6F3                 and     esp, 0FFFFFFF8h
  118. .text:0062C6F6                 cmp     [ebp+Reason], 1
  119. .text:0062C6FA                 push    ebx
  120. .text:0062C6FB                 push    esi
  121. .text:0062C6FC                 push    edi
  122. .text:0062C6FD                 jz      short loc_62C708
  123. .text:0062C6FF                 pop     edi
  124. .text:0062C700                 pop     esi
  125. .text:0062C701                 pop     ebx
  126. .text:0062C702                 mov     esp, ebp
  127. .text:0062C704                 pop     ebp
  128. .text:0062C705                 retn    0Ch
  129. .text:0062C708 loc_62C708:
  130. .text:0062C708                 push    offset TlsCallback_2
  131. .text:0062C70D                 call    ?????                  ;packet call
  132. .text:0062C712                 add     esp, 4
  133. .text:0062C715                 test    eax, eax
  134. .text:0062C717                 jnz     short loc_62C71E
  135. .text:0062C719                 call    ?????                  ;packet call
  136. .text:0062C71E loc_62C71E:
  137. .text:0062C71E                 push    ebx
  138. .text:0062C71F                 xor     eax, eax
  139. .text:0062C721                 lea     edi, [ebp+4]
  140. .text:0062C724                 cdq
  141. .text:0062C725                 add     edi, 8
  142. .text:0062C728                 mov     ecx, 100h
  143. .text:0062C72D                 rep stosd
  144. .text:0062C72F                 mov     edi, dword_C93D70
  145. .text:0062C735                 mov     ecx, edi
  146. .text:0062C737                 mov     ebx, dword_C93D74
  147. .text:0062C73D                 mov     esi, dword_C93D78
  148. .text:0062C743                 mov     edx, dword_C93D7C
  149. .text:0062C749                 mov     dword_C93D74, edx
  150. .text:0062C74F                 mov     eax, ebx
  151. .text:0062C751                 shld    eax, ecx, 17h
  152. .text:0062C755                 shl     ecx, 17h
  153. .text:0062C758                 xor     edi, ecx
  154. .text:0062C75A                 xor     ebx, eax
  155. .text:0062C75C                 mov     dword_C93D70, esi
  156. .text:0062C762                 mov     eax, esi
  157. .text:0062C764                 mov     ecx, edx
  158. .text:0062C766                 shrd    eax, ecx, 9
  159. .text:0062C76A                 shr     ecx, 9
  160. .text:0062C76D                 xor     ecx, ebx
  161. .text:0062C76F                 xor     eax, edi
  162. .text:0062C771                 shrd    eax, ecx, 11h
  163. .text:0062C775                 shr     ecx, 11h
  164. .text:0062C778                 xor     eax, esi
  165. .text:0062C77A                 push    0
  166. .text:0062C77C                 xor     eax, edi
  167. .text:0062C77E                 xor     ecx, edx
  168. .text:0062C780                 xor     ecx, ebx
  169. .text:0062C782                 sub     edx, edx
  170. .text:0062C784                 mov     dword_C93D78, eax
  171. .text:0062C789                 mov     dword_C93D7C, ecx
  172. .text:0062C78F                 add     eax, esi
  173. .text:0062C791                 mov     ecx, 0FFFh
  174. .text:0062C796                 div     ecx
  175. .text:0062C798                 mov     dword ptr [edx+1], 18BBB819h
  176. .text:0062C79F                 mov     ecx, offset unk_C93CB0
  177. .text:0062C7A4                 call    ?????                  ;packet call (constructor)
  178. .text:0062C7A9                 pop     edi
  179. .text:0062C7AA                 pop     esi
  180. .text:0062C7AB                 pop     ebx
  181. .text:0062C7AC                 mov     esp, ebp
  182. .text:0062C7AE                 pop     ebp
  183. .text:0062C7AF                 retn    0Ch
  184. .text:0062C7AF TlsCallback_1   endp


-----
Everything is relative...





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

Создано: 05 июня 2017 19:00
· Личное сообщение · #2

Vamit

Тоесть защита делится на две части - детект гипервизора и снятие тайминга. В нормальной оси(не под hvl) первая часть смысла не имеет, вторая же проблемна. Вот и сколько времени у вас ушло на то, что можно решить за пол часа если не секрет ?

> Буду признателен если кто-то даст подробное описание инфы в этой области в зависимости от операционки, я ничего толкового не нашел.

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

hash87szf

А ничо что есть предупреждение:

Code:
  1. // WARNING: This structure must have exactly the same layout for 32- and
  2. //    64-bit systems. The layout of this structure cannot change and new
  3. //    fields can only be added at the end of the structure (unless a gap
  4. //    can be exploited). Deprecated fields cannot be deleted. Platform
  5. //    specific fields are included on all systems.


Зачем туда лазить, раз матчасти не знаете.

-----
vx





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

Создано: 05 июня 2017 19:20
· Личное сообщение · #3

difexacaw пишет:
Вот и сколько времени у вас ушло на то, что можно решить за пол часа если не секрет ?

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

-----
Everything is relative...


| Сообщение посчитали полезным: Bronco, zNob, v00doo, hlmadip, Larry


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

Создано: 05 июня 2017 20:13
· Личное сообщение · #4

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

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


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


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

Создано: 06 июня 2017 09:46
· Личное сообщение · #5

Проясните один вопрос - когда вызывается TLS callback?
Понятен его вызов до EP с reason = DLL_PROCESS_ATTACH, но ещё имеется reason = DLL_THREAD_ATTACH, т.е. получается, что TLS callback экзешника будет вызываться каждый раз при создании в нем треда, это так?
С DllMain всё понятно, но имеется же разница между dll и exe.
И ещё один вопрос, можно ли запретить в системе вызов TLS callback с конкретным reason?

-----
Everything is relative...




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

Создано: 06 июня 2017 14:22 · Поправил: redlord
· Личное сообщение · #6

Vamit
http://www.nynaeve.net/?p=183

Vamit пишет:
запретить в системе вызов TLS callback с конкретным reason?

имхо, будет свал приложения, если придавить thread_attach. выделяется память для потока
thread_detach - будет память течь
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686997(v=vs.85).aspx

Add:
The CRT code also provides a mechanism to allow a program to register a set of TLS callbacks, which are functions with a similar prototype to DllMain that are called when a thread starts or exits (cleanly) in the current process

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


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

Создано: 06 июня 2017 14:54
· Личное сообщение · #7

redlord пишет:
http://www.nynaeve.net/?p=183

Я эту статейку смотрел, в ней говорится что TLS callback экзешника идентичен DllMain библиотеки, но в ней нет явного указания, что он будет вызываться каждый раз при создании в нем треда, поэтому и спросил...
Можно предположить, что если идентичен, то и вызовы будут идентичны.
имхо, будет свал приложения, если придавить thread_attach. выделяется память для потокаthread_detach - будет память течь
Это понятно, но вернемся к защите, её 3ий TLS callback имеет две ветки кода, для DLL_PROCESS_ATTACH, тут всё понятно - выполняется однократно, и для DLL_THREAD_ATTACH, которая должна выполняться для каждого нового треда, в ней выделение памяти отсутствует, так же отсутствует код и для DLL_THREAD_DETACH (и в постах к статье говорится что DLL_THREAD_DETACH для TLS не вызывается), поэтому и спросил про возможность блокировки вызова TLS callback для тредов.

-----
Everything is relative...




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

Создано: 06 июня 2017 15:53
· Личное сообщение · #8

VamitVamit пишет:
поэтому и спросил про возможность блокировки вызова TLS callback для тредов

если присутствуют только каллбеки защиты - их можно заглушить
но, чую, там еще и crt имеются.



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

Создано: 06 июня 2017 15:58
· Личное сообщение · #9

> возможность блокировки вызова TLS callback для тредов.
Аттач, бряк на .cod1, patch in DisableThreadLibraryCalls(hModule of the process), restore original bytes?
Но какой то код может и проверять, вызывались ли тлс колбэки или нет.



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

Создано: 06 июня 2017 18:22
· Личное сообщение · #10

Может это? http://alexander-bagel.blogspot.nl/2016/03/early-execution.html

Там есть под конец про антидамп с этими tls колбэками, где слово "valid_anti_dump_mark_value". И в камментах про антидебаг.




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

Создано: 06 июня 2017 20:10
· Личное сообщение · #11

bizkitlimp пишет:
Может это?

Интересно, но уж очень там всё просто)

-----
Everything is relative...





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

Создано: 09 июня 2017 10:35 · Поправил: Vamit
· Личное сообщение · #12

Добрался до ядерных функций, но у меня проблема с их идентификацией, прошу помочь...
В приведенном примере выполняется вызов 3х функций последовательно:
Code:
  1. Сам вызов
  2. .text:0061CE5A                 push    0
  3. .text:0061CE5C                 push    0
  4. .text:0061CE5E                 push    11h
  5. .text:0061CE60                 mov     ecx, offset s_Protect
  6. .text:0061CE65                 call    vProtect_GetCurrentThread
  7. .text:0061CE6A                 push    eax
  8. .text:0061CE6B                 call    sub_48A0BD
  9. .text:0061CE70                 add     esp, 10h
  10.  
  11. и функи
  12.  
  13. .text:0048A0BD sub_48A0BD      proc near
  14. .text:0048A0BD                 push    offset unk_C45255
  15. .text:0048A0C2                 nop
  16. .text:0048A0C3                 nop
  17. .text:0048A0C4                 lea     esp, [esp+4]
  18. .text:0048A0C8                 mov     eax, s_BuildNumberOS_coded
  19. .text:0048A0CD                 xor     eax, s_BuildNumberOS_key
  20. .text:0048A0D3                 cmp     eax, 2600
  21. .text:0048A0D8                 jz      short loc_48A127
  22. .text:0048A0DA                 cmp     eax, 3790
  23. .text:0048A0DF                 jz      short loc_48A12E
  24. .text:0048A0E1                 cmp     eax, 6001
  25. .text:0048A0E6                 jz      short loc_48A135
  26. .text:0048A0E8                 cmp     eax, 6002
  27. .text:0048A0ED                 jz      short loc_48A13C
  28. .text:0048A0EF                 cmp     eax, 7600
  29. .text:0048A0F4                 jz      short loc_48A143
  30. .text:0048A0F6                 cmp     eax, 7601
  31. .text:0048A0FB                 jz      short loc_48A143
  32. .text:0048A0FD                 cmp     eax, 9200
  33. .text:0048A102                 jz      short loc_48A14A
  34. .text:0048A104                 cmp     eax, 9600
  35. .text:0048A109                 jz      short loc_48A151
  36. .text:0048A10B                 cmp     eax, 10240
  37. .text:0048A110                 jz      short loc_48A158
  38. .text:0048A112                 cmp     eax, 10586
  39. .text:0048A117                 jz      short loc_48A158
  40. .text:0048A119                 cmp     eax, 14393
  41. .text:0048A11E                 jz      short loc_48A158
  42. .text:0048A120                 mov     eax, -1
  43. .text:0048A125                 jmp     short loc_48A165
  44. .text:0048A127 ; ---------------------------------------------------------------------------
  45. .text:0048A127 loc_48A127:
  46. .text:0048A127                 mov     eax, 0E5h
  47. .text:0048A12C                 jmp     short loc_48A165
  48. .text:0048A12E ; ---------------------------------------------------------------------------
  49. .text:0048A12E loc_48A12E:
  50. .text:0048A12E                 mov     eax, 0EEh
  51. .text:0048A133                 jmp     short loc_48A165
  52. .text:0048A135 ; ---------------------------------------------------------------------------
  53. .text:0048A135 loc_48A135:
  54. .text:0048A135                 mov     eax, 136h
  55. .text:0048A13A                 jmp     short loc_48A165
  56. .text:0048A13C ; ---------------------------------------------------------------------------
  57. .text:0048A13C loc_48A13C:
  58. .text:0048A13C                 mov     eax, 132h
  59. .text:0048A141                 jmp     short loc_48A165
  60. .text:0048A143 ; ---------------------------------------------------------------------------
  61. .text:0048A143 loc_48A143:
  62. .text:0048A143                 mov     eax, 14Fh
  63. .text:0048A148                 jmp     short loc_48A165
  64. .text:0048A14A ; ---------------------------------------------------------------------------
  65. .text:0048A14A loc_48A14A:
  66. .text:0048A14A                 mov     eax, 48h
  67. .text:0048A14F                 jmp     short loc_48A165
  68. .text:0048A151 ; ---------------------------------------------------------------------------
  69. .text:0048A151 loc_48A151:
  70. .text:0048A151                 mov     eax, 4Bh
  71. .text:0048A156                 jmp     short loc_48A165
  72. .text:0048A158 ; ---------------------------------------------------------------------------
  73. .text:0048A158 loc_48A158:
  74. .text:0048A158                 mov     eax, 4Ch
  75. .text:0048A164                 nop
  76. .text:0048A165 loc_48A165:
  77. .text:0048A165                 jmp     vProtectCore_KernelFunction
  78. .text:0048A165 sub_48A0BD      endp
  79.  
  80. .text:0048A85B vProtectCore_KernelFunction proc near
  81. .text:0048A85B                 push    offset unk_C453FD
  82. .text:0048A860                 nop
  83. .text:0048A861                 nop
  84. .text:0048A862                 add     esp, 4
  85. .text:0048A865                 cmp     eax, 0FFFFFFFFh
  86. .text:0048A868                 jz      short loc_48A86F
  87. .text:0048A86A                 call    vProtectCore_CallKernelFunction
  88. .text:0048A86F loc_48A86F:
  89. .text:0048A86F                 nop
  90. .text:0048A876                 retn
  91. .text:0048A876 vProtectCore_KernelFunction endp
  92.  
  93. .text:0048A845 vProtectCore_CallKernelFunction proc near
  94. .text:0048A845 arg_4           = byte ptr  8
  95. .text:0048A845
  96. .text:0048A845                 cmp     s_bVBox, 0
  97. .text:0048A84C                 jnz     short loc_48A854
  98. .text:0048A84E loc_48A84E:
  99. .text:0048A84E                 mov     edx, esp
  100. .text:0048A850 loc_48A850:                                                           ; DATA XREF: sub_48A877o
  101. .text:0048A850                 sysenter
  102. .text:0048A852                 jmp     short locret_48A85A
  103. .text:0048A854 ; ---------------------------------------------------------------------------
  104. .text:0048A854 loc_48A854:
  105. .text:0048A854                 lea     edx, [esp+arg_4]
  106. .text:0048A858                 int     2Eh
  107. .text:0048A85A locret_48A85A:
  108. .text:0048A85A                 retn
  109. .text:0048A85A vProtectCore_CallKernelFunction endp

Я так понимаю, что в зависимости от версии OS вызывается одна и та же функа (ординалы разные в eax) из системной либы.

-----
Everything is relative...




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

Создано: 09 июня 2017 10:48 · Поправил: vden
· Личное сообщение · #13

Вот таблица http://j00ru.vexillium.org/ntapi/
Это вызов NtSetInformationThread

| Сообщение посчитали полезным: Vamit, gggeorggge, DenCoder, bizkitlimp

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

Создано: 09 июня 2017 11:14
· Личное сообщение · #14

Привет всем!
Завершил анализ callback 1. Там все завершается созданием переходника в памяти защиты для функции DbgUiRemoteBreakin, который перепрыгивает первые две инструкции:
push 8
push 7c950030
jmp 7c94ffea
В callback 2 нашел код который сравнивает результаты вызовов оригинальной GetTickCount и эмулированной защитой.
Сравнение выполняется по адресу 0x625891.




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

Создано: 09 июня 2017 11:34
· Личное сообщение · #15

Нашел одну статейку --> Link <--
Похоже, что такой алгоритм реализован в этой защите. Интересно имеют ли последние версии сциллы, фантома и стронга лекарство от этого?

-----
Everything is relative...


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


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

Создано: 09 июня 2017 21:45
· Личное сообщение · #16

Vamit пишет:
Интересно имеют ли последние версии сциллы

статья 2014 года, сцилка перекрывает, фант и стронг, не знаю.

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




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

Создано: 12 июня 2017 11:39 · Поправил: gggeorggge
· Личное сообщение · #17

Vamit пишет:
Нашел одну статейку --> Link <--
Похоже, что такой алгоритм реализован в этой защите. Интересно имеют ли последние версии сциллы, фантома и стронга лекарство от этого?

они патчат ntdll, а в данном случае защита делает вызов напрямую ntsetinfothread (ThreadHideFromDebugger) через sysenter. Насколько я понимаю тут нужны анти дебаг плагины, которые патчат ядро.

Добавлено спустя 11 часов 17 минут
В 3 callback из антидебага пока нашел вызов 3-х функций через sysenter:
NtSetInformationThread ThreadHideFromDebugger
NtQueryInformationProcess ProcessDebugObjectHandle
NtRemoveProcessDebug
и проверку на соответствие функций ntdll на диске и в памяти:
KiFastSystemCall
KiUserExceptionDispatcher
KiRaiseUserExceptionDispatcher
KiUserApcDispatcher
NtClose
NtContinue
NtSetInformationThread
NtQuerySystemInformation
NtGetTickCount
NtRaiseException
NtAllocateVirtualMemory
NtProtectVirtualMemory
NtQueryInformationProcess




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

Создано: 13 июня 2017 02:27 · Поправил: difexacaw
· Личное сообщение · #18

gggeorggge

Зачем патчить ядро ?

Возврат из сентер выполняется на фиксированный адрес - KiFastSystemCallRet, без разницы откуда вызвали.

Ki функции это колбеки из ядра в юм - "Kernel Interrupt", это нотификаторы, которые вызываются при возврате из сервисов, исклчениях, APC и обратных вызовах гуя и старте потоков.

Смотрите обработку сентер в манах:

Protected Mode Exceptions
#GP(0) If IA32_SYSENTER_CS[15:2] = 0.

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

-----
vx


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


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

Создано: 13 июня 2017 13:50 · Поправил: Vamit
· Личное сообщение · #19

Активация защиты.

Callback TLS3 (619AB0) содержит две ветки кода для DLL_PROCESS_ATTACH и DLL_THREAD_ATTACH.

Код проверки при создании нового потока довольно прост:
if(WinXP SP3 && !Wine)
NtSetInformationThread(0x0FFFFFFFE, ThreadHideFromDebugger, 0, 0) - вызов через sysenter
далее если система х64, то восстанавливается FastSysCall for x64 в fs:[C0], сама проверка на "слом" этого адреса находится в ветке DLL_PROCESS_ATTACH.
Завершает эту ветку функция SetThreadHideFromDebugger, выполняющая вызов
NtSetInformationThread(hThread, ThreadHideFromDebugger, 0, 0) через sysenter, где hThread - хендл создаваемого потока.

Код ветки DLL_PROCESS_ATTACH содержит 34 функции проверок:
1. Инициализация новой структуры защиты vProtectCore, в неё будут записываться результаты всех проверок.
(Её тело будет выложено позже, по окончании разбора этой ветки кода)
2. Вызов функции SetThreadHideFromDebugger, рассмотрена выше.
3. CheckProcessDebugObjectHandle
- Получают хендл hDebugObject вызывая NtQueryInformationProcess с ProcessDebugObjectHandle, если получили, то отладчик обнаружен.
- Удаляют отладчик вызывая NtRemoveProcessDebug.
4. CheckQtAutoScreenScaleFactor
Ищут в PEB -> ProcessParameters -> CommandLine строку L"QT_AUTO_SCREEN_SCALE_FACTOR", если найдена, то ExitProcess. Возможно это проверка на Иду, больше ничего на ум не пришло...
5. CheckFlagsAndVirtualProtect
- Проверяют флаг отладки следующим образом:
Code:
  1. .text:00625006                 mov     [ebp+flags], 0
  2. .text:0062500D                 pusha
  3. .text:0062500E                 push    ds
  4. .text:0062500F                 mov     eax, large fs:18h
  5. .text:00625015                 pop     gs
  6. .text:00625017                 mov     eax, gs:[eax+20h]
  7. .text:0062501B                 popa
  8. .text:0062501C                 db      0F3h, 0F3h, 0F3h, 0F3h
  9. .text:0062501C                 rep pushf
  10. .text:00625022                 pop     eax
  11. .text:00625023                 mov     [ebp+flags], eax
  12. .text:00625030                 mov     ecx, [ebp+flags]
  13. .text:00625033                 and     ecx, 100h

- Разрешают модификацию кода VirtualProtect с PAGE_EXECUTE_READWRITE и проверяют возможность изменения кода.
- Возвращают флаги модификации обратно.
6. CheckCodeSectionsPE
Проверяют изменение двух байт кода в начале каждой секции загруженного образа, если изменены, то ExitProcess.
7. CheckImageDllCharacteristicsDynamicBase
Проверяют PE -> DLL Flags -> IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
8. CheckVirtualProtectSomeFunction
Проверяется целостность кода функций vProtectCore и Callback TLS1.
9. DetectAntiAntiDebugTool
- Создают новый NtCreateDebugObject с DEBUG_ALL_ACCESS
- Получают информацию NtQueryObject, если кол-во TotalNumberOfObjects != 1, то обнаружено.
10. DetectSandBoxie
Если запущена L"SbieDll.dll", то обнаружено.
11. CheckParentProcess
Вызывают NtQueryInformationProcess с ProcessBasicInformation и проверяют ParentProcessId.
12. ResroreNtDllFunctions
- Загружают с диска библиотеку ntdll.lib и сверяют начальные 32 байта следующих функций в либе и памяти:
KiFastSystemCall, KiUserExceptionDispatcher, KiRaiseUserExceptionDispatcher, KiUserApcDispatcher,
NtClose, NtContinue, NtSetInformationThread, NtQuerySystemInformation, NtGetTickCount, NtRaiseException,
NtAllocateVirtualMemory, NtProtectVirtualMemory и NtQueryInformationProcess.
- Если в памяти есть изменения, то восстанавливают 32 байта из оригинала.
13. CheckWow64cpuDll
Выполняют проверку L"wow64cpu.dll" для х64 системы и анализируют FastSysCall for x64. Подробно я её не разбирал.
14. RestoreFastSysCallx64
Описана выше в ветке для DLL_THREAD_ATTACH.

Пока всё...

-----
Everything is relative...


| Сообщение посчитали полезным: 4kusNick, DimitarSerg, Bronco, Nightshade, v00doo, ==DJ==[ZLO]


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

Создано: 15 июня 2017 22:14 · Поправил: Vamit
· Личное сообщение · #20

Продолжение...

15. DetectDebuggers
Создают список процессов CreateToolhelp32Snapshot с TH32CS_SNAPPROCESS и ищут в нем идентификатор текущего процесса (pe.th32ProcessID == nCurrentProcessId).
Вызывая NtQuerySystemInformation с SystemExtendedProcessInformation получают детальную информацию обо всех процессах и потоках, работающих в системе (pSysExtProcInfo).
GetCurrentProcessNameFromPEB - получают имя текущего процесса.
Ищут в pSysExtProcInfo текущий процесс по имени и получают его InheritedFromUniqueProcessId.
Делают второй проход по pSysExtProcInfo и ищут процесс, у которого UniqueProcessId == найденному ранее InheritedFromUniqueProcessId.
Сравнивают его имя с одним из следующего списка: ollydbg.exe, x64dbg.exe, x32dbg.exe, idaq64.exe, idaq.exe.
Если найдено, то ExitProcess.

16. CheckTLSCallbackTable
Если PE -> TLS RVA -> CallBack Table VA == 0, то ExitProcess.

17. CheckCodeKernelFunction
Проверка целостности кода 5 функций обращения к ядру системы.

18. FindTempOllyDbg
- Создают путь path = GetTempPath() + \A\ollydbg.exe
- if((CreateFile(path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING) != INVALID_HANDLE_VALUE) &&
(CreateFile(path, GENERIC_ALL, CREATE_ALWAYS, 0, OPEN_EXISTING) == INVALID_HANDLE_VALUE)), то ExitProcess.
- Повторяют проверку для буковок B - H.

19. CheckKernelDebugger
Вызывают функцию DbgPrompt("test", buf, 64), если срабатывает исключение, то ок, иначе фиксируют наличие ядерного отладчика.

20. CheckRing3Debugger
Вызов NtQueryInformationProcess с ProcessDebugPort, если возвращает NumberDebuggers != 0, то обнаружено.

21. CheckInt2D
Выполняют int 2D, если после инструкции код продолжает выполняться, то отладчик обнаружен. Если срабатывает исключение, то не обнаружен.

22. CheckCodeProtectFucntion
Проверка целостности кода 63 функций защиты.

23. ???
Не смог найти тело пакетной функции, возможно найдется позже.

24. DetectKernelDebugger
- Вызывают NtQuerySystemInformation с SystemKernelDebuggerInformation и получают флаги DebuggerEnabled и DebuggerNotPresent.
Если DebuggerEnabled и !DebuggerNotPresent, то ядерный отладчик обнаружен.
- Смотрят USER_SHARED_DATA -> KdDebuggerEnabled, если != 0, то обнаружен.

25. CheckDbgException
Вызывают исключение RtlRaiseStatus с одним из случайно выбранных статусов DBG_RIPEXCEPTION, DBG_PRINTEXCEPTION_C или DBG_PRINTEXCEPTION_WIDE_C.
Если не сработало или статусы в коде модифицированы, то отладчик обнаружен.

Пока всё...

-----
Everything is relative...


| Сообщение посчитали полезным: sendersu, 4kusNick, gggeorggge


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

Создано: 16 июня 2017 03:23 · Поправил: difexacaw
· Личное сообщение · #21

Vamit

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

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

Добавлено спустя 12 минут
Вот я прошёл поиском за вас:

--> Link <--
--> Link <--

-----
vx





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

Создано: 16 июня 2017 22:38 · Поправил: Vamit
· Личное сообщение · #22

Продолжение...

26. CheckTLSCallbackTableProcessHandle
Фиксируют результат сравнения PE -> TLS RVA -> CallBack Table VA с хендлом процесса (0х0040000).

27. CheckApiMonitor
Проверяют, запущены ли в системе следующие модули: apimonitor-drv-x86.sys, apioverride.dll, api_log.dll, intruder.dll.

28. BlockDbgUiIssueRemoteBreakin
Блокируют функцию DbgUiIssueRemoteBreakin, записывая в её начальный адрес ret.

29. CheckBlockDbgUiIssueRemoteBreakin
Проверяют, что функция DbgUiIssueRemoteBreakin заблокирована.

30. CheckReturnCode
Проверяют что код после выхода из этой функции не модифицирован.

31. CheckPluginApiHooks
- Вызывают VirtualQuery для текущего процесса.
- Ищут во всех страницах памяти строки "PluginHooks TID", "Api_log doInject" и код
Code:
  1. 60              PUSHAD
  2. 51              PUSH ECX
  3. 50              PUSH EAX
  4. E8 90909090     CALL ????  (any)
  5. 83F8 00         CMP EAX,0
  6. 74 0D           JE SHORT $13
  7. 61              POPAD
  8. 83C4 04         ADD ESP,4
  9. 51              PUSH ECX
  10. 50              PUSH EAX

- Если найдено, то плагин обнаружен.

32. RestoreFuncNtQueryInformation
- Выполняют VirtualProtect с PAGE_EXECUTE_READWRITE для первых 8 байт функций NtQuerySystemInformation и NtQueryInformationProcess.
- Вход в EnterCriticalSection
- Копируют 8 байт в функции из соответствующих функций файла ntdll.dll
- Выход из LeaveCriticalSection

33. CheckVerifications
Проверяют, что проверки 8, 30, 6, 12, 15, 31, 5, 10, 21, 25, 22, 3, 4 выполнены и библиотека ntdll.dll была
загружена с диска для проверки функций.

34. CheckWine
Если Wine и функция wine_get_unix_file_name отсутствует в библиотеке kernel32.dll, то ExitProcess.

На этом Callback TLS3 заканчивается.

-----
Everything is relative...




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

Создано: 18 июня 2017 15:02
· Личное сообщение · #23

Присутствует также стандартная проверка загруженных модулей на наличие следующих драйверов:
sice.sys
siwvid.sys
ntice.sys
iceext.sys
syser.sys




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

Создано: 18 июня 2017 15:26
· Личное сообщение · #24

gggeorggge пишет:
проверка загруженных модулей на наличие следующих драйверов

Это в какой функции проверяется?
Что-то такого не видел, возможно это 23 проверка, тело которой я пока не нашел.

-----
Everything is relative...




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

Создано: 19 июня 2017 09:25
· Личное сообщение · #25

Vamit пишет:
Это в какой функции проверяется?

0xea4a9d




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

Создано: 19 июня 2017 10:05
· Личное сообщение · #26

AntiAttach

В производную функцию от CWinApp::OnIdle и ещё в несколько периодически повторяющихся функций вставлена функция защиты, выполняющая следующие проверки:
- Если TLS Callback3 не вызывался, то вызвать.
- CheckDbgException
- RestoreFuncNtQueryInformation
- CheckApiMonitor
- CheckRing3Debugger
- CheckCodeKernelFunction
- RestoreFastSysCallx64
- CheckWine
Все они были рассмотрены ранее.
- Новая проверка DetectVehdebugDll
Проверяют, запущена ли библиотека "vehdebug-i386.dll", если запущена, то ExitProcess.

gggeorggge пишет:
0xea4a9d

Это вмпротовский адрес, вот найти бы на него переход из сегмента кода...

-----
Everything is relative...





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

Создано: 19 июня 2017 16:26
· Личное сообщение · #27

Vamit

Что именно искать, ветвление на адрес 0xEA4A9D ?
А он точно фиксированный.. ща посмотрим.

-----
vx





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

Создано: 19 июня 2017 17:49 · Поправил: Vamit
· Личное сообщение · #28

difexacaw пишет:
ветвление на адрес 0xEA4A9D ?

Да, простой jmp на него из сегмента кода проги, а вообще есть какая-нибудь утиль для поиска по неразмеченному (недизасемблированному) коду безусловных переходов на фиксированные адреса?
Тут нужно просматривать каждый байт на Е9 (jmp) и последующие 4 байта из офсета преобразовывать в адрес, самому писать не охота...
У меня таких не найденных адресов аж 7 штук.
А смысл такой, например, функа просто мутирована вмпротом и если из неё вызывается виртуализованная функа, то вместо call RealAddr, в ней будет call EntryPoint в виртуализованное тело. Но на эту же точку из реального кода должен быть jmp EntryPoint, вот его и надо найти. 0xEA4A9D - это как раз EntryPoint.

-----
Everything is relative...





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

Создано: 19 июня 2017 21:46 · Поправил: difexacaw
· Личное сообщение · #29

От модератора: Яндекс заблочен в Украине, просьба заливать на мировой ресурс

Vamit

Да, я под визором запустил. Появился гуй но ветвлений на нужный адрес не обнаружено. Но следуеть понимать что у меня тулз сырой в разработке. Стоят шлюзы на старт потоков, APC и теневые колбеки. Отсюда начинается исполнение любого потока, при этом памяти не нужен EX атрибут(для всего АП, за исключением среды визора), смотрите в другой теме видос вчера снимал --> Link <--

Я пробовал депротектить память от исполнения, приложение тихо снимается через некоторое время.. Это проблемы обработки исключений, я исправлю это.

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

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

Смысл понятен - обнаружить не стековое ветвление. Это нельзя сделать не раскодируя поток инструкций.

-----
vx




Ранг: 12.2 (новичок), 11thx
Активность: 0.020
Статус: Участник

Создано: 20 июня 2017 00:08
· Личное сообщение · #30

>>А смысл такой, например, функа просто мутирована вмпротом и если из неё вызывается виртуализованная функа, то вместо call RealAddr, в ней будет call EntryPoint в виртуализованное тело. Но на эту же точку из реального кода должен быть jmp EntryPoint, вот его и надо найти. 0xEA4A9D - это как раз EntryPoint.

А разве у виртуализированной функи не может быть несколько разных входов в ВМ?
Скажем, первые несколько блоков пикода различаются, а дальше VM_PIC сливается с основным потоком.




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

Создано: 20 июня 2017 00:29
· Личное сообщение · #31

srm60171

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

> От модератора: Яндекс заблочен в Украине, просьба заливать на мировой ресурс

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

-----
vx



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


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