Сейчас на форуме: r0lka, johnniewalker, vsv1, NIKOLA (+4 невидимых)

 eXeL@B —› Крэки, обсуждения —› LLVM, Clang для реверсинга
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 09 декабря 2019 14:54
· Личное сообщение · #1

Собственно, в чем профит, кроме построения синтаксич деревьев?



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 31 января 2020 09:56
· Личное сообщение · #2

mak пишет:
получить информацию, специфичную для текущего состояния.

Как профит - внести корректировку в данную инфу и отправить далее на следующий шаг исправленный вариант. Но это для всяких протекторов годится по идее. Или в случаях, когда вижу, что компмлятор не смог самостоятельно родить оптимизированный код - не использовал регистры в цикле, который работает 100500 раз или когда хочется экзотики в виде использования регистра ESP/RSP, как общего назначения, а EAX/RAX вместо него. Но llvm только предоставляет эту инфу, а инструменты ее корректировки - блокнот костылятся самостоятельно без участия llvm.mak пишет:
через тест можно понять ..






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

Создано: 31 января 2020 10:38 · Поправил: plutos
· Личное сообщение · #3

может кому-то будет интересно: --> Tutorial <--: Creating an LLVM Backend for the Cpu0 Architecture, Release 3.9.1
Почти без "воды", конкретные примеры (10,000 lines of source code!), даже я начинаю понимать!

Book example code:
The example code lbdex.tar.gz is available in:--> Link <--

ну и --> LLVM <--by Chris Lattner: на мой взгляд очень толковый обзор big picture, именно то, что искал такой начинающий в этой области человек, как я.
Корифеи наверное это уже и так знают, но если кто только вступает "в тему", то в самый раз!

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


| Сообщение посчитали полезным: mak, sefkrd, Hugo Chaves, bartolomeo, ELF_7719116


Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 07 февраля 2020 13:38 · Поправил: mak
· Личное сообщение · #4

SATURN -- Software Deobfuscation Framework Based on LLVM

The strength of obfuscated software has increased over the recent years. Compiler based obfuscation has become the de facto standard in the industry and recent papers also show that injection of obfuscation techniques is done at the compiler level. In this paper we discuss a generic approach for deobfuscation and recompilation of obfuscated code based on the compiler framework LLVM. We show how binary code can be lifted back into the compiler intermediate language LLVM-IR and explain how we recover the control flow graph of an obfuscated binary function with an iterative control flow graph construction algorithm based on compiler optimizations and SMT solving. Our approach does not make any assumptions about the obfuscated code, but instead uses strong compiler optimizations available in LLVM and Souper Optimizer to simplify away the obfuscation. Our experimental results show that this approach can be effective to weaken or even remove the applied obfuscation techniques like constant unfolding, certain arithmetic-based opaque expressions, dead code insertions, bogus control flow or integer encoding found in public and commercial obfuscators. The recovered LLVM-IR can be further processed by custom deobfuscation passes that are now applied at the same level as the injected obfuscation techniques or recompiled with one of the available LLVM backends. The presented work is implemented in a deobfuscation tool called SATURN.

Comments: reverse engineering, llvm, code lifting, obfuscation, deobfuscation, static software analysis, binary recompilation, binary rewriting
Subjects: Cryptography and Security (cs.CR); Symbolic Computation (cs.SC)
Journal reference: 3rd International Workshop on Software PROtection, Nov 2019, London, United Kingdom

Info --> Link <--
Pdf --> Link <--
Tests --> Link <--

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube


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


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

Создано: 08 февраля 2020 02:43
· Личное сообщение · #5

mak пишет:
SATURN -- Software Deobfuscation Framework Based on LLVM


А source code for saturn.dll они нигде не дают?

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





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

Создано: 19 апреля 2020 09:06
· Личное сообщение · #6

Еще один tutorial по теме LLVM and Binary Obfuscation.

Build your first --> LLVM Obfuscator <--

Мне было интересно, поэтому решил поделиться, но, как всегда: НИКАКОЙ ГАРАНТИИ ЗА КАЧЕСТВО!

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




Ранг: 9.1 (гость), 20thx
Активность: 0.040.08
Статус: Участник

Создано: 19 апреля 2020 13:33
· Личное сообщение · #7

Скажите, пожалуйста, я правильно понимаю, что следующее теоритически(практически?) возможно: обфусцированный код переводим в IR (LLVM? MIASM?), далее в C (JuliaComputing/llvm-cbe?), далее в компилятор с опциями -Ox, достаём асм код и вставляем в дизасм? Или это я совсем примитивно размышляю? =)



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 19 апреля 2020 14:41
· Личное сообщение · #8

Правильно понимаешь, но прийдется допилить напильником.

-----
старый пень




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 19 апреля 2020 16:08
· Личное сообщение · #9

Illuzion - много лишних действий.
Оптимизатор работает на уровне LLVM IR, не надо в C переводить и потом собирать.



Ранг: 9.1 (гость), 20thx
Активность: 0.040.08
Статус: Участник

Создано: 21 апреля 2020 01:01 · Поправил: Illuzion
· Личное сообщение · #10

Попробовал, вообще вроде как неплохо сворачивает. Небольшой пример из реального протектора:

Code:
  1.  
  2. .data?
  3. res      DWORD ?
  4.  
  5. _test proc               
  6. mov     edx, 0F0E5h
  7. add     edx, 354D723Dh
  8. sub     edx, 354E5F2Eh
  9.                  
  10. push    esi
  11. mov     [esp], edx
  12. bswap   edx
  13. mov     edx, eax
  14. pop     eax       
  15.                  
  16. ret
  17.  
  18. _test endp
  19.          
  20. start:   
  21.          
  22. call _test
  23. mov res, eax
  24.          
  25. end start
  26.  


Получаем такое:

Code:
  1. int32_t entry_point(void);
  2. int32_t function_401000(void);
  3.  
  4. // --------------------- Global Variables ---------------------
  5.  
  6. int32_t g1 = 0; // 0x402000
  7.  
  8. // ------------------------ Functions -------------------------
  9.  
  10. // Address range: 0x401000 - 0x40101b
  11. int32_t function_401000(void) {
  12.     // 0x401000
  13.     return 1012;
  14. }
  15.  
  16. // Address range: 0x40101b - 0x401025
  17. int32_t entry_point(void) {
  18.     int32_t result = function_401000(); // 0x40101b
  19.     g1 = result;
  20.     return result;
  21. }


После компиляции "gcc -O3" с парой Warning получаем такое:

Code:
  1. mov     eax, 3F4h


Прямо как-то вообще же красиво ? Всё посчитал и свернул как надо.

Второй пример попробовал из этого топика Online Deobfuscator и получилось вот что:

Code:
  1. sub_100401080 proc near
  2.  
  3. var_4= dword ptr -4
  4.  
  5. push    rbp
  6. mov     rbp, rsp
  7. sub     rsp, 10h
  8. mov     eax, [rbp+var_4]
  9. imul    eax, 57h ; 'W'
  10. add     rsp, 10h
  11. pop     rbp
  12. retn
  13. sub_100401080 endp


cppasm, а Вы предлагаете вот прямо из такой каши (см. ниже) делать оптимизацию и сразу в асм сворачивать? Ну.. Конечно для простых примеров и пары mov/push это вроде не сложно реализовать, а для более сложного страшновато выглядит. Или готовые полу-/средства есть?

Code:
  1. source_filename = "test"
  2. target datalayout = "e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
  3.  
  4. @global_var_402000 = local_unnamed_addr global i32 0
  5.  
  6. define i32 @function_401000() local_unnamed_addr {
  7. dec_label_pc_401000:
  8.   ret i32 1012, !insn.addr !0
  9. }
  10.  
  11. define i32 @entry_point() local_unnamed_addr {
  12. dec_label_pc_40101b:
  13.   %0 = call i32 @function_401000(), !insn.addr !1
  14.   store i32 %0, i32* @global_var_402000, align 4, !insn.addr !2
  15.   ret i32 %0, !insn.addr !2
  16. }
  17.  
  18. !0 = !{i64 4198426}
  19. !1 = !{i64 4198427}
  20. !2 = !{i64 4198432}
  21.  





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

Создано: 21 апреля 2020 02:52 · Поправил: plutos
· Личное сообщение · #11

plutos пишет:
может кому-то будет интересно: --> Tutorial <--: Creating an LLVM Backend for the Cpu0 Architecture, Release 3.9.1


кто-нибудь пытался по этому туториалу собрать Cpu0 example code?
Appendix A: Getting Started: Installing LLVM and the Cpu0 example code
Все собирается нормально, но после всех шагов в
~/llvm/test/src/lib/Target/Cpu0/ExampleCode/lbdex/InputFiles эти самые ExampleCode/lbdex/InputFiles отсутствуют.

Т.е. ~/llvm/test/src/lib/Target/Cpu0 есть, а дальше нет.
Использовал Cpu0 example code, lbdex отсюда: http://jonathan2251.github.io/lbd/lbdex.tar.gz.

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





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

Создано: 21 апреля 2020 03:32 · Поправил: Bronco
· Личное сообщение · #12

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

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




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 21 апреля 2020 11:27
· Личное сообщение · #13

Illuzion пишет:
cppasm, а Вы предлагаете вот прямо из такой каши (см. ниже) делать оптимизацию и сразу в асм сворачивать? Ну.. Конечно для простых примеров и пары mov/push это вроде не сложно реализовать, а для более сложного страшновато выглядит. Или готовые полу-/средства есть?

Это не надо реализовывать.
В LLVM есть оптимизатор (opt), который оптимизирует код после компиляции, и он работает с LLVM IR.
Надо из нативного кода получить LLVM IR и на него натравить opt.
Ну насколько сильно то что он наоптимизирует соответствует тому что ты хочешь это вопрос, но по идее будет то же самое что при компиляции C кода получается.
Как по мне, поднимать LLVM IR по Си кода это сложная задача, и излишняя в данном случае.
Ну и вот такое ещё есть, но я не юзал: https://github.com/google/souper

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


Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 21 апреля 2020 15:35
· Личное сообщение · #14

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


Общие схемы нормально работают на любом коде, т.к. есть абстракция в LLVM-IR, но перед этим конечно нужно развернуть код в линейный, а это большая тема, много техник есть и каждая подходит в своём конкретном месте, но есть и универсальные, у тебя они есть, т.к. ты уникорн используешь. А шаблоны там реализуются очень удобно, можно гибко настраивать оптимизацию под каждый случай (редкий случай). Я ожидал, что Ида Про будет развивать это "линейное" направление, но они тупо слились со своим питоном и системой плагинов.

cppasm пишет:
Ну и вот такое ещё есть, но я не юзал: https://github.com/google/souper


Линейный фронтенд нужен в любом случае, но проект классный.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





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

Создано: 21 апреля 2020 23:24
· Личное сообщение · #15

mak пишет:
Общие схемы нормально работают на любом коде,

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

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





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

Создано: 22 апреля 2020 01:13 · Поправил: plutos
· Личное сообщение · #16

plutos пишет:
кто-нибудь пытался по этому туториалу собрать Cpu0 example code?


Если кто-нибудь столкнется с подобной проблемой - решение очень простое: используйте --> updated <-- version of this tutorial:

Другие, старые версии, очень похожи на настоящиe, но не работают!

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




Ранг: 9.1 (гость), 20thx
Активность: 0.040.08
Статус: Участник

Создано: 23 апреля 2020 01:53 · Поправил: Illuzion
· Личное сообщение · #17

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

Code:
  1. push 0   ;nop??
  2. push esp ;nop??
  3. ;nop*******
  4. push    esi
  5. mov     [esp], edx
  6. bswap   edx
  7. mov     edx, eax
  8. pop     eax
  9. xchg    eax, edx
  10. ;-----------------------
  11. push    esi       ;nop??
  12. ;nop*******
  13. mov     esi, 0CFh ;used later with MOV
  14. ;nop*******
  15. push    edx
  16. mov     dl, bl
  17. pop     edx
  18. ;-----------------------
  19. push    ecx       ;nop??
  20. ;nop*******
  21. push    edi
  22. bswap   edi
  23. pop     edi
  24. ;mov ecx, edi ;edi is undefined and ecx used later, so NOP
  25. push    edi
  26. mov     ecx, eax  ;ecx == old_eax
  27. pop     eax                  ;eax == edi
  28. xchg    eax, ecx  ;ecx == edi, eax == old_eax
  29. ;-----------------------
  30. push    edx       ;nop??
  31.  
  32. ;mov esi, ebx-----------
  33. push    ebx
  34. pusha
  35. mov     esi, [esp+20h]
  36. lea     esp, [esp+24h]
  37. ;nop*******
  38. push    esi
  39. mov     ecx, edi
  40. lea     esp, [esp+4]
  41. ;nop*******
  42. push    eax
  43. mov     dl, 7Dh ;used later with MOV
  44. pushf
  45. push    eax
  46. push    esi
  47. mov     eax, [esp+0Ch]
  48. lea     esp, [esp+10h]
  49. ;-----------------------
  50. push    ebx ;nop??
  51. ;nop*******
  52. mov     ecx, 57h ;used later with MOV
  53. ;-----------------------
  54. pushf    ;nop??
  55. ;shl ebx, 1?
  56. pusha
  57. mov     esi, 0E4h
  58. not     esi
  59. sub     esi, 3099356Bh     ;ESI == 0xCF66C9B0
  60. mov     dl, 0F8h ;used later with MOV
  61. add     ebx, [esp+esi+30993654h] ;add ebx, [esp+4] ==> add ebx, ebx ==> shl ebx, 1?
  62. add     esp, 20h
  63. ;nop*******
  64. push    eax
  65. sub     cl, 0AEh ;used later with MOV
  66. pop     eax
  67. ;mov ecx, ebp
  68. push    ebp
  69. push    180h
  70. mov     edx, 5B1F04F1h
  71. xor     edx, 6ADB1F45h
  72. add     edx, 0CE3BE450h    ;edx == 4
  73. mov     ecx, [esp+edx]     ;mov ecx, [esp+4] ==> mov ecx, ebp
  74. add     esp, 8
  75. ;-----------------------
  76. push    ecx       ;nop??
  77. push    eax       ;nop??
  78. ;nop*******
  79. mov     [esp], eax
  80. ;-----------------------
  81. push    edx ;nop??
  82. ;push edi --> nop??
  83. mov     edx, 58h
  84. rol     edx, 2
  85. add     edx, 130D4246h     ;EDX == 130D43A6
  86. mov     [esp+edx-130D43A6h], edi    ;mov [esp], edi
  87. sub     edi, edx ;used later with MOV
  88. ;-----------------------------------------------
  89. add     esp, 2Ch ;clear stack up to this function start, ret address on the top
  90. ;-----------------------------------------------
  91. ;-----------------------
  92. sub     esp, 200h
  93. sub     esp, 200h
  94. mov     ebp, esp
  95. ;nop*******
  96. mov     ebx, 1C0Fh         ;nop see below
  97. mov     ecx, 5E9Ah         ;used later with MOV
  98. ;nop*******
  99. or      edi, 0F3h ;used later with MOV
  100. ;nop*******
  101. push    esi
  102. mov     esi, eax
  103. pop     esi
  104. ;nop*******
  105. mov     edi, ecx
  106. add     edi, 14h
  107. add     edi, 0FFFFFEACh    ;EDI == 0x5D5A
  108. sar     cl, 1Fh
  109. mov     esi, [ebp+edi-5B72h]        ;mov esi, [ebp+1E8] ==> nop, less than stack decrement
  110. ;nop*******
  111. not     ebx
  112. xor     ebx, 0F9880EC8h    ;EBX == 0677ED38
  113. ;nop*******
  114. push    ebx
  115. mov     ecx, ecx
  116. pop     ebx
  117. ;mov edx, [ebp+3FCh]
  118. mov     edx, [ebp+ebx-677E944h]
  119. add     edx, 8    ;EDX == ret address
  120. ;nop*******
  121. mov     ebx, 0EFh
  122. ;mov [ebp+3F4], edx
  123. mov     ecx, ebx
  124. shl     ecx, 5
  125. xor     ecx, 2A95E235h
  126. xor     bl, 6
  127. mov     [ebp+ecx-2A95FBE1h], edx
  128. ;-----------------------
  129. mov     esi, 3DF4B8h
  130. ;nop*******
  131. mov     ebx, 0F991h
  132. mov     cl, ah
  133. mov     ecx, ebx
  134. add     ecx, 9Fh
  135. add     ecx, 0FFFF072Ch ;ecx == 0x15C
  136. ;nop*******
  137. push    ecx
  138. mov     [esp], eax
  139. bswap   eax
  140. pop     eax
  141. ;mov [ebp+15C], esi
  142. mov     [ebp+ecx+0], esi
  143. ;----------------------
  144. mov     esi, 3DF5A4h
  145. mov     ebx, 89h
  146. ;nop*******
  147. pusha
  148. mov     ecx, 4Fh 
  149. rol     ecx, 5
  150. add     ecx, 2CD226AEh ;ecx == 2CD2308E
  151. push    ecx
  152. ;nop*******
  153. mov     edi, 24h 
  154. add     edi, 45D4h
  155. sub     edi, 45F8h
  156. mov     [esp+edi], edx
  157. ;nop*******
  158. and     edx, edi
  159. ;mov edx, ecx
  160. pop     edx
  161. ;mov edx, ebx
  162. mov     edx, [esp+ecx-2CD2307Eh]
  163. add     esp, 20h
  164. ;----------------------------------
  165. ;mov edx, ebx
  166. ;----------------------------------
  167. ;nop*******
  168. shr     edx, 0Fh
  169. sub     edx, 0DDB39F3Fh    ;edx == 0x224C60C1
  170. mov     ebx, eax
  171. ;mov [ebp+0AC], esi
  172. mov     [ebp+edx-224C6015h], esi
  173. mov     ebx, 3DF2D4h
  174. call    ebx


По-человечески, получается, всего лишь:

Code:
  1. sub     esp, 0x400
  2. mov     ebp, esp
  3. mov edx, [ebp+0x3FC]
  4. mov [ebp+0x3F4], edx
  5. mov esi, 0x3DF4B8
  6. mov [ebp+0x15], esi
  7. mov eax, 1
  8. mov ebx, eax
  9. mov esi, 0x3DF5A4
  10. mov [ebp+0xAC], esi
  11. call 0x3DF2D4


А после оптимизации opt или retdec:

Code:
  1. push     ebp
  2.          push    ebx
  3.          push    edi
  4.          push    esi
  5.          sub     esp, 220
  6.          call    ___decompiler_undefined_function_0
  7.          mov     esi, eax
  8.          call    ___decompiler_undefined_function_0
  9.          mov     edi, eax
  10.          call    ___decompiler_undefined_function_0
  11.          mov     ebp, eax
  12.          call    ___decompiler_undefined_function_0
  13.          mov     dword ptr [esp + 76], eax # 4-byte Spill
  14.          call    ___decompiler_undefined_function_1
  15.          mov     byte ptr [esp + 16], al # 1-byte Spill
  16.          call    ___decompiler_undefined_function_1
  17.          mov     byte ptr [esp + 80], al # 1-byte Spill
  18.          call    ___decompiler_undefined_function_1
  19.          mov     byte ptr [esp + 60], al # 1-byte Spill
  20.          call    ___decompiler_undefined_function_1
  21.          mov     byte ptr [esp + 84], al # 1-byte Spill
  22.          call    ___decompiler_undefined_function_1
  23.          mov     ebx, eax
  24.          call    ___decompiler_undefined_function_1
  25.          mov     bh, al
  26.          call    ___decompiler_undefined_function_2
  27.          mov     byte ptr [esp + 72], al # 1-byte Spill
  28.          test    bh, 1
  29.          jne     LBB0_3
  30. %bb.1:                                # %dec_label_pc_3d
  31.          test    bl, 1
  32.          jne     LBB0_3
  33. %bb.2:                                # %dec_label_pc_56
  34.          and     ebp, -256
  35.          or      ebp, 125
  36.          mov     dword ptr [esp + 204], ebp
  37. LBB0_3:                                 # %dec_label_pc_6b
  38.          mov     eax, dword ptr [esp + 204]
  39.          mov     dword ptr [esp + 88], eax
  40.          mov     edx, dword ptr [esp + 96]
  41.          mov     dword ptr [esp + 200], 384
  42.          lea     ecx, [esp + 200]
  43.          mov     eax, ecx
  44.          add     eax, 8
  45.          mov     dword ptr [esp + 100], 4
  46.          jns     LBB0_5
  47. %bb.4:                                # %dec_label_pc_b4
  48.          add     edx, edi
  49.          movzx   edx, dh
  50.          mov     dword ptr [esp + 100], edx
  51. LBB0_5:                                 # %dec_label_pc_b6
  52.          mov     edx, ecx
  53.          xor     edx, -2147483648
  54.          test    eax, eax
  55.          sets    byte ptr [esp + 26]
  56.          test    eax, edx
  57.          mov     edx, dword ptr [esp + 100]
  58.          sets    byte ptr [esp + 27]
  59.          cmp     ecx, -8
  60.          mov     dword ptr [esp + 104], eax
  61.          mov     dword ptr [esp + 108], edx
  62.          jb      LBB0_7
  63. %bb.6:                                # %dec_label_pc_c0
  64.          or      edx, esi
  65.          mov     dword ptr [esp + 104], edx
  66.          sets    byte ptr [esp + 26]
  67.          mov     byte ptr [esp + 27], 0
  68.          mov     dword ptr [esp + 108], edx
  69. LBB0_7:                                 # %dec_label_pc_c2
  70.          cmp     dword ptr [esp + 104], 0
  71.          jne     LBB0_11
  72. %bb.8:                                # %dec_label_pc_c8
  73.          mov     eax, dword ptr [esp + 108]
  74.          mov     cl, byte ptr [esp + 26]
  75.          mov     dword ptr [esp + 88], eax
  76.          cmp     cl, byte ptr [esp + 27]
  77.          jne     LBB0_10
  78. %bb.9:                                # %dec_label_pc_d4
  79.          lea     eax, [esp + 88]
  80.          mov     dword ptr [esp + 92], eax
  81.          mov     dword ptr [esp + 96], offset _global_var_68
  82.          lea     eax, [esp + _global_var_24+72]
  83.          lea     ecx, [esp + 96]
  84.          add     ecx, offset _global_var_28
  85.          mov     dword ptr [esp + 208], eax
  86.          je      LBB0_11
  87. LBB0_10:                                # %dec_label_pc_f6
  88.          lea     eax, [esp + 88]
  89.          mov     dword ptr [esp + 92], eax
  90.          lea     eax, [esp + 220]
  91.          mov     dword ptr [esp + 208], eax
  92. LBB0_11:                                # %dec_label_pc_160
  93.          mov     eax, dword ptr [esp - 108521736]
  94.          add     eax, 8
  95.          mov     dword ptr [esp + 1016], eax
  96.          mov     dword ptr [esp + 352], 4060344
  97.          mov     edx, dword ptr [esp + 76] # 4-byte Reload
  98.          mov     byte ptr [esp], dl
  99.          mov     dword ptr [esp + 8], eax
  100.          mov     dword ptr [esp + 12], 137
  101.          lea     edi, [esp + 4]
  102.          mov     dword ptr [esp + 20], edi
  103.          mov     dword ptr [esp + 48], edi
  104.          mov     dword ptr [esp + 52], 23898
  105.          mov     dword ptr [esp + 40], 751972494
  106.          mov     dword ptr [esp + _global_var_24+4], eax
  107.          mov     ecx, dword ptr [esp + 68]
  108.          shr     ecx, 15
  109.          mov     dword ptr [esp + ecx + 176], 4060580
  110.          movsx   ecx, dl
  111.          push    ecx
  112.          push    348
  113.          push    eax
  114.          push    137
  115.          push    edi
  116.          push    edi
  117.          push    4060580
  118.          push    23898
  119.          call    _unknown_3df2d4


Оптимизация вообще неверно сделана. Перед последним вызовом 0x03df2d4 там в стек летят непонятные числа. Откуда они взялись, как он оптимизировал - мрак

И ещё вопрос. При работе с шаблонами мы руководствуемся именно шаблонами инструкций? Что, собственно, просто. Т.е. :

Code:
  1. mov r32, imm32_1
  2. xor r32, imm32_2
  3. add r32, imm32_3


Сворачиваем в:

Code:
  1. mov r32, (imm32_1 ^ imm32_2 + imm32_3)


Или же мы Taint Analysis всей трассы делаем? Т.е. упрощаем код не по инструкциям, а по изменениям, которые этот код производит. Собираем все изменения и в один прекрасный момент машина/наш код понимает, что изменить data по адресу 0х1 и 0х4 с числа семь на число восемь можно было всего лишь одной инструкцией X, а остальные 20 инструкций были ненужны - и оп, чудо, удаляем их?




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

Создано: 23 апреля 2020 04:37
· Личное сообщение · #18

Illuzion пишет:
Вот, например длинная портянка обфускации

абстракция не глубокая, ваще почти нет, всё как на ладошке.
многое читаемо, под морфом только дисплейшен и имидиата.
перестановок нет, pushad&popad нет, радуйся что за контекстом следить не надо.
если с промежуточным кодом тебе комфортней и есть преимущества,
сам дели на блоки и скармливай оптимайзеру&решателю.
Illuzion пишет:
Оптимизация вообще неверно сделана.

шо и требовалось доказать, улыбнуло.

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




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

Создано: 23 апреля 2020 10:36
· Личное сообщение · #19

Illuzion Знакомая вм Ну ты пока в самом начале пути.
Рано или поздно ты придешь к этому --> Link <-- и заметь, там уже чистый код с распознанных и деобфусцированных хендлеров
Сам интерпретатор выполняет байткод который тоже разбавлен мусором. На чём собственно, я и слился
Оригинальный код ты всё равно уже никогда не достанешь.

Illuzion пишет:
И ещё вопрос. При работе с шаблонами мы руководствуемся именно шаблонами инструкций?

Да, но там их практически никак не применить

Добавлено спустя 50 минут
Bronco
Извини, но ты не мог бы по-русски писать, хоть немного?
Я, наверное, не совсем нуб в "сленге", но реально иногда вообще не понимаю о чем ты пишешь, как впрочем и автор х64dbg.
Что такое "абстракция не глубокая" и "дисплейшен"?
Там есть и перестановки регистров, и pushad&popad, и за контекстом следить надо... а это чуть меньше чем 256 rvm регистров,
Речь про RISC подобную машину с примитивными операциями("load","store" и простыми мат. операциями "+", "-", "*", "/", "not", "and")

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

Ранг: 9.1 (гость), 20thx
Активность: 0.040.08
Статус: Участник

Создано: 23 апреля 2020 11:30 · Поправил: Illuzion
· Личное сообщение · #20

SReg пишет:
Illuzion Знакомая вм Ну ты пока в самом начале пути.


Не совсем так =) Квест "сделать что-надо" я прошёл достаточно просто. Решаю квест "как оно работает", мне кажется, он на порядок сложнее. Но главное, чтобы было интересно

SReg пишет:
Сам интерпретатор выполняет байткод который тоже разбавлен мусором.


Там часто в критических местах RET из ВМ на абсолютно чистую функцию ведёт, где проверки имя/код и т.п.

SReg, а вообще, теоритически реально ли по изменениям какой-либо информации в регистрах/памяти сгенерировать код, который бы изменения такие же делал? Т.е. не упростить данное, а именно отследить все изменения и сделать новый код?



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

Создано: 23 апреля 2020 11:44
· Личное сообщение · #21

Illuzion пишет:
Самое главное, что часто в критических местах RET из ВМ на абсолютно чистую функцию ведёт. Там что-то авторы не доделали.

Ну, не будь слишком самоуверенным, в той другой твоей теме, я просто поленился тот бред комментировать
Ты про какой ret, приведи пример? Всё там сделано как надо.
ret там только в конце хендлера 'vm_exit' после восстановления контекста (vm_ctx->real_ctx)



Ранг: 9.1 (гость), 20thx
Активность: 0.040.08
Статус: Участник

Создано: 23 апреля 2020 11:59 · Поправил: Illuzion
· Личное сообщение · #22

SReg пишет:
в той другой твоей теме, я просто поленился тот бред комментировать


В чём был бред там? Конкретней, пожалуйста.

SReg пишет:
Ты про какой ret, приведи пример?


Пример:

Code:
  1. 00DE4AE0  SUB ECX, 0x4                                       
  2. 00DE4AE3  MOV DWORD PTR DS:[ECX], EAX                        
  3. 00DE4AE5  MOV EAX, DWORD PTR DS:[EDI + 0x50]                 
  4. 00DE4AE8  SUB ECX, 0x4                                       
  5. 00DE4AEB  MOV DWORD PTR DS:[ECX], EAX                        
  6. 00DE4AED  MOV EAX, DWORD PTR DS:[EDI]                        
  7. 00DE4AEF  SUB ECX, 0x4                                       
  8. 00DE4AF2  MOV DWORD PTR DS:[ECX], EAX                        
  9. 00DE4AF4  MOV EAX, DWORD PTR DS:[EDI + 0x4]                  
  10. 00DE4AF7  SUB ECX, 0x4                                       
  11. 00DE4AFA  MOV DWORD PTR DS:[ECX], EAX                        
  12. 00DE4AFC  MOV EAX, DWORD PTR DS:[EDI + 0x8]                  
  13. 00DE4AFF  SUB ECX, 0x4                                       
  14. 00DE4B02  MOV DWORD PTR DS:[ECX], EAX                        
  15. 00DE4B04  MOV EAX, DWORD PTR DS:[EDI + 0xC]                  
  16. 00DE4B07  SUB ECX, 0x4                                       
  17. 00DE4B0A  MOV DWORD PTR DS:[ECX], EAX                        
  18. 00DE4B0C  MOV EAX, DWORD PTR DS:[EDI + 0x10]                 
  19. 00DE4B0F  SUB ECX, 0x4                                       
  20. 00DE4B12  MOV DWORD PTR DS:[ECX], EAX                        
  21. 00DE4B14  MOV EAX, DWORD PTR DS:[EDI + 0x14]                 
  22. 00DE4B17  SUB ECX, 0x4                                       
  23. 00DE4B1A  MOV DWORD PTR DS:[ECX], EAX                        
  24. 00DE4B1C  MOV EAX, DWORD PTR DS:[EDI + 0x18]                 
  25. 00DE4B1F  SUB ECX, 0x4                                       
  26. 00DE4B22  MOV DWORD PTR DS:[ECX], EAX                        
  27. 00DE4B24  MOV EAX, DWORD PTR DS:[EDI + 0x1C]                 
  28. 00DE4B27  SUB ECX, 0x4                                       
  29. 00DE4B2A  MOV DWORD PTR DS:[ECX], EAX                        
  30. 00DE4B2C  LEA EAX, DWORD PTR DS:[ESI + 0xE668C0]             
  31. 00DE4B32  MOV BYTE PTR DS:[EAX], 0x0                         
  32. 00DE4B35  MOV ESP, ECX                                       
  33. 00DE4B37  POPAD                                              
  34. 00DE4B38  POPFD                                              
  35. 00DE4B39  RET


И, собственно, он ведёт много куда, но вот, например, сюда:

Code:
  1. ...
  2. 00D55CF8 | MOV EDI, DWORD PTR SS:[EBP - 0x4]  
  3. 00D55CFB | MOV EAX, 0x0 
  4. 00D55D00 | CPUID 
  5. 00D55D02 | MOV DWORD PTR DS:[EDI], EBX  
  6. 00D55D04 | MOV DWORD PTR DS:[EDI + 0x4], EDX  
  7. 00D55D07 | MOV DWORD PTR DS:[EDI + 0x8], ECX  
  8. 00D55D0A | MOV EAX, 0x1  
  9. 00D55D0F | CPUID 
  10. 00D55D11 | MOV EBX, EAX 





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 23 апреля 2020 12:50
· Личное сообщение · #23

Illuzion пишет:
Попробовал много разных связанных с LLVM проектов, но так до конца и не понял про оптимизацию.


Это бред .. зачем это делать? Проекты ради примеров хороши, но все проекты, что я видел сделаны через ж, т.к. автор слабо понимает, что он делает, 80 процентов кода можно выкинуть из проекта. Зачем брать ретдек ?!?! А потом сравнивать с другим выхлопом ?! Что за ....

Illuzion пишет:
Точнее, может он и делает то же самое (не уверен я), но выглядит как совсем две разные программы.

Две причины на то, первая, ты НЕ развернул код на линейный, вторая причина - после ИР обработки формируются новые шаблоны, но код должен быть узнаваем и это НОРМАЛЬНО.

Illuzion пишет:
Оптимизация вообще неверно сделана.

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

Что делаешь ты, ты взял код без фронтенда, перегнал его через оптимизацию(средставми которые заточены под другие цели :s2, потом взял повторил это шаг другим инструментом и сравнил код .. WTF ?!


Illuzion пишет:
И ещё вопрос. При работе с шаблонами мы руководствуемся именно шаблонами инструкций? Что, собственно, просто. Т.е. :

Illuzion пишет:
Или же мы Taint Analysis всей трассы делаем?

И то и то ... сорсы открыты, ты можешь всё посмотреть .. Это как раз из первого поста ELF_7719116 пишет:
это как прочитать всю "Война и мир" Толстого и попытаться осознать всю глубину сюжета.

Архитектуру нужно изучать, а потом уже судить

Bronco
"шо и требовалось доказать"

Добавлено спустя 8 минут
mak пишет:
но все проекты, что я видел сделаны через ж, т.к. автор слабо понимает, что он делает

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

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube


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

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

Создано: 23 апреля 2020 13:00
· Личное сообщение · #24

Illuzion пишет:
В чём был бред там? Конкретней, пожалуйста.

да так во многом, если не во всём ты бы лучше прислушивался, а не обижался
Ок. Например в Применим блочный RC5
Это которого там в помине никогда не было, есть RC4.

Далее вшитый в программу 256-битный ключ
ты просто не увидел RC4Init в XML файле проекта это <HardwareConstant>, а принял развернутый ключ как за "вшитый"

Далее, Используем шаблон "ABCDEF1234567890"
тут я вообще в осадок выпал, т.к. это называется Base16ToBase256

Далее, контрольная сумма
это младшие 16 бит от СRC32 (где данные это длина base256 hw без первого word)

Далее, есть паблик скрипты. Сейчас этого не сделать, т.к. по-сути там нет цельного понятия хвид, он только для пользователся в таком виде представлен
тут ты даже не понял, почему скрипты внезапно не работает. Ок, подскажу: потому что vcl функции теперь под ВМ, такие как LStrLen, LStrFromPChar, и т.д.


по второму:
Illuzion пишет:
Пример:

Ну и? В чем вопрос-то, что некоторые инструкции не транслируются (fpu reg, cpuid)?
И это кстати тоже vm_exit и переход на реальный код, а ты выше спрашивал про совершенно другую вм, и оттуда приводил куски.

Добавлено спустя 6 минут
Illuzion пишет:
SReg, а вообще, теоритически реально ли по изменениям какой-либо информации в регистрах/памяти сгенерировать код, который бы изменения такие же делал? Т.е. не упростить данное, а именно отследить все изменения и сделать новый код?


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

З.Ы. Естественно я щас пишу про RISC, а та вм что ты говоришь она для новичков, и лично мне совершенно не интересна...

Добавлено спустя 15 минут
mak пишет:
после ИР обработки формируются новые шаблоны

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

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

Ранг: 9.1 (гость), 20thx
Активность: 0.040.08
Статус: Участник

Создано: 23 апреля 2020 13:21
· Личное сообщение · #25

SReg согласен, спасибо.

SReg пишет:
Ну и? В чем вопрос-то, что некоторые инструкции не транслируются (fpu reg, cpuid)?
И это кстати тоже vm_exit и переход на реальный код, а ты выше спрашивал про совершенно другую вм, и оттуда приводил куски.


Странно, тут видимо 2 ВМ? Это все один файл. Просто они не транслируют не только инструкции, а целые функции самого протектора, результаты которых мы можем менять.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 23 апреля 2020 13:28 · Поправил: mak
· Личное сообщение · #26

SReg пишет:
в той вм, про которую он говорил, там на ИР не применить шаблоны, так как она не шаблонная
з.ы. А, вру. Разве что только на циклах.


Топик про ЛЛВМ, а не про разбор ВМ-ок, я имел ввиду шаблоны оптимизации для ЛЛВМ, чтобы разбирать ВМ на ЛЛВМ нужно сделать дополнительные движения в первом и третьем пункте, что я считаю слишком кучным, поэтому нужно выносить АПИ на внешний компонент и делать фреймворк, а не лепить всё в один пакет.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube


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

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

Создано: 23 апреля 2020 13:43
· Личное сообщение · #27

mak пишет:
Топик про ЛЛВМ, а не про разбор ВМ-ок

Вот тут да, согласен. Сливаюсь.
Если бы еще на практике так было всё просто как в теории... Эх-х

Illuzion пишет:
Странно, тут видимо 2 ВМ? Это все один файл. Просто они не транслируют не только инструкции, а целые функции самого протектора, результаты которых мы можем менять.

Да, две. И совершенно разные. Начни с простого, концепции ВМ например, многое станет понятно и вопросы отпадут. Транслятор это то, что транслирует например асм86 код в байткод, под другой процессор. А у тебя в файле интерпретатор, который и исполняет "транслированный" байт-код




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

Создано: 23 апреля 2020 21:11 · Поправил: Bronco
· Личное сообщение · #28

SReg пишет:
Извини, но ты не мог бы по-русски писать, хоть немного?

сорян, но что на уме то и на языке, иногда зайду поправлю.
SReg пишет:
Что такое "абстракция не глубокая" и "дисплейшен"?

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

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





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

Создано: 23 апреля 2020 23:32
· Личное сообщение · #29

Illuzion пишет:
Откуда они взялись, как он оптимизировал - мрак

Это потому что у llvm оптимизации заточены под другое, они содержат и общие оптимизации в том числе, но для деобфускации подходят лишь косвенно.
Взять проект который с горем пополам транслирует x86 в llvm ir, применяет стандартные проходы, и затем компилирует как C обратно в x86, и при этом надеятся получить чистый код очень опрометчиво.
Больше толка будет если вы напишете анализатор примитивов, далее статическую трассировку этих примитивов в llvm-ir, и уже тогда прокрутите оптимизацию.
Bronco пишет:
оптимайзеру дисплейшен результ имидиата

Ю вери лайк ту транскрипт инглиш вордс ин рашн, плиз стап зис шит.

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


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


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

Создано: 23 апреля 2020 23:55 · Поправил: ClockMan
· Личное сообщение · #30

del

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





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

Создано: 24 апреля 2020 00:23
· Личное сообщение · #31

Boostyq пишет:
Ю вери лайк ту транскрипт инглиш вордс ин рашн, плиз стап зис шит.

ест модус ин ребус..модераторус омет
а лучше принимайте людей такими какие они есть.

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



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


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