![]() |
eXeL@B —› Вопросы новичков —› Не могу понять по какому адресу происходит вызов функции (MIPS32) |
Посл.ответ | Сообщение |
|
Создано: 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 Сам что-то никак не могу понять. ![]() |
|
Создано: 29 апреля 2009 16:33 · Личное сообщение · #2 |
|
Создано: 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 библиотеку? ![]() |
|
Создано: 29 апреля 2009 17:21 · Личное сообщение · #4 |
|
Создано: 29 апреля 2009 17:28 · Личное сообщение · #5 |
|
Создано: 29 апреля 2009 17:44 · Личное сообщение · #6 |
|
Создано: 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) |