Перейти к содержимому


Фотография

Reverse engineering и IDA Pro


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 35

#21 инженер

инженер

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений
  • Пол:Мужчина

Отправлено 04 April 2011 - 06:50

Похожий вопрос поднимался здесь: http://sannybuilder....opic.php?id=634
Начать стоит с внимательного прочтения. Если останутся вопросы - расскажу, еще раз, как это делается.

listener, спасибо огромное, хороший туториал получился!
А можете таким же образом разобрать пример с вызовом какого-нибудь из методов типа __thiscall?

#22 __serg__

__serg__

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений

Отправлено 20 April 2011 - 15:39

Здравствуйте, подскажите, как в IDA PRO 5.5 cделать следующее: Стандартная структура Windows объявлена с использованием макроса. Без определения макроса размер структуры = 0x20 После определения макроса размер структуры становится больше. IDA берёт стандартный тип структуры размером 0x20. Как сделать так, чтобы она использовала расширенный тип структуры. Вероятно, для этого следует определить макрос. Пытался сделать это в Compiler setup | Predefined macros, но у меня не получилось.

#23 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 20 April 2011 - 19:33

IDA позволяет создавать свои структуры.
Shift-F9 (открыть окно структур), Ins (добавить структуру), ввести имя структуры.
Дальше можно добавлять в структуру либо простые поля (d), либо другие структуры (Alt-Q).

Повторять до тех пор, пока то, что получается, не совпадет с требуемым.
PS. Имя поля задается с помощью n.
You think your day was surreal? Try mine.

#24 __serg__

__serg__

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений

Отправлено 21 April 2011 - 07:29

Этот способ я знаю, спасибо. Так всегда и приходиться делать. Просто хотелось выяснить, есть ли другой способ.

#25 инженер

инженер

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений
  • Пол:Мужчина

Отправлено 18 August 2011 - 09:42

Можно ли в IDA изменять инструкции "текстом" - как в OllyDbg? Может какой плагин есть? Или это только через вкладку Hex View?

Сообщение отредактировал инженер: 18 August 2011 - 09:43


#26 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 19 August 2011 - 14:23

Edit -> Patch Program -> Assemble Пункт "Patch Program" по умолчанию выключен. Включается в idagui.cfg DISPLAY_PATCH_SUBMENU = YES // Display the Edit,Patch submenu
You think your day was surreal? Try mine.

#27 инженер

инженер

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений
  • Пол:Мужчина

Отправлено 19 August 2011 - 15:26

Edit -> Patch Program -> Assemble

Пункт "Patch Program" по умолчанию выключен. Включается в idagui.cfg
DISPLAY_PATCH_SUBMENU = YES // Display the Edit,Patch submenu

Спасибо, listener!

#28 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 22 October 2013 - 11:40

напишу сюда, что ли: я тут сгенерировал древо классов GTA5 PS3. страница весит более метра, так что будет тормозить ^_^

шаблоны я не выносил, вся инфа только на основе RTTI как она есть в исполняемом файле. из-за множественного наследования некоторые классы повторяются - ИМХО так удобнее. забавно, что есть шаблон pgArray, однако он не совместим с pgArray из шаблонов listener'а.

#29 XEPOMAHT007

XEPOMAHT007

    Активный участник

  • LCSTeam
  • PipPipPip
  • 472 сообщений
  • Пол:Мужчина


Отправлено 22 October 2013 - 15:38

древо классов GTA5 PS3


Что это такое? И применимо ли это в моддинге как-нибудь? Объясните дураку.

a4ea86ab343c.gif
BETA 4.0 COMING SOON


#30 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 22 October 2013 - 22:06

древо классов GTA5 PS3


Что это такое? И применимо ли это в моддинге как-нибудь? Объясните дураку.

напрямую нет, но для реверса может быть удобно, чтобы соориентироваться и вообще оценить что к чему.

попробую объяснить попроще:
это RTTI-иерархия классов GTA5 PS3, дерево наследования другими словами. каждая строчка - это опредление класса в игре (грубо говоря, класс - описание объекта)
например, *.ctd это набор объектов grcTextureGCM, базовый клас которого - grcTexture, базовый клас которого - pgBase и т.д.:
datBase <- pgBase <- grcTexture <- grcTextureGCM
таким образом, если мы хотим разобрать структуру grcTextureGCM нужно разобрать все его базовые классы.
кроме того, для полноты структуры можно посмотреть и методы классов-потомков, которые также обращаются к полям базовых классов.

#31 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 24 October 2013 - 22:26

напишу сюда, что ли: я тут сгенерировал древо классов GTA5 PS3. страница весит более метра, так что будет тормозить ^_^

шаблоны я не выносил, вся инфа только на основе RTTI как она есть в исполняемом файле. из-за множественного наследования некоторые классы повторяются - ИМХО так удобнее. забавно, что есть шаблон pgArray, однако он не совместим с pgArray из шаблонов listener'а.

Симпатично. А я вот все ленюсь приделать к своему форматтеру HTML-вывод (все время хочется чего-то бОльшего, например, сделать заодно генерацию .idc, который бы методы переименовывал). 

 

А с множественным наследованием - я, обычно, включаю класс в дерево по первому parent-у, а остальные пишу вот так:  

|   |  GDoubleFormatter (MI: GNumericBase, GString::InitStruct)

 

pgArray (оригинальный) не имеет VMT, поэтому он не попадает в этот список. Есть еще одна вероятность, что, то, что у меня называется pgArray, на самом деле, не pgArray, а atArray<pgPtr<?>>


You think your day was surreal? Try mine.

#32 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 26 October 2013 - 08:24

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

кстати, раз уж тут listener. pgBase имеет два виртуальных метода (не считая деструкторов) и в описании самого pgBase представляют собой заглушки. в случае grcTextureGCM это get/set для поля _f30. можно какую-нибудь подсказку, что это за методы?

Сообщение отредактировал Lego: 26 October 2013 - 09:17


#33 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 28 October 2013 - 08:44

Так в том-то и фокус, что переименовывать нужно не просто так, а проверять, что этот метод занимает тот же слот в VMT потомков (и больше не используется нигде). у меня уже есть safe_rename, который переименовывет методы, которые используются только в одном классе. В теории, пройтись по потомкам, можно и с помощью .idc, но проще, все-таки сделать это внешним скриптом.

Виртуальные методы pgBase раньше использовались при дефрагментации памяти (предположительно, как остаток от экспортера ресурсов). Сейчас они точно не используются (если посмотреть на pgDictionary<grcTexture>, там _m8 вообще выпадает в отладчик).
You think your day was surreal? Try mine.

#34 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 28 October 2013 - 18:45

но ведь виртуальные функции можнно вызвать ещё и явно, типа A::f() ?

> Сейчас они точно не используются (если посмотреть на pgDictionary<grcTexture>, там _m8 вообще выпадает в отладчик).
жаль, а так бы сходу были два метода для всех потомков pgBase.

есть ещё маленький вопрос: есть ли какой-нибудь более простой способ нахождения размера (в идеале - структуры) класса кроме как отслеживать использование каждого поля вручную? другими словами, как, к примеру, узнать где заканчивается rmcDrawableBase и начинается rmcDrawable?

UPD: возможно, есть смысл перенести сообщения в эту тему

Сообщение отредактировал Lego: 28 October 2013 - 19:27


#35 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 29 October 2013 - 09:55

> но ведь виртуальные функции можнно вызвать ещё и явно, типа A::f()

Это не является проблемой. Как правило, функции вызываются по адресу а это никак не влияет на анализ VMT.
Т.е., при анализе нам нужно проверить в какие VMT и по какому смещению входит эта функция, но совершенно необязательно проверять, кто и откуда ее еще вызывает.

Случаи, когда берется значение из VMT, а потом используется в качестве указателя, настолько редки, что ими можно пренебресь (порядка 10 случаев на 30-40 тысяч методов).

> другими словами, как, к примеру, узнать где заканчивается rmcDrawableBase и начинается rmcDrawable?
Увы, если для структруы не вызывается явно new, то никак. Только анализ методов и структуры (достаточно часто в parent-е tcnm padding, или что-то аналогичное).
You think your day was surreal? Try mine.

#36 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 30 October 2013 - 13:27

так в том-то и прикол, что для абстрактного класса нельзя вызвать new (сомневаюсь, что разработчики выстрелили себе в ногу приводили тип выделенного malloc'ом куска памяти к абстрактному классу). хотя, конкретно для rmcDrawableBase я нашёл ответ на свой вопрос.

ещё такой момент: нельзя ли как-то в ida отметить вызов виртуального метода, например, ссылкой на смещение относительно __vfptr базового класса?




Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных