eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
обновлён 2 декабря!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: SDK, yashechka (+6 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› IDA: Как снять дамп аргументов функции ?
Посл.ответ Сообщение

Ранг: 0.8 (гость)
Статус: Участник

Создано: 13 августа 2017 14:34 · Поправил: i_am_kisly New!
Цитата · Личное сообщение · #1

Всем мой пламенный привет!
Я разбираю форматы файлов одной старой игрушки (Arcanum Of Steamworks and Magick Obscura 2001) коммерческой ценности она уже не представляет, всё ради комьюнити.
И забуксовал на одной функции декодирования ArtId спрайта (unsigned int32) в текстовое имя файла.

int __cdecl sub_46F8B0(int a1, char *a2) { .. } (кликабельно)

Моего скилла не хватает чтобы воспроизвести логику работы этой функции, но у меня есть список всех возможных АrtId. Можно ли средствами IDA вызвать код этой функции со своим списком аргументов "a1", и сделать дамп "a2" чтобы получить таблицу соответствия "a1 - a2" ?
В ida я мягко говоря плаваю..

Буду рад любому ответу

Ранг: 19.7 (новичок)
Статус: Участник

Создано: 13 августа 2017 14:43 New!
Цитата · Личное сообщение · #2

Как вариант дебагер иды + idc
https://exelab.ru/f/index.php?action=vthread&forum=1&topic=13601#18

А так - количество аргументов в большинстве случаев и в статике ж видно

Ранг: 0.8 (гость)
Статус: Участник

Создано: 13 августа 2017 15:08 · Поправил: i_am_kisly New!
Цитата · Личное сообщение · #3

Мне нужно не количество аргументов.

У меня есть список всех значений для первого аргумента (несколько тысяч), и хочу получить для каждого из них значение по указателю для второго аргумента, которое генерируется во время выполнения функции (строка с именем файла).

Чтобы использовать метод по ссылке, я должен запустить отладку игры в ida, и потратить десятки часов бегая по локациям. Или я не прав ?

Ранг: 19.7 (новичок)
Статус: Участник

Создано: 13 августа 2017 15:25 New!
Цитата · Личное сообщение · #4

https://github.com/36hours/idaemu ?
можно под себя переписать

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


Ранг: 390.3 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 13 августа 2017 15:42 New!
Цитата · Личное сообщение · #5

i_am_kisly
а если в самом дебагере (игрушке) припилить цикл do {call(sub_46F8B0)} while и оттуда снять. Ну или с помощью скрипта.

Ранг: 160.9 (ветеран)
Статус: Участник

Создано: 13 августа 2017 15:51 New!
Цитата · Личное сообщение · #6

Я может чего то не понимаю, но эта функция принимает а1 и а2 параметры, а следовательно нужно смотреть выше, где эти параметры берутся и оттуда их и получить. Или как вариант хукнуть функцию и все параметры записать в текстовый файл, правда тогда придется побегать в игре или эмулировать выполнение кода, при условие что количество параметра а1 известно.

Ранг: 0.8 (гость)
Статус: Участник

Создано: 13 августа 2017 18:15 · Поправил: i_am_kisly New!
Цитата · Личное сообщение · #7

RevCred пишет:
https://github.com/36hours/idaemu ?


Code:
  1. from idaemu import  * 
  2. = Emu ( UC_ARCH_X86 , UC_MODE_32 )
  3. print a.eFunc(0x0046F8B0, None, [0x4105C0, ?])


а как в IDAPython оформить передачу второго аргумента ? корый вроде как указатель.

Code:
  1. int __cdecl sub_46F8B0(int a1, char *a2)

когда я пытаюсь передать вторым аргументом что-то вроде ctypes.create_string_buffer() (ведь возвращаемый тип у него ctypes.c_char_Array_%) то получаю

Code:
  1. Python>print a.eFunc(0x454AB0, None, [0x4105C0, s2])
  2. Traceback (most recent call last):
  3.   File "<string>", line 1, in <module>
  4.   File "C:/Program Files (x86)/IDA 6.6/plugins\idaemu.py", line 371, in eFunc
  5.     self._emulate(func.startEA, retAddr, args)
  6.   File "C:/Program Files (x86)/IDA 6.6/plugins\idaemu.py", line 285, in _emulate
  7.     self._initStackAndArgs(uc, stopAddr, args)
  8.   File "C:/Program Files (x86)/IDA 6.6/plugins\idaemu.py", line 177, in _initStackAndArgs
  9.     uc.mem_write(sp, pack(self.pack_fmt, args[i]))
  10. struct.error: cannot convert argument to integer


Моих знаний о ctypes чертовски не хватает. Кто-нибудь пробовал ?

Ранг: 56.9 (постоянный)
Статус: Участник

Создано: 14 августа 2017 20:20 New!
Цитата · Личное сообщение · #8

юзай Appcall, как раз для таких ситуаций придуман.

Ранг: 0.8 (гость)
Статус: Участник

Создано: 14 августа 2017 22:01 New!
Цитата · Личное сообщение · #9

Спасибо, помогло!

В общем для таких же увальней как и я:

Выбираем в списке отладчиков Local Win32 Debugger, запускаем отладку и в стабильном состоянии ставим отладку на паузу. Далее в консоли (на моем примере):
Code:
  1. Python>s_out = Appcall.buffer(" ", 50)
  2. Python>ret = Appcall.sub_46F8B0(0x4105C0, s_out)

Если тут ида не умерла из-за ошибки, то я вас поздравляю
Code:
  1. Python>print(s_out.value)
  2. art\tile\grsbse0c.art

Проверяю еще раз
Code:
  1. Python>ret = Appcall.sub_46F8B0(0x90080001, s_out)
  2. Python>s_out.value
  3. art\light\Disk2x2_s0.art


Все получилось, можно писать цикл для формирования словаря.


Ранг: 316.4 (мудрец)
Статус: Участник

Создано: 15 августа 2017 20:33 New!
Цитата · Личное сообщение · #10

i_am_kisly

1. > У меня есть список всех значений для первого аргумента (несколько тысяч)

- Накоплено значение аргумента A.

2. > и хочу получить для каждого из них значение по указателю для второго аргумента

Тут мозг отказывается воспринимать ваше описание. Во первых вы не корректно написали предложение, оно двусмысленно и вообще не понятно, бред какой то.

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

В другом варианте на ум приходит массив множества допустимых вопросов. Переформулируйте эту чушь.

Учитывая сам вопрос:

> забуксовал на одной функции декодирования ArtId спрайта (unsigned int32) в текстовое имя файла.

Каким образом спрайт имеет отношение к файловой системе и имеет размерность адресации представить сложно, видимо нужно вдуть теже грибы что и вы

Ранг: 0.8 (гость)
Статус: Участник

Создано: 15 августа 2017 22:48 New!
Цитата · Личное сообщение · #11

difexacaw, ну и зачем ты пришел ? Чукча не читатель, чукча писатель? Свою задачу я уже решил, за что большое спасибо reverser. А ты дальше иди кури грибы или что там у тебя.

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

 eXeL@B —› Вопросы новичков —› IDA: Как снять дамп аргументов функции ?

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS