2015-05-27 3 views
1

У меня есть машина x86_64, и она может запускать процесс IA32, потому что я установил 32-битную библиотеку. Теперь я хочу знать, что такое платформа, которую использует запущенный процесс? 64 бит или 32 бит?Как найти платформу работающего процесса

Единственный способ получить доступ к процессу - это системный вызов ptrace; У меня нет исполняемого файла (например, я могу просто выполнить файл, но у меня нет прав на чтение и запись), поэтому я не могу получить заголовок ELF.

OS, который я использую, - Ubuntu 14.04 LTS.

Я не хочу получать исполняемый файл, а затем анализировать формат ELF. ТОЛЬКО ПУТЬ Я могу получить доступ к процессу: ptrace или другие системные вызовы, такие как ptrace, если вы знаете, скажите, пожалуйста. Потому что я хочу проанализировать процесс в программе на C.

+0

Работает ли 'ldd'? (Он фактически выполняет файл, с некоторым скрытым параметром) –

+0

@BenVoigt nop, на самом деле это запущенный процесс. Я прикрепляю его 'ptrace'. – litao3rd

+0

У вас есть доступ к lsof? – tink

ответ

0

Пробуйте использовать xocopy, чтобы создать копию исполняемого файла, находящегося под вопросом, и сбросить заголовок ELF из созданной копии.

Этот инструмент и проблема, которую вы описываете, обсуждались elsewhere, и эта дискуссия может быть вам полезна.

+0

Спасибо за ваш ответ. Работа, которую я делаю, отчасти такая же, как «xocopy». Я не хочу получать исполняемый файл. Я просто хочу проанализировать платформу, которую процесс использует с системным вызовом 'ptrace'. – litao3rd

+0

@ litao3rd: исходный код C для «xocopy» программно находит, а затем читает заголовок ELF с помощью 'ptrace' - который, по-видимому, отвечает вашим потребностям выполнения этого анализа с помощью программы C (применяется GPL). – deaks

+0

yep, я прочитал источник 'xocopy', он работает, просматривая заголовок ELF в памяти. Но это не то, что я хочу. Спасибо за ваш ответ еще раз. :П – litao3rd

0

Если вы можете посмотреть /proc/<pid>/personality для рассматриваемого PID, я думаю, что информация, которую вы хотите, есть. Это 00000000 для 64-битных процессов, но 00400000 для 32-битного процесса. (и 00440000 для 32-битного, который я остановил в отладчике.)

В справочной странице proc(5) говорится, что он сообщает вам о личности, установленной personality(2).

Kernel источник: копия https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/personality.h

GLibC в: https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sys/personality.h;hb=HEAD

Я не уверен, что происходит, но, похоже, единственный набор бит для нормально запущенного процесса 32-битном является READ_IMPLIES_EXEC. Поэтому, возможно, личность - не лучший способ пойти. 64bit код жестяная банка комплект это.

Об этом также было задано по телефону https://unix.stackexchange.com/questions/106234/determine-if-a-specific-process-is-32-or-64-bit с ограниченным успехом/жизнеспособностью для методов обнаружения, отличных от проверки заголовков ELF после их получения различными способами. Глядя на /proc/<pid>/maps для 64-битных адресов, выглядит жизнеспособным.

Смежные вопросы