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

 eXeL@B —› Программирование —› Свёртка.
. 1 . 2 . 3 . >>
Посл.ответ Сообщение


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

Создано: 02 мая 2019 17:22
· Личное сообщение · #1

Тут исходный материал --> Link <--

Я взял EP модуля, обработанного вмп и вручную почистил мусор. Это мелкая тех задача, я её решу на днях(те проблема с кседом и нужно продумать алгоритмы по графам). Суть не в этом.

Исходный код:
Code:
  1. 00BBBC8F   push 7D9D0FB3
  2. 00BBBC94   call 007EDEE3
  3. 007EDEE3   push ebp
  4. 007EDEE4   mov bp,1B1E
  5. 007EDEE8   cmovpe ebp,edx
  6. 007EDEEB   pushfd
  7. 007EDEEC   push ecx
  8. 007EDEED   push ebx
  9. 007EDEEE   push edx
  10. 007EDEEF   push edi
  11. 007EDEF0   and edx,ebp
  12. 007EDEF2   sal edx,cl
  13. 007EDEF4   push eax
  14. 007EDEF5   push esi
  15. 007EDEF6   rol si,0A8
  16. 007EDEFA   mov edx,0
  17. 007EDEFF   or edi,200E1338
  18. 007EDF05   xchg eax,esi
  19. 007EDF06   push edx
  20. 007EDF07   cmp dx,ax
  21. 007EDF0A   xor ecx,edi
  22. 007EDF0C   cbw
  23. 007EDF0E   mov esi,dword ptr ss:[esp+28]
  24. 007EDF12   cmp edi,2665657B
  25. 007EDF18   xor bx,466
  26. 007EDF1D   rcl ecx,33
  27. 007EDF20   sub esi,68CC28DC
  28. 007EDF26   rol di,0DA
  29. 007EDF2A   bswap esi
  30. 007EDF2C   btc eax,9E
  31. 007EDF30   ror esi,1
  32. 007EDF32   xor esi,6B3E5C22
  33. 007EDF38   add esi,edx
  34. 007EDF3A   sal cx,cl
  35. 007EDF3D   mov ebp,esp
  36. 007EDF3F   cmp esi,3F1237C1
  37. 007EDF45   sub esp,0C0
  38. 007EDF4B   movsx eax,di
  39. 007EDF4E   sar di,2B
  40. 007EDF52   ror bx,9A
  41. 007EDF56   mov ebx,esi
  42. 007EDF58   add ah,dl
  43. 007EDF5A   mov ecx,0
  44. 007EDF5F   sub ebx,ecx
  45. 007EDF61   lea edi,dword ptr ds:[7EDF61]
  46. 007EDF67   cmova eax,ebp
  47. 007EDF6A   btc eax,0E3
  48. 007EDF6E   sub esi,4
  49. 007EDF74   rcl eax,cl
  50. 007EDF76   shld ax,si,5D
  51. 007EDF7B   shr ah,cl
  52. 007EDF7D   mov eax,dword ptr ds:[esi]
  53. 007B5029   xor eax,ebx
  54. 00CCF9CC   inc eax
  55. 00CCF9CD   cmp bp,cx
  56. 00CCF9D0   neg eax
  57. 007EB5C2   dec eax
  58. 007EB5C3   test al,ah
  59. 007EB5C5   cmp esi,695251BF
  60. 007EB5CB   bswap eax
  61. 007EB5CD   test ecx,esi
  62. 007EB5CF   clc
  63. 007EB5D0   not eax
  64. 007EB5D2   cmp sp,dx
  65. 007EB5D5   xor ebx,eax
  66. 007EB5D7   cmp di,32B8
  67. 007EB5DC   cmp esi,esi
  68. 007EB5DE   add edi,eax
  69. 00C5D7DE   push edi
  70. 00C5D7DF   ret


После удаления мусора(если контекст сбрасывается, то предыдущая цепочка cfg мусорная, те clc/cmp -> clc мусор, так как EF.CF функция утеряна).

Code:
  1. 007EDEE3   push ebp
  2. 007EDEEB   pushfd
  3. 007EDEEC   push ecx
  4. 007EDEED   push ebx
  5. 007EDEEE   push edx
  6. 007EDEEF   push edi
  7. 007EDEF4   push eax
  8. 007EDEF5   push esi
  9. 007EDEFA   mov edx,0                         ; EDX = 0
  10. 007EDF06   push edx
  11.  
  12. 007EDF0E   mov esi,dword ptr ss:[esp+28]     ; ESI = [ARG]
  13. 007EDF20   sub esi,68CC28DC                              ; ESI - X
  14. 007EDF2A   bswap esi                         ; bswap ESI
  15. 007EDF30   ror esi,1                         ; ESI >>
  16. 007EDF32   xor esi,6B3E5C22                              ; ESI xor X
  17. 007EDF38   add esi,edx               ; ESI + EDX
  18.  
  19. 007EDF3D   mov ebp,esp
  20. 007EDF45   sub esp,0C0
  21. 007EDF56   mov ebx,esi               ; EBX = ESI
  22. 007EDF5A   mov ecx,0                         ; ECX = X
  23. 007EDF5F   sub ebx,ecx               ; EBX - ECX(0)
  24. 007EDF61   lea edi,dword ptr ds:[7EDF61]     ; EDI = [N]
  25. 007EDF6E   sub esi,4                         ; ESI - 4
  26.  
  27. 007EDF7D   mov eax,dword ptr ds:[esi]               ; EAX = [ESI]
  28. 007B5029   xor eax,ebx               ; EAX xor EBX
  29. 00CCF9CC   inc eax                                       ; EAX + 1
  30. 00CCF9D0   neg eax                                       ; -EAX
  31. 007EB5C2   dec eax                                       ; EAX - 1
  32. 007EB5CB   bswap eax                         ; swap EAX
  33. 007EB5D0   not eax                                       ; ~EAX
  34. 007EB5D5   xor ebx,eax               ; EBX xor EAX
  35.  
  36. 007EB5DE   add edi,eax               ; EDI + EAX
  37. 00C5D7DE   push edi                                 ; -> EDI
  38. 00C5D7DF   ret


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

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

Vamit сделал это через хардкод всех таких конструкций.

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

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

-----
vx





Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 02 мая 2019 17:43
· Личное сообщение · #2

Оба блока, где участвует bswap - расшифровка значения, оно скорей всего было помещено в память с обратными действиями этим же самым ксорам/сдвигам/инверсиям/свопам в обратном порядке. И как-то простенько сделано, без огонька.
SUB(68CC28DC),SWAP,ROR(1),XOR(6B3E5C22) -> XOR(6B3E5C22),ROL(1),SWAP,ADD(68CC28DC)
Если сможешь выделять прямую и обратную последовательность в обеих ветках, где значение было помещено, и где используется, можешь безопасно их исключать. Если нет, то нету гарантии, что крайнее действие или несколько - не часть алгоритма.

-----
2 оттенка серого





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

Создано: 02 мая 2019 17:49
· Личное сообщение · #3

Тут надо не сворачивать, а включать голову и производить вычисления:
Code:
  1. // сохранение контекста программв в стеке вм
  2. 007EDEE3   push ebp
  3. 007EDEEB   pushfd
  4. 007EDEEC   push ecx
  5. 007EDEED   push ebx
  6. 007EDEEE   push edx
  7. 007EDEEF   push edi
  8. 007EDEF4   push eax
  9. 007EDEF5   push esi
  10. // code offset (смещение относительно адреса загрузки проги, нерелоцируемый образ дает 0, при релокации тут будет константа)
  11. 007EDEFA   mov edx,0                         ; EDX = 0
  12. 007EDF06   push edx
  13. // получем кодированный адрес ленты пикода
  14. 007EDF0E   mov esi,dword ptr ss:[esp+28]     ; ESI = [ARG]
  15. // декодируем его
  16. 007EDF20   sub esi,68CC28DC                              ; ESI - X
  17. 007EDF2A   bswap esi                         ; bswap ESI
  18. 007EDF30   ror esi,1                         ; ESI >>
  19. 007EDF32   xor esi,6B3E5C22                              ; ESI xor X
  20. // с учетом релокации кода
  21. 007EDF38   add esi,edx               ; ESI + EDX
  22. // резервируем стек вм (через ebp будет производится доступ с стеку вм)
  23. 007EDF3D   mov ebp,esp
  24. 007EDF45   sub esp,0C0
  25. // инициализация регистра хеша вм для расшифровки команд
  26. 007EDF56   mov ebx,esi               ; EBX = ESI
  27. // какое-то смещение хеша (не встречал ситуаций когда оно != 0)
  28. 007EDF5A   mov ecx,0                         ; ECX = X
  29. 007EDF5F   sub ebx,ecx               ; EBX - ECX(0)
  30. // offprm смещение кода тел примитивов для конкретной реализации вм
  31. 007EDF61   lea edi,dword ptr ds:[7EDF61]     ; EDI = [N]
  32. // тут направление ленты пикода обратное
  33. 007EDF6E   sub esi,4                         ; ESI - 4
  34. // читаем из ленты пикода кодированный адрес примитива вм 
  35. 007EDF7D   mov eax,dword ptr ds:[esi]               ; EAX = [ESI]
  36. // декодируем адрес
  37. 007B5029   xor eax,ebx               ; EAX xor EBX
  38. 00CCF9CC   inc eax                                       ; EAX + 1
  39. 00CCF9D0   neg eax                                       ; -EAX
  40. 007EB5C2   dec eax                                       ; EAX - 1
  41. 007EB5CB   bswap eax                         ; swap EAX
  42. 007EB5D0   not eax                                       ; ~EAX
  43. 007EB5D5   xor ebx,eax               ; EBX xor EAX
  44. 007EB5DE   add edi,eax               ; EDI + EAX
  45. // передаем управление на примитив
  46. 00C5D7DE   push edi                                 ; -> EDI
  47. 00C5D7DF   ret


-----
Everything is relative...


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


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

Создано: 02 мая 2019 17:49
· Личное сообщение · #4

f13nd

Что это значит ?

Я привёл частный пример что бы спросить про общее решение. Как такое сворачивать.

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

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

Вы пропустили в коментах целевой блок. А вопрос в том, как это упростить.

-----
vx





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

Создано: 02 мая 2019 17:58
· Личное сообщение · #5

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

-----
Everything is relative...





Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 02 мая 2019 18:04
· Личное сообщение · #6

difexacaw пишет:
Что это значит ?

После чистки мусора остаются инструкции, не входящие в тупиковые ветви, а эта обязательная часть остается. Если абстрагируешься от того, как это устроено, но очень хочется ислючить лишние действия, тебе надо каждое мгновенное значение считать отдельной единицей. Преобразовать например в свой промежуточный код, где можно будет выделить последовательность:
a1=SUB(a0,68CC28DC)
a2=SWAP(a1)
a3=ROR(a2,1)
a4=XOR(a3,6B3E5C22)
a5=XOR(a4,6B3E5C22)
a6=ROL(a5,1)
a7=SWAP(a6)
a8=ADD(a7,68CC28DC)
В которой простым способом исключается a4-a5 (c их заменой во всех связанных операторах), потом a3-a6 и т.д. Если пофантазировать, можно не использовать эту мешанину впоследтсвии для выделения в ней алгоритмических конструкций, а применять только для чистки. Но лучше вон делай как все.

-----
2 оттенка серого





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

Создано: 02 мая 2019 18:13
· Личное сообщение · #7

Vamit

Функция, остальное не имеет значения:

Code:
  1. xor eax,ebx       ; EAX xor EBX
  2. inc eax   ; EAX + 1
  3. neg eax   ; -EAX
  4. dec eax   ; EAX - 1
  5. bswap eax         ; swap EAX
  6. not eax   ; ~EAX
  7. xor ebx,eax       ; EBX xor EAX


f13nd

> Преобразовать например в свой промежуточный код

Мне чутьё подсказывает что упрощения при этом не будет, новая формула и что с ней делать ?

-----
vx





Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 02 мая 2019 18:20
· Личное сообщение · #8

difexacaw пишет:
Мне чутьё подсказывает что упрощения при этом не будет, новая формула и что с ней делать ?

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

-----
2 оттенка серого





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

Создано: 02 мая 2019 18:22 · Поправил: difexacaw
· Личное сообщение · #9

f13nd

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

-----
vx





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

Создано: 02 мая 2019 18:24 · Поправил: Vamit
· Личное сообщение · #10

Функция, остальное не имеет значения
Всё что я написал значение имеет, иначе вы никуда не уйдете. А приведенный кусочек это расшифровка адреса кода примитива, алгоритм тут у каждого примитива для вмп3.2 уникальный, решение одно - эмулировать исполнение кода и вычислять реальные значения.
Это ещё цветочки, а ягодки будут дальше))

-----
Everything is relative...





Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 02 мая 2019 18:27
· Личное сообщение · #11

difexacaw пишет:
каким образом это её упростит

В ss:[esp+28] будет помещено то значение esi, которое складывается с edx, а в приведенном семпле не будет ксоров/сдвигов/свопов/вычитаний, которые явно к алгоритму отношения не имеют.

-----
2 оттенка серого





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

Создано: 02 мая 2019 18:27
· Личное сообщение · #12

Vamit

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

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

Я уже устал повторять что это частный пример что бы найти общее решение, не нужен мне никакой [esp+8].!

-----
vx





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

Создано: 02 мая 2019 18:30 · Поправил: Vamit
· Личное сообщение · #13

f13nd
Абсолютно неверное суждение, пока вы не расшифруете адрес (как угодно) далее пути нет.

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

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

-----
Everything is relative...





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

Создано: 02 мая 2019 18:33
· Личное сообщение · #14

Vamit

Тоесть по вашему функцию в #7 невозможно принципиально как то упростить ?

-----
vx





Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 02 мая 2019 18:37
· Личное сообщение · #15

Vamit пишет:
Абсолютно неверное суждение, пока вы не расшифруете адрес (как угодно) далее пути нет.

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

-----
2 оттенка серого





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

Создано: 02 мая 2019 18:38
· Личное сообщение · #16

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

-----
Everything is relative...





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

Создано: 02 мая 2019 18:39
· Личное сообщение · #17

Эта вот последовательность:

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

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

> он как в криптографии

Не согласен, это лишь морф, при усложнении функция остаётся тойже. А значит возможна её свёртка.

-----
vx





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

Создано: 02 мая 2019 18:44
· Личное сообщение · #18

Не согласен, это лишь морф, при усложнении функция остаётся тойже. А значит возможна её свёртка.

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

-----
Everything is relative...





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

Создано: 02 мая 2019 18:50 · Поправил: difexacaw
· Личное сообщение · #19

Vamit

Может у вас конкретная инфа есть, матчасть по этой теме. Где всё это доказано, просто я наслово никому не верю

Публикации что почитать..
И что на счёт солверов ?

-----
vx





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

Создано: 02 мая 2019 19:03 · Поправил: Vamit
· Личное сообщение · #20

difexacaw
Была бы матчасть, то вмпрот бы уже не жил, а давно бы подох. А по солверам могу сказать следующее, да сам алгоритм кодирования они могут привести к псевдокоду, чтобы исключить зависимость от регистров цпу (её в любом случае надо исключать, т.к. у каждой реализации вмп свой набор регистров), но вычислить конкретные значения адресов они не смогут, тут только 2 варианта или трассировать/исполнять код кусочками или эмулировать его поведение.
Мой первый декомпилятор, который есть в открытом доступе работал по 1му варианту, а последний работает по второму. У первого варианта куча недостатков...

-----
Everything is relative...




Ранг: -12.6 (нарушитель), 11thx
Активность: 0.050.03
Статус: Участник

Создано: 02 мая 2019 19:12
· Личное сообщение · #21

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

--> Атака на чёрный ящик. Реверс-инжиниринг виртуализированного и мутированного кода <--

--> Программная симуляция микропроцессора. Коробка передач <--




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

Создано: 02 мая 2019 19:36 · Поправил: difexacaw
· Личное сообщение · #22

Vamit

Если из того блока взять первые две инструкции ксор и +1, думаю можно на этом остановиться, сделав в этой теме сутью. Как быть с таким выражением ?

Я знаю что ntldr вроде в такой теме шарит.

Нужна матчасть по работе с такими выражениями. Иначе это полнейший тупик.

-----
vx





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

Создано: 02 мая 2019 19:58 · Поправил: Vamit
· Личное сообщение · #23

Нет тут матчасти, могу по шагам расписать кодировку адресов и параметров пикода:
Code:
  1. // исходные данные: eax - value, ebx - hash (для другой реализации вм value может быть в любом регистре, хеш всегда в ebx, к нему будет byte/word/dword доступ с изменением как его частей, так и полностью)
  2. // 1. value ^= hash; начало раскодировки и зависимость от предыдущей раскодировки
  3. 007B5029   xor eax,ebx               ; EAX xor EBX
  4. // 2. элементарные математические/логические изменения для value, до 10ти инструкций
  5. 00CCF9CC   inc eax                                       ; EAX + 1
  6. 00CCF9D0   neg eax                                       ; -EAX
  7. 007EB5C2   dec eax                                       ; EAX - 1
  8. 007EB5CB   bswap eax                         ; swap EAX
  9. 007EB5D0   not eax                                       ; ~EAX
  10. // 3. hash ^= value; модификация хеша для последующих декодировок
  11. 007EB5D5   xor ebx,eax               ; EBX xor EAX
  12. // итог: value - раскодировано, hash - модифицирован последним value

шаги 1 и 3 одинаковы для всех кодировок, шаг 2 уникален для каждой кодировки

-----
Everything is relative...





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

Создано: 02 мая 2019 20:22
· Личное сообщение · #24

Vamit

Спасибо конечно большое. Но у меня задача совсем иная. Я говорил, функцию нужно упростить. Если это аналог, какие то штатные мат операции то не проблема. Но в таких выражениях and/xor/or/etc. Но это не означает что решения нет, просто пока кто знает не ответил.

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

Но это вовсе не означает что решение не возможно или нет соответствующей теории/матчасти.

-----
vx





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

Создано: 02 мая 2019 21:04
· Личное сообщение · #25

difexacaw
Всё уже по шагам расписал, вот формула:
value ^= hash;
variable template decode value; (уникальный алгоритм)
hash ^= value;

что ещё нужно - бери и решай...

-----
Everything is relative...


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


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

Создано: 02 мая 2019 21:10 · Поправил: difexacaw
· Личное сообщение · #26

Vamit

Вы говорили что полагаете что общее решение невозможно. Зачем это много раз повторять.

Общее решение будет возможно если найти решение этой задачи.

И это только начало поиска. Не работал я ранее с гибридными уравнениями.

Добавлено спустя 16 часов 43 минуты
Я заметил что эти две функции применяются к константам. Тоесть получается что до этого константа должна быть обработана обратной функцией. Тогда такая функция должна присутствовать в апп. Если её нет, то функция применялась на этапе сборки апп.

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

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

-----
vx





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

Создано: 03 мая 2019 16:27
· Личное сообщение · #27

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

-----
Everything is relative...





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

Создано: 03 мая 2019 17:08
· Личное сообщение · #28

difexacaw пишет:
Публикации что почитать..


https://en.wikipedia.org/wiki/NAND_logic

Estimating the Circuit Deobfuscating Runtime based on Graph
https://arxiv.org/pdf/1902.05357

Instructions Substitution
https://github.com/obfuscator-llvm/obfuscator/wiki/Instructions-Substitution
Code:
  1. Addition
  2. = b - (-c)
  3. %0 = load i32* %a, align 4
  4. %1 = load i32* %b, align 4
  5. %2 = sub i32 0, %1
  6. %3 = sub nsw i32 %0, %2
  7. = -(-+ (-c))
  8. %0 = load i32* %a, align 4
  9. %1 = load i32* %b, align 4
  10. %2 = sub i32 0, %0
  11. %3 = sub i32 0, %1
  12. %4 = add i32 %2, %3
  13. %5 = sub nsw i32 0, %4
  14. = rand (); a = b + r; a = a + c; a = a - r
  15. %0 = load i32* %a, align 4
  16. %1 = load i32* %b, align 4
  17. %2 = add i32 %0, 1107414009
  18. %3 = add i32 %2, %1
  19. %4 = sub nsw i32 %3, 1107414009
  20. = rand (); a = b - r; a = a + b; a = a + r
  21. %0 = load i32* %a, align 4
  22. %1 = load i32* %b, align 4
  23. %2 = sub i32 %0, 1108523271
  24. %3 = add i32 %2, %1
  25. %4 = add nsw i32 %3, 1108523271
  26. Subtraction
  27. = b + (-c)
  28. %0 = load i32* %a, align 4
  29. %1 = load i32* %b, align 4
  30. %2 = sub i32 0, %1
  31. %3 = add nsw i32 %0, %2
  32. = rand (); a = b + r; a = a - c; a = a - r
  33. %0 = load i32* %a, align 4
  34. %1 = load i32* %b, align 4
  35. %2 = add i32 %0, 1571022666
  36. %3 = sub i32 %2, %1
  37. %4 = sub nsw i32 %3, 1571022666
  38. = rand (); a = b - r; a = a - c; a = a + r
  39. %0 = load i32* %a, align 4
  40. %1 = load i32* %b, align 4
  41. %2 = sub i32 %0, 1057193181
  42. %3 = sub i32 %2, %1
  43. %4 = add nsw i32 %3, 1057193181
  44. AND
  45. = b & c => a = (b ^ ~c) & b
  46. %0 = load i32* %a, align 4
  47. %1 = load i32* %b, align 4
  48. %2 = xor i32 %1, -1
  49. %3 = xor i32 %0, %2
  50. %4 = and i32 %3, %0
  51. OR
  52. = b | c => a = (& c) | (b ^ c)
  53. %0 = load i32* %a, align 4
  54. %1 = load i32* %b, align 4
  55. %2 = and i32 %0, %1
  56. %3 = xor i32 %0, %1
  57. %4 = or i32 %2, %3
  58. XOR
  59. = a ^ b => a = (~a & b) | (& ~b)
  60. %0 = load i32* %a, align 4
  61. %1 = load i32* %b, align 4
  62. %2 = xor i32 %0, -1
  63. %3 = and i32 %1, %2
  64. %4 = xor i32 %1, -1
  65. %5 = and i32 %0, %4
  66. %6 = or i32 %3, %5


Vamit пишет:
value ^= hash;
variable template decode value; (уникальный алгоритм)
hash ^= value;

Обыкновенный ВМ-ый полиморф

difexacaw пишет:
Vamit

Тоесть по вашему функцию в #7 невозможно принципиально как то упростить ?

Можно, 200% можно ...

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


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


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

Создано: 03 мая 2019 17:34
· Личное сообщение · #29

Vamit

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

-----
vx





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

Создано: 03 мая 2019 17:39
· Личное сообщение · #30

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

Добавлено спустя 4 минуты
Я так понимаю если вы не смогли разобраться в простейшем примере, то о большем нет смысла спрашивать.
Да пошел ты в жопу, у меня всё решено и работает в автомате, а тебе более помогать не собираюсь...
Первоначально тебе нужно заняться самовоспитанием, а не программированием.

-----
Everything is relative...


| Сообщение посчитали полезным: sefkrd, DimitarSerg, Gideon Vi, BlackCode, bartolomeo, soft, DenCoder
. 1 . 2 . 3 . >>
 eXeL@B —› Программирование —› Свёртка.
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати