Сейчас на форуме: rmn, exp50848, _MBK_ (+9 невидимых)

 eXeL@B —› Основной форум —› [IDA] как найти все базовые блоки?
Посл.ответ Сообщение

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

Создано: 16 декабря 2010 12:31 · Поправил: GoldFinch
· Личное сообщение · #1

Надо наиболее надежным способом найти все базовые блоки (basic blocks).
(Базовый блок соответствует одному прямоугольнику графа функции)

Подойдут решения использующие IDC или IDAPython или плагин к IDA.
Версия IDA - 5.5

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

Я набросал IDC скрипт, который считает началом базового блока начало функции или инструкцию на которую есть ссылки, но не уверен что лучшее решение.
Code:
  1. // dump_bb.idc
  2. //
  3. // Generates file with basic blocks starts
  4. //
  5.  
  6. #include "idc.idc"
  7.  
  8. static  main()
  9. {
  10.     auto base; // module base
  11.     auto sectionStart, sectionEnd; // analyzed area boundaries
  12.     auto ea; // current address
  13.     auto fn; // current function
  14.     auto hOut; // output file
  15.     auto percentDone;
  16.  
  17.     hOut = fopen(GetIdbPath() + ".bb", "w");
  18.     fprintf(hOut, "%s\n", GetInputFilePath());
  19.  
  20.     base = FirstSeg() - 0x1000; // TODO: find more reliable way to get module base
  21.     fprintf(hOut, "%x\n", base);
  22.  
  23.     sectionStart = SegStart(AskAddr(ScreenEA(), "Any address inside the segment to scan:"));
  24.     sectionEnd = SegEnd(sectionStart);
  25.  
  26.     Message("Searching basic blocks...");
  27.     
  28.     for(ea = sectionStart; ea != BADADDR; ea = NextHead(ea, sectionEnd))
  29.     {
  30.         if(!isCode(GetFlags(ea)))
  31.             continue;
  32.  
  33.         // ensure that ea is inside a function
  34.         fn = GetFunctionAttr(ea, FUNCATTR_START);
  35.         if(fn == BADADDR)
  36.             continue;
  37.  
  38.         // it should be function start
  39.         // or there is code xref to this address (assume that data xref can't point inside function)
  40.         if(ea == fn || RfirstB0(ea) != BADADDR)
  41.             fprintf(hOut, "%x\n", ea - base); // write RVA to file
  42.     }
  43.  
  44.     fclose(hOut);
  45.     Message("All Done.\n\n");
  46. }


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

Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 16 декабря 2010 12:54
· Личное сообщение · #2

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

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


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 декабря 2010 14:06
· Личное сообщение · #3

не знаю правильно ли я понял что тебе надо gdl_graph_t
вот некоторые линки
code.google.com/p/idapython/source/browse/trunk/swig/gdl.i?r=229&spec=svn317
www.hex-rays.com/manual/sdk/hexrays__sample5_8cpp-example.html



Ранг: 5.4 (гость), 4thx
Активность: 0=0
Статус: Участник

Создано: 16 декабря 2010 14:58 · Поправил: ciam
· Личное сообщение · #4

лучший вариант - это самому строить CFG граф, т.к. потом будете иметь возможность его упрощать (что важно при анализе современных протекторов/малваре). у меня довольно неплохо работал такой алгоритм:
- базовые блоки добавляются при нахождении ветвления (ну естественно )
- если ветвление идёт в уже существующий блок, то этот блок делится на 2 блока
- чуть сложнее с определением switch tables. нужно анализировать код
- иногда без деобфускации кода, правильный граф просто нельзя построить
- последний этап - можно убрать незначимые узлы



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 17 декабря 2010 02:40
· Личное сообщение · #5

diablo.elis.ugent.be/CFGreconstruction вот эта штука тоже строит базовые блоки

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 декабря 2010 18:48 · Поправил: Clerk
· Личное сообщение · #6
 eXeL@B —› Основной форум —› [IDA] как найти все базовые блоки?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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