Сейчас на форуме: tyns777, cppasm, dutyfree (+7 невидимых)

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

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

Создано: 13 августа 2017 14:34 · Поправил: i_am_kisly
· Личное сообщение · #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.9 (новичок), 16thx
Активность: 0.040.01
Статус: Участник

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

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

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



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

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

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

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

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



Ранг: 19.9 (новичок), 16thx
Активность: 0.040.01
Статус: Участник

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

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

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

Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

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

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



Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

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

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



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

Создано: 13 августа 2017 18:15 · Поправил: i_am_kisly
· Личное сообщение · #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 чертовски не хватает. Кто-нибудь пробовал ?



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

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

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



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

Создано: 14 августа 2017 22:01
· Личное сообщение · #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


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




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

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

i_am_kisly

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

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

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

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

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

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

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

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

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

-----
vx




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

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

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

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


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