Сейчас на форуме: subword, rtsgreg1989, zds (+9 невидимых)

 eXeL@B —› Основной форум —› Автоматическое применение структур в IDA
. 1 . 2 . >>
Посл.ответ Сообщение

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

Создано: 13 января 2006 17:33
· Личное сообщение · #1

После дизассемблирования программы есть такие стоки:

mov edx, [ebp+var_40]
mov edx, [edx+8]
Call ...

при этом я знаю, что var_40 - это ни что иное, как объект TList, для которого я создаю структуру по смещению 8 байт которой хранится количество элементов.
Вопрос: как один раз обозначить, что [ebp-var_40] - это адрес моей структуры, и все относительные ссылки автоматически заменить на что-то типа mov edx,[edx+pTList.Count]?




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

Создано: 15 января 2006 00:43
· Личное сообщение · #2

Да, хороший вопрос, жаль ни кто не хочет отвечать. По моему тут ИДУ не очень любят. Больше предпочитают Олю.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 15 января 2006 00:54
· Личное сообщение · #3

qvant
Ну а навести мышь на var_40 и сделать Rename не катит разве?




Ранг: 84.8 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 15 января 2006 07:41
· Личное сообщение · #4

Да, если попросить Иду применять различные сигнатуры, то иногда такого эффекта добиться можно, но не факт.
Для того, чтобы Ида автоматически не применяла никаких сигнатур, во время открытия файла, отмени чекбокс "Analysis Enabled". А потом сам выбирай из списка сигнатуры и применяй. (Open signatures window)



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

Создано: 15 января 2006 10:58
· Личное сообщение · #5

Ara пишет:
Ну а навести мышь на var_40 и сделать Rename не катит разве?


Речь не об этом.. Смотри, есть код:

mov edx, [ebp+var_40]
mov eax, [edx+8]
Call ...

Первая строка помещает в edx указатель на мою структуру. Структуру, которую я сам создал в ИДА, выглядит она приблизительно так:

pTList struc ; (sizeof=0x10)
field_0 dd ?
field_4 dd ?
Count dd ?
field_C dd ?
pTList ends

Вторая строка, т.е. mov eax,[edx+8] помещает значение поля Count моей структуры в eax.
var_40 я понятное дело переименую во что-то типа TList, но хочется показать иде, что в edx указатель на мою структуру и соответственно все обращения типа [edx+8] - это ни что иное, как обращение к полям моей структуры. Т.е. хочется добиться замены [edx+8] на pTList.Count причем не ручного а автоматического.



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

Создано: 16 января 2006 13:14
· Личное сообщение · #6

Лично я делаю так:

static Struct_TList()
{
auto sHandle, sHandle_TObject;
auto error;
auto STRUCTURE_NAME;

auto ID, Address;
auto EnumName;
// Ïðîñìîòð ñòðóêòó íà íàëè÷èå TObject, åñëè íåò òî ñîçäàòü
sHandle_TObject = GetStrucIdByName("TObject_obj");
if(sHandle_TObject == -1)
{ sHandle_TObject = Struct_TObject(); }

STRUCTURE_NAME = "TList_obj";
sHandle = AddStrucEx(-1, STRUCTURE_NAME, 0);
if(sHandle == -1)
{ sHandle = GetStrucIdByName(STRUCTURE_NAME);
if(sHandle == -1)
{ WarningMessage("Unable to create the " + STRUCTURE_NAME + " structure!\n");
return -1; }
return sHandle; }

// AddStrucMember(sHandle, "pVTBL", 0x00, FF_DWRD, -1, 4);
AddStrucMember(sHandle, "pVTBL", 0x00, FF_DWRD + FF_0OFF, -1, 4);
AddStrucMember(sHandle, "Items", 0x04, FF_DWRD + FF_0OFF, -1, 4);
AddStrucMember(sHandle, "Count", 0x08, FF_DWRD, -1, 4);
AddStrucMember(sHandle, "Capacity", 0x0C, FF_DWRD, -1, 4);

EnumName="EnumTList";
ID=AddEnum(0, EnumName, 0);
if (ID != -1)
{ Address=0x00; AddConstEx(ID, "TList_Grow", Address, -1);
Address=0x04; AddConstEx(ID, "TList_4", Address, -1);
Address=0x08; AddConstEx(ID, "TList_8", Address, -1);
Address=0x0C; AddConstEx(ID, "TList_10", Address, -1); }

return sHandle;
}

затем просто выбираю из Sumbolic constant



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

Создано: 16 января 2006 13:15
· Личное сообщение · #7

Вот мой оригинал (он много неполный...)


e5ea_DelphiAnalis.idc.zip



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

Создано: 16 января 2006 13:16
· Личное сообщение · #8

Если кто доработает буду благодарен!



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

Создано: 16 января 2006 13:18
· Личное сообщение · #9

Для полного комплекта мои скрипты для делфи (чтото периписал, чтото сам)

b38b_IDAidc.zip.zip



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

Создано: 26 января 2006 13:46
· Личное сообщение · #10

Кстати кажется работает и с Borland C++




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 01 апреля 2006 21:05
· Личное сообщение · #11

TretS
Спасибо за твои скрипты. Действительно их применений облегчает понимание текста в IDA
У меня такой вопрос. Мне встречались некоторые программы на Delphi (точно на нем), но скрипт на них не отрабатывал. Нельзя ли их доработать или в чем проблема?

-----
Есть вопросы ко мне? В личку!




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

Создано: 01 апреля 2006 22:48
· Личное сообщение · #12

YoriCH
Возможно в DelphiAnalis необходимо изменить имя сегмента кода ---
StartAdr=SegByBase(SegByName("CODE"));




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 02 апреля 2006 06:06
· Личное сообщение · #13

TretS
То есть я понимаю возможны варианты. А как точно тогда определить имя сегмента кода?
Как я понимаю в этом случае имя желательно считывать из файла?

-----
Есть вопросы ко мне? В личку!





Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 02 апреля 2006 09:09
· Личное сообщение · #14

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

-----
Есть вопросы ко мне? В личку!




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

Создано: 02 апреля 2006 10:39
· Личное сообщение · #15

YoriCH
Писалось давно, замучила работа.
Пробывал по ЕР но работало не на всех распакованных файлах
Появится свободное время займусь поплотней. Извени.




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 02 апреля 2006 12:12
· Личное сообщение · #16

TretS
А как тогда считываются названия сегментов в скриптах для IDA?
Можно попробовать считать и установить первый сегмент.

-----
Есть вопросы ко мне? В личку!




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

Создано: 02 апреля 2006 15:50
· Личное сообщение · #17

YoriCH
Определим адрес ??? принадлежащий первому сегменту:

long SegStart (long ea); // returns start of the segment
// BADADDR if bad address passed
получаем стартовый адресс сегмента.

Хорошо бы знать как в ИДЕ вызвать перечисление всех сегментов или анализом загаловка файла вытащить
порядок сегментов, но это много муторней, т.к. придется вручную анализировать все остальное (есть скрипт
он анализирует заголовок и полько процедуру ЕР).



dcac_IDA_PE_idc.rar.zip



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

Создано: 02 апреля 2006 15:52 · Поправил: TretS
· Личное сообщение · #18

Хотя посмотрев помощь 4.9 нашел

// Get first segment
// returns: linear address of the start of the first segment
// BADADDR - no segments are defined



long FirstSeg (); // returns start of the first
// segment, BADADDR - no segments

можно попробовать!!!

подробнее завтра посмотрю на работе




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 02 апреля 2006 17:21
· Личное сообщение · #19

TretS
Хотя посмотрев помощь 4.9 нашел
Это только для 4.9?
А для 4.8 как?

-----
Есть вопросы ко мне? В личку!




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

Создано: 03 апреля 2006 00:02
· Личное сообщение · #20

YoriCH
Просто дома стоит только 4.9, завтра на работе посмотрю 4.8, 4.7




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 03 апреля 2006 00:11
· Личное сообщение · #21

TretS
кстати, он формирует структуры данных для каждой Form. Я имею ввиду типа

TForm1_Button3 = 388h
TForm1_Label1 = 394h
TForm1_Label2 = 3A4h
TForm1_Label8 = 3A8h

Но в самой программе они автоматически не встают. Их приходиться выставлять самостоятельно.
Это было так задумано или просто не ставилась цель все автоматизировать?
Сорри, если я слишком навязчиво по нему спрашиваю, просто идея очень хорошая и в первой редакции неплохо вышло, но хотелось бы автоматом многие вещи, чтобы не выставлять их.

-----
Есть вопросы ко мне? В личку!




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

Создано: 03 апреля 2006 13:10
· Личное сообщение · #22

YoriCH

для 4.8 работает

Попробуй поискать книгу Касперски: ОБРАЗ МЫШЛЕНИЯ – ДИЗАССЕМБЛЕР
IDA Pro - описывает функции для ИДЫ

Задумывалось как проба для написания плагина, но что-то дальше пока не идет ;)




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 03 апреля 2006 18:30
· Личное сообщение · #23

TretS
Ты прав для определения первого сегмента работает
StartAdr=FirstSeg();
Заменив его делаем срабатывание (по крайней мере у меня так) везде.
Со вторым еще сам смотрю. Читаю книгу, что ты посоветовал.

-----
Есть вопросы ко мне? В личку!




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

Создано: 03 апреля 2006 21:18
· Личное сообщение · #24

YoriCH

По поводу автоматической расстановки имен - это действительно (соответствует задумке автора)
только на уровне пользовательского кода. Чем глубже в RTL тем все абстрактней. Поэтому
по моему главная трудность в определении границы пользовательского кода. Компоненты вероятно
попадают в определение пользовательского кода.




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 03 апреля 2006 22:07
· Личное сообщение · #25

TretS
Однако только увидел проблему. У проги код разбросан по разным сегментам, так он обрабатывает только один.
Прочитал, то что советовал
И немного изменив. вроде добился, чтобы по всем сегментам искал.

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


92e4_03.04.2006_CRACKLAB.rU.tgz

-----
Есть вопросы ко мне? В личку!




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

Создано: 04 апреля 2006 09:38
· Личное сообщение · #26

YoriCH

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

По поводу скрипта да действительно удобней, не надо указывать имя сегмента руками в тексте скрипта



Ранг: 160.1 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 04 апреля 2006 09:47
· Личное сообщение · #27

TretS пишет:
режиме отладчика считать в скрипт значение регистров

плагин надо написать и все получится



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

Создано: 04 апреля 2006 10:55
· Личное сообщение · #28

infern0

Про плагин речь шла выше как идеал, а это подготовка к написанию, так сказать выработка стратегии




Ранг: 108.4 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 04 апреля 2006 17:39
· Личное сообщение · #29

TretS
infern0
А не применяя плагин значит нельзя будет?
Ведь структуры то делаются, почему нельзя их присобачить внутри каждой формы (используя, то что там многое однотипно)?

-----
Есть вопросы ко мне? В личку!




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

Создано: 04 апреля 2006 19:52 · Поправил: TretS
· Личное сообщение · #30

YoriCH

Как обяснить ИДЕ в статике экземпляр какого класса передается в функцию?

Также скрипты не позволяют создавать рекрусию.

Кстати Structures и Enums хорошо применять и в встроенном отладчике.

Еще для расширения кругозора нужно посмотреть исходники DeDe (где взять не помню, размер ок 2М)


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


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