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

 eXeL@B —› Программирование —› Оптимизация циклического сдвига (R&L), и циклического сдвига(R&L) через флаг переноса.
Посл.ответ Сообщение


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

Создано: 30 августа 2018 23:55
· Личное сообщение · #1

На выходе из алго деобффускации остаётся такой код:
Code:
  1.          mov r12, qword ptr ds:[rdx+0x138]
  2.          mov rax, qword ptr ds:[r12]
  3.          lea r12, ds:[r12+0x8]
  4.          mov qword ptr ds:[rdx+0x138], r12
  5.          push rax
  6.          rcr rax, 0x1 < аналог bt rax, 0 //CF
  7.          pop rax
  8.          mov byte ptr ds:[rdx+0x148], 0x0
  9.          jae short @L00000001
  10.          mov byte ptr ds:[rdx+0x148], 0x1
  11.  
  12. @L00000001:
  13.          push rax
  14.          rol rax, 0x3E < аналог bt rax, 2 //PF
  15.          pop rax
  16.          mov byte ptr ds:[rdx+0x48], 0x0
  17.          jae short @L00000002
  18.          mov byte ptr ds:[rdx+0x48], 0x1
  19.  
  20. @L00000002:
  21.          push rax
  22.          rcr rax, 0x5 < аналог bt rax, 4 //AF
  23.          pop rax
  24.          mov byte ptr ds:[rdx+0x28], 0x0
  25.          jae short @L00000003
  26.          mov byte ptr ds:[rdx+0x28], 0x1
  27.  
  28. @L00000003:
  29.          push rax
  30.          rol rax, 0x3A < аналог bt rax, 6 //ZF
  31.          pop rax
  32.          mov byte ptr ds:[rdx+0x1B0], 0x0
  33.          jae short @L00000004
  34.          mov byte ptr ds:[rdx+0x1B0], 0x1
  35.  
  36. @L00000004:
  37.          push rax
  38.          ror rax, 0x8 < аналог bt rax, 7 //SF
  39.          pop rax
  40.          mov byte ptr ds:[rdx+0x208], 0x0
  41.          jae short @L00000005
  42.          mov byte ptr ds:[rdx+0x208], 0x1
  43.  
  44. @L00000005:
  45.          push rax
  46.          rcl rax, 0x36 < аналог bt rax, 0xA //DF
  47.          pop rax
  48.          mov byte ptr ds:[rdx+0x178], 0x0
  49.          jae short @L00000006
  50.          mov byte ptr ds:[rdx+0x178], 0x1
  51.  
  52. @L00000006:
  53.          push rax
  54.          rol rax, 0x35 < аналог bt rax, 0xB //OF
  55.          pop rax
  56.          mov byte ptr ds:[rdx+0x170], 0x0
  57.          jae short @L00000007
  58.          mov byte ptr ds:[rdx+0x170], 0x1
  59.  
  60. @L00000007:
  61.          push rax
  62.          ror rax, 0xA < аналог bt rax, 9 //IF
  63.          pop rax
  64.          mov byte ptr ds:[rdx+0x1E8], 0x0
  65.          jae short @L00000008
  66.          mov byte ptr ds:[rdx+0x1E8], 0x1
  67. @L00000008:
  68.  

по коду понятно что сейвят состояние каждого регистра флага.
можно это завернуть в табличку по кейсам. но не хотелось бы, всё таки диапазон констант от 1 до 3f, + в обе стороны, а это чего то дофига..
циклический сдвиг есть также в связке с проверкой CF, а так же в место него бывает сдвиг двойной точности.
Code:
  1. PUSH R9
  2. ROR R9, 0x10
  3. POP R9
  4. CMOVB R13W, WORD PTR DS:[RDX + 0x8]
  5. --------
  6. PUSH RAX
  7. SHLD RAX, RAX, 0x31
  8. POP RAX
  9. CMOVB SI, WORD PTR DS:[RDX + 0x8]

не могу уловить зависимость константы для каждого регистра флага. ХЕЛП !!!

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





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

Создано: 31 августа 2018 02:04 · Поправил: f13nd
· Личное сообщение · #2

Не понял даже что сделать надо. rcr/rcl сдвигает через CF, последний перенесенный бит в нем остается. ror/rol то же самое, но CF просто дублирует последний перенесенный бит. Соответственно ror rax,3/rcr rax,3/rol rax,62/rcl rax,62 помещает в CF второй бит, PF то есть. Бит 2 это сдвиг вправо на 2+1 или влево на 64-2, эту ты закономерность ищешь? Оптимизацией было бы тупо крутить на 1-2 бита вправо ror'ом и заполнять все поля подряд.

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


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


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

Создано: 31 августа 2018 04:44 · Поправил: Bronco
· Личное сообщение · #3

f13nd пишет:
Не понял даже что сделать надо

да тупо свернуть это гавнище к обычной проверке бита (bt). операнд известен, осталось только разобраться какой бит сдвигом проверяют. 1, 3, 5, 22 - 63 пока в резерве, после флага переполнения что доступно на уровне юм кода? итого 9 регистров, TF пока не проверяют. как комби на сдвиге построить хз, по ходу невозможно.
всё что в остатке, и перекрывается либо записью в рфлагс, либо в регистры, можно смело удалять из листинга.
f13nd пишет:
Соответственно ror rax,3/rcr rax,3/rol rax,62/rcl rax,62

отличная мысль, круг подозреваемых сузился, но как то так точнее будет.:
ror rax, 0xA или rol rax, 0x36 //3f - a +1, от большего к меньшему так же само.
для rcr&rcl аналогично.
для сдвигов 2й точности надо проверить.

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





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

Создано: 31 августа 2018 05:04
· Личное сообщение · #4

Bronco пишет:
да тупо свернуть это гавнище к обычной проверке бита (bt)

А зачем? Результат не должен сильно отличаться ни по размеру, ни по скорострельности.

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





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

Создано: 31 августа 2018 05:17
· Личное сообщение · #5

f13nd пишет:
А зачем?

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

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





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

Создано: 31 августа 2018 05:32 · Поправил: f13nd
· Личное сообщение · #6

Bronco пишет:
шлака много

Я б не сказал, это еще по-божески выглядит. Даже push-pop выглядит как оптимизация, 2 байта вместо 3. Хотя красивше было бы крутить влево-вправо в зависимости от текущего состояния и обойтись без пушпопов. Но в эрмитаж эту картину все равно не возьмут.

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





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

Создано: 31 августа 2018 05:51 · Поправил: Bronco
· Личное сообщение · #7

f13nd пишет:
это еще по-божески выглядит

дык...так это после марафета, а так то пуш_поп редко в одну инструкцию.
f13nd пишет:
2 байта вместо 3

в х32 да, в х64 поболе бу..))
f13nd пишет:
Хотя красивше было бы крутить влево-вправо в зависимости от текущего состояния и обойтись без пушпопов.

крутить не получиться, пушапопом сейвят_проверяют_бит_восстанавливают.
а гавнище в остатке выглядит где так:
Code:
  1. PUSHFQ 
  2. PUSH RBX
  3. PUSH R12
  4. MOV EBX, 0xDE37AE5D
  5. PUSH RBX
  6. MOV R12D, EBX
  7. NEG EBX
  8. ADD EBX, 0x162C5157
  9. SUB EBX, 0xF3000848
  10. ADD R12D, EBX
  11. POP RBX
  12. SHRD R12D, R12D, 0x18
  13. POP R12
  14. POP RBX
  15. POPFQ 

ну это тоже после марафета..

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





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

Создано: 31 августа 2018 15:49 · Поправил: f13nd
· Личное сообщение · #8

Bronco пишет:
сейвят_проверяют_бит_восстанавливают

Сейвят чтоб с текущим состоянием не морочиться, а крутить можно и в любом порядке забирать:
Code:
  1. ror rax,1 ;CF = cf
  2. ror rax,4 ;CF = af
  3. rol rax,3 ;CF = pf

Bronco пишет:
в х32 да, в х64 поболе бу..

Code:
  1. 50  push    rax
  2. 58 pop     rax
  3. 48 89 C1  mov     rcx, rax

2 против 3 в х64

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



 eXeL@B —› Программирование —› Оптимизация циклического сдвига (R&L), и циклического сдвига(R&L) через флаг переноса.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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