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

 eXeL@B —› Вопросы новичков —› Не могу понять по какому адресу происходит вызов функции (MIPS32)
Посл.ответ Сообщение

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

Создано: 29 апреля 2009 15:18 · Поправил: NetSpider
· Личное сообщение · #1

Добрый день. Вот кусок кода дизассемлированной функции с помощью IDA.

.text:000D0450 get_something: # DATA XREF: .got:get_something_ptro
.text:000D0450
.text:000D0450 var_18 = -0x18
.text:000D0450 var_10 = -0x10
.text:000D0450 var_8 = -8
.text:000D0450 var_4 = -4
.text:000D0450 arg_0 = 0
.text:000D0450 arg_4 = 4
.text:000D0450
.text:000D0450 la $gp, loc_E13E0
.text:000D0458 addu $gp, $t9
.text:000D045C addiu $sp, -0x28
.text:000D0460 sw $ra, 0x28+var_4($sp)
.text:000D0464 sw $fp, 0x28+var_8($sp)
.text:000D0468 move $fp, $sp
.text:000D046C sw $gp, 0x28+var_18($sp)
.text:000D0470 sw $a0, 0x28+arg_0($fp)
.text:000D0474 sw $a1, 0x28+arg_4($fp)
.text:000D0478 addiu $a0, $fp, 0x28+var_10
.text:000D047C lw $a1, 0x28+arg_0($fp)
.text:000D0480 lw $a2, 0x28+arg_4($fp)
.text:000D0484 lw $t9, -0x6EAC($gp)
.text:000D0488 jalr $t9 -- вот здесь происходит вызов некой функции
.text:000D048C nop
.text:000D0490 lw $gp, 0x28+var_18($fp)
.text:000D0494 lw $v0, 0x28+var_10($fp)
.text:000D0498 move $sp, $fp
.text:000D049C lw $ra, 0x28+var_4($sp)
.text:000D04A0 lw $fp, 0x28+var_8($sp)
.text:000D04A4 jr $ra
.text:000D04A8 addiu $sp, 0x28
.text:000D04A8 # End of function get_something

Кто может подсказать по какому адресу или смещению относительно текущего кода происходит вызов функции с помощью инструкции .text:000D0488 jalr $t9
Сам что-то никак не могу понять.



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

Создано: 29 апреля 2009 16:33
· Личное сообщение · #2

а в другом отладчике открыть?



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

Создано: 29 апреля 2009 16:47 · Поправил: NetSpider
· Личное сообщение · #3

1) Ну, набор инструментов под MIPS32 слишком беден.

2) Почитал про динамические библиотеки Linux. Нашел вот что про их загрузку в адресное пространство.
--------------------
В основе процесса перемещения (relocation) лежит косвенная адресация, которую обеспечивают две таблицы – глобальная таблица смещений (Global Offset Table, GOT) и таблица связывания процедур (Procedure Linkage Table, PLT). В этих таблицах содержатся адреса внешних функций и данных, которые ld-linux.so должен загрузить в процессе перемещения. Получается, что код, содержащий обращение к внешним функциям и, таким образом, ссылающийся на данные этих таблиц, остается неизменным – модифицировать требуется только таблицы. Перемещение может проходить либо сразу во время загрузки программы, либо когда понадобится нужная функция.
--------------------
Есть у кого-нибудь идеи?

P.S. А возможна конвертация *.so в *.a библиотеку?



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

Создано: 29 апреля 2009 17:21
· Личное сообщение · #4

$t9 - это вроде регистр...



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

Создано: 29 апреля 2009 17:28
· Личное сообщение · #5

Да, это регистр. В нем должно храниться определенное значение для осуществления переходу в функцию.



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

Создано: 29 апреля 2009 17:44
· Личное сообщение · #6

а это помещает в регистр строку из адреса
.text:000D0484 lw $t9, -0x6EAC($gp)



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

Создано: 30 апреля 2009 09:50 · Поправил: NetSpider
· Личное сообщение · #7

Да, оно помещает в регистр, только не строку, а 4 байтовое число, которое является адресом вызываемой функции. В данном случае это можно интерпретировать так $t9 = память [$gp - 0x6EAC]

Если рассмотреть код выше с изменением регистра $gp, то увидим
.text:000D0450 la $gp, loc_E13E0 // $gp = 0xE13E0
.text:000D0458 addu $gp, $t9 // $gp = $gp + $t9

В $t9 по идее должен находится адрес функции в которой мы сейчас находимся.

P.S. Если б у меня был отладчик под MIPS32, я может бы и не парился. Протрассировал бу функцию и нашел куда идет переход, только вот нету его у меня и в интернете ничего подходящего найти не смог, а IDA при дизассемблировании динамической библиотеки не определяет вызов какой функции происходит


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


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