Сейчас на форуме: vsv1, Rio, site-pro, -Sanchez- (+6 невидимых)

 eXeL@B —› Софт, инструменты —› Ассемблер OllyDbg 1.10
Посл.ответ Сообщение


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

Создано: 26 августа 2011 17:52
· Личное сообщение · #1

Задача такова - получить из асм инструкций код оптимизированный по размеру.
А теперь результаты работы Олькиного ассемблера:
Code:
  1. 004799F1: mov ebx, 0x000000A7
  2. C7 C3 A7 00 00 00 или BB A7 00 00 00

Здесь оптимизация имеется, а можно ли ещё короче?
Code:
  1. 1. 00479AA1: mov dword ptr [esp + 0x0000007C], edx
  2. 89 94 24 7C 00 00 00 или 89 54 24 7C
  3. 2. 00479AB0: mov dword ptr [esp + 0x00000084], edx
  4. 89 94 24 84 00 00 00

В 1 варианте оптимизация есть, а во 2 нет, это Олька глючит или так и должно быть?
Code:
  1. 1. 00479A99: mov dword ptr [esp + 0x00000078], 0xB827C2C1
  2. C7 84 24 78 00 00 00 C1 C2 27 B8 или C7 44 24 78 C1 C2 27 B8
  3. 2. 00479AA5: mov dword ptr [esp + 0x00000080], 0xC16C77D5
  4. C7 84 24 80 00 00 00 D5 77 6C C1
  5. 3. 00479AC9: mov dword ptr ds:[esp + 0x00000090], 0xAF79E31E
  6. 3E C7 84 24 90 00 00 00 1E E3 79 AF

1 с оптимизацией, 2 без, а в 3 ещё доп. байт появился, откуда?
Code:
  1. 00479B1E: mov dword ptr [esp + 0x000000B4], 0x0000000F
  2. C7 84 24 B4 00 00 00 0F 00 00 00

Оптимизации нет никакой, возможна ли?
Примеры можно продолжать и далее, но 12 байт на одну инструкцию просто убивают... В итоге декомпилированный код просто не помещается в отведенное ему в функции место.

-----
Everything is relative...





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

Создано: 26 августа 2011 18:49
· Личное сообщение · #2

Числа больше 0x80 четырёхбайтные, потому что смещение знаковое. Если задать смещение одним байтом 0x80, то это будет рассматриваться как -0x80

Code:
  1. mov dword ptr ds:[esp + 0x00000090], 0xAF79E31E
префикс ds: вставился... хз, может у Вас и глюк, но у меня без префикса норм ассембл.

В последнем случае - единственный вариант для одной инструкции. Но если куча таких mov'ов со смещениями больше 0x80, то можно оптимизировать только всё вместе типа так:
Code:
  1. 010073A8      8D5424 7C                     LEA EDX,[ESP+7C]
  2. 010073AC      C742 FC C1C227B8              MOV DWORD PTR [EDX-4],B827C2C1
  3. 010073B3      C742 04 D5776CC1              MOV DWORD PTR [EDX+4],C16C77D5
  4. 010073BA      C742 14 1EE379AF              MOV DWORD PTR [EDX+14],AF79E31E
  5. 010073C1      C742 38 0F000000              MOV DWORD PTR [EDX+38],0F


-----
IZ.RU





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

Создано: 26 августа 2011 19:14 · Поправил: Vamit
· Личное сообщение · #3

префикс ds: вставился
За префикс спасибо, не обратил внимание, надо будет потереть префиксы по умолчанию ...ptr ds:[esp + ...
Так LEA EDX,[ESP+7C], конечно можно, только в исходном коде этого точно не было и он помещался в отведенное место в функе + ещё должно остаться свободное место от маркеров вм, а у меня в некоторых функциях не хватает по 10-20 байт места.

-----
Everything is relative...





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 26 августа 2011 19:18
· Личное сообщение · #4

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

-----
Yann Tiersen best and do not fuck





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

Создано: 26 августа 2011 20:13 · Поправил: Vamit
· Личное сообщение · #5

Я и так получаю все варианты и из них выбираю оптимальный по размеру
Code:
  1. // Ассемблировать код
  2. int vTracerVm::CreateAsmCode(char* cmd)
  3. {
  4.          char buf[256];
  5.          t_asmmodel asmm;
  6.          int optAttempt = 0;
  7.          int optSize = 0;
  8.          BOOL bError = FALSE;
  9.          int length = 999;
  10.          for(int i = 0; i < 10; i++)
  11.          {
  12.                  int k;
  13.                  for(= 0; k <= 3; k++)
  14.                  {
  15.                         bError = FALSE;
  16.                         if(Assemble(cmd, m_nIpCodeCur, &asmm, i, k, buf) < 0)
  17.                               bError = TRUE;
  18.                         if(!bError && (asmm.length < length))
  19.                         {
  20.                               length = asmm.length;
  21.                               optAttempt = i;
  22.                               optSize = k;
  23.                         }
  24.                         if(!&& bError)
  25.                               break;
  26.                  }
  27.                  if(!&& bError)
  28.                         break;
  29.          }
  30.          if(Assemble(cmd, m_nIpCodeCur, &asmm, optAttempt, optSize, buf) < 0)
  31.          {
  32.                  Error("%s in %s", buf, cmd);
  33.                  return -1;
  34.          }
  35.          memcpy(m_pCodeBufCur, asmm.code, asmm.length);
  36.          m_nIpCodeCur += asmm.length;
  37.          m_pCodeBufCur += asmm.length;
  38.          return 0;
  39. }

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

-----
Everything is relative...




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

Создано: 18 сентября 2011 00:20
· Личное сообщение · #6

Чтобы не создавать новую тему... наткнулся на FullDisasm, альтернативный движок для оли

This is a plugin for OllyDbg 1.10 and Immunity Debugger 1.xx to replace the old disasm engine by a more recent one: BeaEngine 4.0. You just have to press Ctrl+W to change the disasm engine. If you want to use BeaEngine only on selected lines, then just press Ctrl+X. With this plugin, you can decode recent instructions for the following technologies : MMX, FPU, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 , VMX, CLMUL and AES. You can even decode undocumented instructions usually used in malicious codes. If you want to use a specific syntax, BeaEngine allows you to disassemble code in masm32 syntax, nasm syntax, GoAsm syntax or GNU Assembler syntax.

http://www.beaengine.org/downloads/FullDisasm_OllyDbg.zip




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 18 сентября 2011 01:04 · Поправил: ajax
· Личное сообщение · #7

Vamit
походу, играцца самому, кодооптимизаторов по байтам не встречалось, типа mov ebx, 0x000000A7 = xor ebx,ebx; mov bl,0A7h. иной раз eax/rax заюзать, длины с ним меньше, при условии, что не критичен. если касаемо вмпрота, то могу подсобить (стопудово, не скрипт будет), но от шаблонов не уйти

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




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

Создано: 18 сентября 2011 11:40
· Личное сообщение · #8

Dart Raiden пишет:
наткнулся на FullDisasm, альтернативный движок для оли

попробуем.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 18 сентября 2011 11:40
· Личное сообщение · #9

ajax Vamit иеет ввиду именно оптимизацию кодирования. Т.е.:
Code:
  1. MOV EAX,DWORD PTR DS:[401000]

можно закодировать так:
Code:
  1. A1 00104000     MOV EAX,DWORD PTR DS:[401000]
  2. 8B05 00104000   MOV EAX,DWORD PTR DS:[401000]


-----
Yann Tiersen best and do not fuck





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 18 сентября 2011 11:55 · Поправил: ajax
· Личное сообщение · #10

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


-----
От многой мудрости много скорби, и умножающий знание умножает печаль




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

Создано: 18 сентября 2011 14:41 · Поправил: bowrouco
· Личное сообщение · #11

Vamit
Есть дефолтные сегменты. Тоесть MOV EAX,DWORD PTR DS:[401000] по дефолту использует Ds, посему не нужно переопределять сегмент. Двигатель есть для этого кстате: http://indy-vx.narod.ru/Bin/SDE.zip


 eXeL@B —› Софт, инструменты —› Ассемблер OllyDbg 1.10
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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