Сейчас на форуме: asfa, bartolomeo, _MBK_ (+7 невидимых)

 eXeL@B —› Вопросы новичков —› IDA, привести листинг в порядок
Посл.ответ Сообщение

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

Создано: 09 марта 2012 03:32 · Поправил: Модератор
· Личное сообщение · #1

IDA не корректно показывает ассемблерный код функции.
Code:
  1. ; Attributes: bp-based frame
  2.  
  3. ; int __stdcall sub_40F3D0(char *)
  4. sub_40F3D0 proc far
  5.  
  6. var_76AF33BB= dword ptr -76AF33BBh
  7. var_38AF33BB= byte ptr -38AF33BBh
  8. var_38AF0BBB= byte ptr -38AF0BBBh
  9. var_34= dword ptr -34h
  10. cont_nick_list= dword ptr -2Ch
  11. var_28= dword ptr -28h
  12. var_24= dword ptr -24h
  13. var_20= dword ptr -20h
  14. var_1C= dword ptr -1Ch
  15. var_18= dword ptr -18h
  16. var_14= dword ptr -14h
  17. var_10= dword ptr -10h
  18. var_C= dword ptr -0Ch
  19. var_8= dword ptr -8
  20. i= dword ptr -4
  21. var_0= dword ptr  0
  22. arg_0= dword ptr  0Ch
  23. arg_C= dword ptr  14h


Во первых, есть какие-то переменные с очень большим смещением (var_76AF33BB= dword ptr -76AF33BBh), поиск ссылок на них по клавише X не дает результатов. Из-за этого плагин HexRays не может сгенерировать код, пишет очень большой стек.
Во вторых не видит аргументов функции. Пишет что есть аргуметы dword ptr 0Ch и 14h, но поиск ссылок по ним ничего не показывает. А первый аргумент, к которому явно обращаются (mov ecx, [ebp+8]) не показывает, вот стек аргументов, почему-то на r он отвел 8 байт
Code:
  1. ....
  2. -00000010 var_10          dd ?
  3. -0000000C var_C           dd ?
  4. -00000008 var_8           dd ?
  5. -00000004 i               dd ?
  6. +00000000 var_0           dd ?
  7. +00000004  r              db 8 dup(?)
  8. +0000000C arg_0           dd ?
  9. +00000010                 db ? ; undefined
  10. +00000011                 db ? ; undefined
  11. +00000012                 db ? ; undefined
  12. +00000013                 db ? ; undefined
  13. +00000014 arg_C           dd ?


Соответственно, вопрос, как привести размер стека в соответствующий вид, и как добавить первый аргумент?



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

Создано: 09 марта 2012 11:58 · Поправил: Hexxx
· Личное сообщение · #2

проще пересоздать функцию. 'U', а потом 'P'.
А бороться с вот таким локальными переменными, только если оно продолжает создавать такую же хрень.
Если таки продолжает, то ALT-P на функции. И редактируем размер локальных переменных.

На mov ecx, [ebp+8] нажмите 'K', и аргумент создастся. Но честно говоря не факт что это аргумент, и что у функции 3 аргумента вообще. Есть столько всяких исключений из правил, что я бы не рисковал не разобравшись. А без контекста (т.е. примеров на асме), говорить не о чем.

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




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

Создано: 09 марта 2012 16:35
· Личное сообщение · #3

> На mov ecx, [ebp+8] нажмите 'K', и аргумент создастся.
Не создается, только 8 меняется с красного цвета на обычный зеленый.



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

Создано: 10 марта 2012 07:13
· Личное сообщение · #4

Вот где проблема:

sub_40F3D0 proc far




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

Создано: 13 марта 2012 02:40
· Личное сообщение · #5

Code:
  1. +00000000 var_0           dd ?
  2. +00000004  r              db 8 dup(?)
  3. +0000000C arg_0           dd ?

вот где проблема
и начинать нужно не с показа стека
а с показа начала кода всего кода
там в иде есть глючек когда она не может коректно стек поставить
но рассуждать о нём пока не вижу смысла
кроме показать функцию, вы еще с Alt+K для выравнивания стека пока не пользовались
да кстати а уверены что программа писана на С/C++ ?



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

Создано: 21 марта 2012 16:36
· Личное сообщение · #6

Hexxx пишет:
проще пересоздать функцию. 'U', а потом 'P'. . .
На mov ecx, [ebp+8] нажмите 'K'


Кстати, а как программно, с помощью скриптов, «нажать» эти клавиши? В частности, как программно реализовать команды «Y» и «N»?



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

Создано: 22 марта 2012 18:15 · Поправил: Veliant
· Личное сообщение · #7

Цитирую код, сгенерированный IDR. Первый цикл прогоняет все функции и удаляет их, в том числе имена. Второй цикл делает тоже самое с данными
Code:
  1. static clear(from){
  2. auto ea;
  3. ea = from;
  4. while (1){
  5. ea = NextFunction(ea);
  6. if (ea == -1) break;
  7. DelFunction(ea);
  8. MakeNameEx(ea, "", 0);}
  9.  
  10. ea = from;
  11. while (1){
  12. ea = FindExplored(ea, SEARCH_DOWN | SEARCH_NEXT);
  13. if (ea == -1) break;
  14. MakeUnkn(ea, 1);}
  15. }

И задание имени по адресу
Code:
  1. MakeNameEx(address, "name", 0);

Создание функции
Code:
  1. MakeFunction(address, -1);


А вообще читайте IDA Pro book так все есть



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

Создано: 26 марта 2012 12:22
· Личное сообщение · #8

Zarion пишет:
В частности, как программно реализовать команды «Y» и «N»?


Вполне элементарно!

Например, мы имеем в IdaPro запись:

Code:
  1. .text:75C08FB2 ; void __stdcall Edit_SetupThemeInfo(struct tagED *)


Ей соответствует скрипт:

Code:
  1. SetType(0X75C08FB2, "void __stdcall Edit_SetupThemeInfo(struct tagED *a1);");


Допустим, надо поменять тип struct tagED * на DWORD * (команда «Y») и имя переменной a1 на aEditInfo (команда «N»). Это особенно актуально, если вы хотите получить Си код данной функции с нужными изменениями (клавиша F5 для плагина Hex-Rays Decompiler). Тогда вы просто запускаете скрипт:

Code:
  1. SetType(0X75C08FB2, "void __stdcall Edit_SetupThemeInfo(DWORD * aEditInfo);");


Последнюю точку с запятой для одиночной команды скрипта писать не обязательно (при этом становятся видны промежуточные сообщения «Иды»).


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


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