2013-08-16 3 views
8

Я обнаружил, что функция guarded_open_np используется libsqlite3.dylib для открытия файла базы данных. Я посмотрел в open source sqlite3, такого не было. Поэтому определенно Apple изменила его, чтобы использовать guarded_open_np вместо unix open.Параметры guarded_open_np

Я знаю, что guarded_open_np - это частный API, и я не нашел ни заголовка, ни документации об этом. Я хочу сделать перехват (MSFunctionHook Cydia) на guarded_open_np, поэтому мне нужно знать, каковы параметры, а не только имя функции.

Я обратной инженерии libsqlite3.dylib с помощью IDA Pro, это то, как он называется guarded_open_np:

sub_79c1c: 
push {r7, lr} 
mov r7, sp 
sub sp, #0x4 
mov r3, r1 
movw r1, #0xc57e 
movt r1, #0x0 
str r2, [sp, #0x4 + var_0] 
add r1, pc 
movs r2, #0xf 
blx imp___picsymbolstub4__guarded_open_np 
add sp, #0x4 
pop {r7, pc}  

Тем не менее, до сих пор не ясно, что Params это может занять. Я очень ценю, если есть официальный сайт, в котором упоминается guarded_open_np со всеми его параметрами.

+3

Мое лучшее предположение заключается в том, что он выглядит как открытый UNIX (3): https://gist.github.com/CodaFi/7c73abd9dfb602dcc26e – CodaFi

+1

@Krypton вы могли бы подключить его к отладчику и проверить, что такое содержимое регистров r0 ~ r3 (и если они указывают на память, содержимое памяти) непосредственно перед выражением blx? Вызывающие соглашения обычно используют r0 для первого аргумента, r1 для второго и т. Д. – Ncat

ответ

2

Из информации, приведенной здесь, я не верю, что мы сможем дать солидный ответ, хотя CodaFi - хорошее предложение.

Тем не менее, вот некоторые ссылки, которые могут быть полезны в предоставлении вам инструменты, чтобы узнать себя:

Во-первых, вы, вероятно, уже знаете, но узнать о регистрах и стеке.

В сборке для вызова функции вы обычно следуете чему-то, называемому двоичным интерфейсом приложения (ABI), который просто устанавливает соглашения, например, где функции ожидают, что их аргументы (регистры, стек и т. Д.), Который регистрирует вызов функции, разрешен для изменения et cetera.

Поскольку это iOS, вы должны смотреть на Procedure Call Standard for ARM Architecture и iOS ABI Function Call Guide.

Глядя на раздел «Стандартная стандартная процедура» в первой ссылке выше, вы можете сказать, что вызовы функций ожидают, что их первые четыре аргумента будут в регистре r0 ~ r4 соответственно.

Итак, для вашего расследования вы, вероятно, захотите узнать, что находится в этих регистрах, перед тем, как разветвиться на guarded_open_np. XCode может вытолкнуть сборку файла для вас, и вы сможете установить на нем контрольные точки; затем используйте команду register read в llvm, чтобы показать все содержимое вашего регистра (обратите внимание, что некоторые регистры могут содержать только ячейки памяти, которые вы хотите изучить с помощью команд lldb memory read).

Для рытья в немного более в сборке IOS, я рекомендую 3-часть блога Майка Эша «Разборка в сборе» части 1, 2 и 3. Тогда вам может понравиться его последнее сообщение на ARM 64 bit updates. Это неформальные ресурсы, но вы можете быстро справиться с проверкой сборки и узнать, что происходит дальше.

+0

Спасибо Wilson за материалы и ссылки. Я думаю, что потребуется некоторое время, чтобы переварить вещи: D – Krypton

+0

@Krypton Спасибо за кредит! На самом деле этого не ожидал.Сообщения в блоге, на которые ссылаются выше, на самом деле довольно приличное стартовое место (ссылка ABI и материал довольно плотные и не предназначены для обучения). Тем не менее, если вы действительно хотите знать свои вещи, то топик Рэндалла Хайд, «Искусство языка ассемблера» рекомендуется прочитать. – Ncat