Как найти argc
и argv
из общего объекта? Я пишу библиотеку в C, которая будет загружена через LD_PRELOAD
. Я был в состоянии найти стек два различных способа:Найти argc и argv из библиотеки
- Read
rsp
через встроенный__asm__
вызов. - Прочитайте
/proc/<pid>/maps
и проанализируйте запись для стека.
Затем я могу создать указатель, указать его на сегмент стека, а затем повторить поиск данных. Проблема в том, что я не могу найти эффективный способ определить, какие байты argc
и указатель на указатель на строки argv
.
Я знаю, что /proc/<pid>/cmdline
также содержит аргументы, каждый из которых разделен 0x00
, но мне интересно находить все в памяти.
В gdb Я вижу a DWORD
для argc
, за которым следует QWORD
, который является первым указателем. 20 байт до адреса argc
- указатель, который указывает на сегмент кода основной программы. Но это не детерминированный способ идентифицировать argc
и argv
.
Я видел несколько сообщений, но не рабочий код:
- http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.system/2005-07/0296.html
- https://sourceware.org/ml/libc-help/2009-11/msg00010.html
Кажется, это немного способный сделать это, поскольку он зависит от того, как компилятор использует стек. Скорее всего, это изменится, как только кто-то найдет оптимизацию компилятора/времени выполнения. Приложение может также хотеть использовать одни и те же аргументы в другом смысле, это может вызвать проблемы, если ваша библиотека пытается интерпретировать параметры, не предназначенные для него. Не можете ли вы передать их непосредственно в свою библиотеку по вызову «конструктор»? Да, я понимаю, что то, что вы хотите сделать, это избежать этих накладных расходов. – ChrisR
В какой момент будут доступны «argc» и «argv»? Вероятно, это невозможно во время фазы LD_PRELOAD. –
Это также совершенно законно для программы для _modify_ данных в 'argv'. Я не уверен, что произойдет со стеком в этом случае. – paddy