LINUX.ORG.RU

5
Всего сообщений: 34

Аналог «file version» из portable executable

У виндовых исполнимых файлов и библиотек в формате Portable Executable есть куча метаданных, например «file version». Существуют ли подобные записи для формата ELF?

Нашёл упоминания какого-то BuildID, но это хеш, который не позволяет по номеру оценить старшинство версий, и ссылки битые.

Кто-нибудь заморачивался хранить в исполнимом файле номер версии? Если да, можно ссылку на стандарт?

 ,

olegd ()

Декомпиляция Linux-программ

Возможно ли декомпилировать/дизассемблировать Linux-программы?

 , ,

ConLenov ()

Генератор библиотек линковки с заглушками из .so ELF файлов

Хотелось бы из *.so библиотеки сгенерировать другую библиотеку с такой же динамической таблицей символов, но без содержимого и с пустыми секциями для того чтобы использовать при компиляции программ, использующих эту библиотеку без самой библиотеки. Примерно как *.lib в Windows. Я конечно могу сам сделать, но перед тем как делать велосипед интересно узнать о существующих решениях. Также было бы неплохо, чтобы был ещё текстовый формат объявления символов и версий, чтобы из него можно было собрать библиотеку для линковки.

 , ,

X512 ()

Поиск нужных зависимостей для запуска ELF файла

Не получается запустить бинарный файл скомпилированный из qt.
Пробовал запускать через интерпретатор ld-linux-x86-64.so.2 получил - cannot open shared object file. Подскажите, как можно узнать, какие библиотеки и зависимости нужны для запуска файла?

 , ,

makset199 ()

IdaPro , как модифицировать библиотеку для Андроид?

Здравйствуйте, подскажите кто разбиратся, Пытаюсь немного модифицировтаь Андроид библтотеку: Имеется одна «не нужная» функция, хочу вместо нее вставить свой код и соответсвенно вызов его из другой функции.

Например когда вписываю свои инструкции (2’ух байтные(code16), режим Thumb), Ида анаизирует их как code32 и соотетсвенно Код не работает(ошибка сегментации), может имеются какие-то правила в ARM, например как Выравнивание кода по границе (вроде 4 байта), которые я не учитываю? Надо что-бы код читался как Code16, а не 32.

 , , ,

Devill ()

Изменить Имя Функции в ELF.

Здравствуйте подскажите пожалуйста каким образом можно изменить имя Функции в ELF файле, буквально одну букву. Это SO библиотека одного Андроид приложения, хочу сделать что-то наподобие защиты, от подмены файлов.

Саму библиотеку в свое время подправил, немного модифицировав логику работы: Изменил одну функцию на свою, Точнее создал две своих функции вместо Одной, настроил адреса и вызовы, поверил с помощью ИДА все работает, и собственно работает на Андроид.

Теперь понадобилось Изменить имя импортируемой Функции, незнаю как правильно назвать, это JNI. Нужная мне Функция вызывается из Java code, т.е. из приложения АПК. Сама библиотека SO находится в отдельно Загружаемых файлах, так вот изменил имя вызываемой Функции в АПК, и в самой библиотеке, но такой метод не работает, АПК просто не может достучаться (не видит) эту функцию.

Правильно ли я понимаю что требуется Перекомпоновка ELF-a с помощью Linker?

Прошу помощи у знающих товарищей. Исходников естественно Нет.

 , ,

Devill ()

Как создать исполняемый файл, работающий и на 32 , и на 64 бит?

Собственно, вопрос. Как в линукс создать эльф, работающий на 32 битной ОС, и на 64 битной? Реально ли это без перекомпиляции? Т.е. вот как в винде есть Wow64 подсистема, есть ли такое в линуксе? Или надо пересобирать под конкретную систему.

 , ,

zer0cat ()

Помогите, не запускается

https://0x0.st/sdnY.so

Чего ей не хватает?

 , , , ,

Moondancer ()

Декомпиляция файла ELF to С++

Добрый день. Необходим грамотный специалист, который в сжатые сроки сможет провести декомпиляцию 2х файлов формата ELF. Файлы кину откликнувшимся, для того что бы могли оценить свои силы. Естественно все не бесплатно.

 ,

vlad_77_msk ()

разный вывод ldd и readelf -d

здравствуйте. есть вывод команды

readelf -d /usr/lib/x86_64-linux-gnu/libcares.so

:

Dynamic section at offset 0xfdc8 contains 27 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000e (SONAME)             Library soname: [libcares.so.2]
и вывод команды

ldd /usr/lib/x86_64-linux-gnu/libcares.so

:

linux-vdso.so.1 =>  (0x00007fff457f7000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fbd010dd000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbd00d1c000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbd00afe000)
	/lib64/ld-linux-x86-64.so.2 (0x000055a1250ac000)

судя по ману, это одно и то же... почему разные зависимости?

 , , ,

xperious ()

Как радикально решить вопрос с эльфами?

У меня выдаётся ошибка:

ERROR: [Loader Message] Code 0 : /usr/lib32/libvulkan_radeon.so: wrong ELF class: ELFCLASS32
/var/tmp/portage/media-libs/vulkan-loader-1.1.70.0/work/Vulkan-LoaderAndValidationLayers-sdk-1.1.70.0/demos/vulkaninfo.c:2700: failed with VK_ERROR_INITIALIZATION_FAILED

$ qfile /usr/lib32/libvulkan_radeon.so
media-libs/mesa (/usr/lib32/libvulkan_radeon.so)

«You need a 64-bit version of the library» отвечает мне DuckDuckGo. Что делать?

 ,

Einstok_Fair ()

Как найти все библиотеки, которые дергаются через dlopen?

$SUBJ;

При этом без запуска бинарника.

Задача - упаковка зависимостей к бинарнику.
Проблема в том, что одна из зависимостей - SDL2_mixer, который в свою очередь через dlopen грузит libvorbis (да, я знаю, что mixer можно собрать так, чтобы он просто динамически линковался - это не выход).

Костылинг в виде strings SDL2_mixer.so | grep 'vorbis' хоть и работает, но очень уж костыль.

 ,

iSage ()

Сайдэффект при вызове dlsym

Доброго ВС! Дорабатывал proxychains и словил крайне интересную ошибку... Изолировал ее на сколько мог:

#undef _GNU_SOURCE
#define _GNU_SOURCE

#include <sys/types.h>
#include <sys/param.h>

#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <inttypes.h>

#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>

void *dlsy7(void *, const char *); //special load from patched libdlsy7.so

void *(*true_dlopen)(const char *filename, int flags)=NULL;
void *(*true_dlsym)(void *handle, const char *symbol)=NULL;


void *dlopen(const char *filename, int flags) {
	if(true_dlopen==NULL) {
		true_dlopen=dlsym(RTLD_NEXT,"dlopen");
	};

	void * res=true_dlopen(filename,flags);

	printf("DLOPEN %s res = 0x%" PRIx64 "\n",(char *)filename,(unsigned long int)res);
	
	return res;
}


void *dlsym(void *handle, const char *symbol) {
	printf("DLSYM %s 0x%" PRIx64,symbol,(unsigned long int)handle);

	if(true_dlsym==NULL) {
		true_dlsym=dlsy7(RTLD_NEXT,"dlsym");
	};

	void *res,*res1;

	//res1=true_dlsym(handle, symbol); //DECOMENT THIS AND PROG WILL WORK
	res=dlsy7(handle, symbol);

	printf(" res = 0x%" PRIx64 " res1 = 0x%" PRIx64 "\n",(unsigned long int)res,(unsigned long int)res1);

	return res;
};

Собираю так

gcc main.c -fPIC -shared /usr/lib/x86_64-linux-gnu/libd7.so.2 -o libdltest.so && sed -i "s|libdl.so.2|libd7.so.2|g" ./libdltest.so && echo -e "\e[32mDONE\e[0m"
libd7.so.2 - Это предварительно обработанная libdl.so.2 с измененным именем символа dlsym на dlsy7 (чтобы можно было подменять вызов dlsym) Тесты:
LD_PRELOAD=./libdltest.so xed   #Работает
LD_PRELOAD=./libdltest.so chromium-browser

Using PPAPI flash.
--disable-new-tab-first-run --enable-user-scripts --ppapi-flash-path=/usr/lib/adobe-flashplugin/libpepflashplayer.so --ppapi-flash-version=
DLSYM dlopen 0xffffffffffffffff res = 0x7f5270541f70 res1 = 0x7f5271cc4568
DLOPEN liblttng-ust-tracepoint.so.0 res = 0x0
DLOPEN liblttng-ust-tracepoint.so.0 res = 0x0
DLSYM dlopen 0xffffffffffffffff res = 0x7f588926ef70 res1 = 0x7f588a9f1568
DLOPEN liblttng-ust-tracepoint.so.0 res = 0x0
DLOPEN liblttng-ust-tracepoint.so.0 res = 0x0
DLOPEN /usr/lib/chromium-browser/libwidevinecdmadapter.so res = 0x5564cafc6510
DLOPEN /usr/lib/adobe-flashplugin/libpepflashplayer.so res = 0x5564cafc7640
DLOPEN /usr/lib/chromium-browser/libwidevinecdm.so res = 0x5564cafc7190
DLOPEN libgdk-3.so.0 res = 0x7f5271c92000
DLSYM gdk_set_allowed_backends 0x7f5271c92000 res = 0x7f526b3183d0 res1 = 0x0
DLOPEN (null) res = 0x7f5271cc7168
DLSYM gtk_progress_get_type 0x7f5271cc7168 res = 0x0 res1 = 0x7f5271c97000
DLSYM localtime 0xffffffffffffffff res = 0x7f5270d1f930 res1 = 0x7ffd2e955040
DLSYM localtime64 0xffffffffffffffff res = 0x0 res1 = 0x7ffd2e955040
DLSYM localtime_r 0xffffffffffffffff res = 0x7f5270d1f920 res1 = 0x7ffd2e955040
DLSYM localtime64_r 0xffffffffffffffff res = 0x0 res1 = 0x7ffd2e955040
[13398:13398:0102/154843.197714:ERROR:browser_main_loop.cc(293)] Gtk: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported

В хроме возникла ошибка... Теперь раскоментируем строчку, помеченную //DECOMENT THIS AND PROG WILL WORK И опять проверяем
LD_PRELOAD=./libdltest.so chromium-browser

Using PPAPI flash.
--disable-new-tab-first-run --enable-user-scripts --ppapi-flash-path=/usr/lib/adobe-flashplugin/libpepflashplayer.so --ppapi-flash-version=
DLSYM dlopen 0xffffffffffffffff res = 0x7fb079af2f70 res1 = 0x7fb079af2f70
DLOPEN liblttng-ust-tracepoint.so.0 res = 0x0
DLOPEN liblttng-ust-tracepoint.so.0 res = 0x0
DLSYM dlopen 0xffffffffffffffff res = 0x7f6c2d6baf70 res1 = 0x7f6c2d6baf70
DLOPEN liblttng-ust-tracepoint.so.0 res = 0x0
DLOPEN liblttng-ust-tracepoint.so.0 res = 0x0
DLOPEN /usr/lib/chromium-browser/libwidevinecdmadapter.so res = 0x5587d9ed3510
DLOPEN /usr/lib/adobe-flashplugin/libpepflashplayer.so res = 0x5587d9ed4640
DLOPEN /usr/lib/chromium-browser/libwidevinecdm.so res = 0x5587d9ed4190
DLOPEN libgdk-3.so.0 res = 0x7fb07b243000
DLSYM gdk_set_allowed_backends 0x7fb07b243000 res = 0x7fb0748c93d0 res1 = 0x7fb0748c93d0
DLOPEN (null) res = 0x7fb07b278168
DLSYM gtk_progress_get_type 0x7fb07b278168 res = 0x0 res1 = 0x0
DLOPEN libgail.so res = 0x0
DLSYM gtk_progress_get_type 0x7fb07b278168 res = 0x0 res1 = 0x0
DLOPEN libatk-bridge.so res = 0x0
DLSYM gtk_progress_get_type 0x7fb07b278168 res = 0x0 res1 = 0x0
DLOPEN /usr/lib/x86_64-linux-gnu/gio/modules/libgvfsdbus.so res = 0x558143a37180
DLSYM g_module_check_init 0x558143a37180 res = 0x0 res1 = 0x0
DLSYM g_module_unload 0x558143a37180 res = 0x0 res1 = 0x0
DLSYM g_io_module_load 0x558143a37180 res = 0x7fb06a1b7e20 res1 = 0x7fb06a1b7e20
DLSYM g_io_module_unload 0x558143a37180 res = 0x7fb06a1b7f70 res1 = 0x7fb06a1b7f70
DLOPEN /usr/lib/x86_64-linux-gnu/gio/modules/libgiognomeproxy.so res = 0x558143a38c00
DLSYM g_module_check_init 0x558143a38c00 res = 0x0 res1 = 0x0

#Дальше длинный лог, а за ним нормальный запуск хрома....
Тоесть записав результат true_dlsym в никуда мы получили совсем другое выполнение программы, хотя res и res1 ничем не отличаются... Получается, что dlsym имеет какойто сайдэффект, связанный с регионом памяти, в которой она находится??? Подскажите. как такое может быть? Как gtk связан с libdl? Почему такое происходит только в хроме?

 , ,

cyber_eagle ()

Как объяснить gcc, что мне нужен ELF типа EXEC, а не DYN?

Собираю бинарник в режиме freestanding. (Исполняемые файлы для моего pet project — мелкой самописной ОС). В заголовок файла записывается тип DYN, а должен быть — EXEC.

Команда для сборки такая:

gcc -m32 -O2 -march=pentium -pipe -fno-omit-frame-pointer -fno-strict-aliasing -ffreestanding -fno-stack-protector -Wall -W -Wshadow -Wcast-align -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wmissing-format-attribute -Wredundant-decls -nostdinc -nostdlib -Wl,--warn-common,-X,--oformat,elf32-i386 [дальше куча файлов .o и .a] -o login

Несколько версий GCC назад всё работало как надо. Не пойму, что ему не нравится. Единственная разница в конфигурации (кроме версии ПО) в том, что раньше собирал нативным 32-битным компилятором, а сейчас кросскомпилирую с x86_64.

Было:

Заголовок ELF:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Класс:                             ELF32
  Данные:                            дополнение до 2, от младшего к старшему
  Версия:                            1 (current)
  OS/ABI:                            UNIX - System V
  Версия ABI:                        0
  Тип:                               EXEC (Исполняемый файл)
  Машина:                            Intel 80386
  Версия:                            0x1
  Адрес точки входа:                 0x8048cd0
  Начало заголовков программы:       52 (байт в файле)
  Начало заголовков раздела:         6940 (байт в файле)
  Флаги:                             0x0
  Размер этого заголовка:            52 (байт)
  Размер заголовков программы:       32 (байт)
  Число заголовков программы:        7
  Размер заголовков раздела:         40 (байт)
  Число заголовков раздела:          18
  Индекс табл. строк загол. раздела: 17

Стало:

Заголовок ELF:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Класс:                             ELF32
  Данные:                            дополнение до 2, от младшего к старшему
  Версия:                            1 (current)
  OS/ABI:                            UNIX - System V
  Версия ABI:                        0
  Тип:                               DYN (Совм. исп. объектный файл)
  Машина:                            Intel 80386
  Версия:                            0x1
  Адрес точки входа:                 0x1080
  Начало заголовков программы:       52 (байт в файле)
  Начало заголовков раздела:         8532 (байт в файле)
  Флаги:                             0x0
  Размер этого заголовка:            52 (байт)
  Размер заголовков программы:       32 (байт)
  Число заголовков программы:        9
  Размер заголовков раздела:         40 (байт)
  Число заголовков раздела:          18
  Индекс табл. строк загол. раздела: 17

Версия gcc — 7.2.0, версия LD — 2.29. Какае версии были раньше уже не вспомню (2012-й год это был).

 , ,

Deleted ()

Размер elf программы отличается на много, хотя..

Здравствуйте, вопрос к знатокам. Есть программка elf файл, Только вот когда устанавливал пакет rpm, программа весила около 30мб., Нашел кракнутый «отдельный» файл той же программы в инете , он весит всего на всего 7 мб, как такое может быть объясните, программа работает с меньшим файлом на ура 0_о

 

Rubi ()

Скрыть «внутренние символы» в статической библиотеке

Допустим, есть некая библиотека, использующая внутри себя патченный libcrypto. Если бы речь шла о динамической библиотеке, все просто: компилируем libcrypto с PIC, линкуемся с шаренной библиотекой, скрывая ненужные символы через linker script. А если такой же трюк требует провернуть для статической библиотеки?

Пример для наглядности: берем SHA1_Init(SHA_CTX *c), добавляем ей какой-нибудь параметр int SHA1_Init(SHA_CTX *c, int param), собираем libcrypto.a ну и свою libyoba.a. Далее, если положить все (или только нужные) объектные файлы или libcrypto.a в libyoba.a, то при линковке с yoba с приложением, использующим SHA1_Init, в зависимости от порядка -lyoba -lcrypto, все результирущее приложение получит либо патченный SHA1_Init, либо его оригинальную версию. А хотелось бы, чтобы патченный SHA1_Init оставался исключительно внутри libyoba.a.

Понимаю, что это решается банальным переименованием, но уж больно много всего переименовывать в libcrypto придется.

 

kawaii_neko ()

Как заставить статический ELF файл грузить LD_PRELOAD

Здравствуйте!

Такая проблема, имею статический бинарник без исходов, мне надо заставить его грузить LD_PRELOAD либу, но так как этот бинарник скомпилирован статически, сегменты .dynamiс, секции .dymsym и так далее отсутствуют понятно что LD_PRELOAD игнорится при запуске.

И вот теперь вопрос, как же заставить его все таки загрузить LD_PRELOAD либу? Сразу подумал, что проще всего отредактировать ELF заголовки и добавить фейковый динамический сегмент и секции, чтобы лоадер подумал, что это динамический бинарник, уже третий день с утра до ночи пытаюсь найти рабочий софт, который смог бы такое сделать, как я знаю надо юзать elfsh, но никак не пойму как заставить его работать, документации очень мало, может кто помочь?

Надо сделать фейковые записи в elf, чтобы подгружался лоадер. Или может есть другие способы? Инжект пробовал, используя ptrace, только вот такие инжекты юзают dlopen, а его то нету, libc не грузится, да и вообще не то это.

p.s. я знаю, что в LD_PRELOAD нету смысла перехватывать динамические функции, я не для этого хочу загрузить свою либу

 , ,

Hippey ()

system(linux binary) из под wine

Возможно ли запустить линуксовую программу из под вайна?

 ,

steemandlinux ()

Если мы запускаем бинарь N раз, он N раз целиком загружается память (Y/N)?

Сабж. Линукс. Уясняю для себя. Есть жирный статический бинарь (несколько десятков мегабайт). Если он запускается N раз и работает одновременно над разными задачами, образ файла (секции кода и данных) N раз дублируются в оперативной памяти?

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

 ,

Andrey_Utkin ()

Хранятся ли где-то в бинарнике адреса функций?

Собственно, глядя на выхлоп objdump с ключем --disassemble увидел что оно все функции выделяет в отдельные блоки и даже подписывает их имена (даже после того, как я перенес бинарник подальше от исходников). Собственно, это просто внутренняя магия самой программы или эта инфа (или хотя бы ее часть) где-то хранятся?

Пы.Сы. Собственно, нужно это мне для однозначной идентификации приложений, чтобы можно было распознать их, даже если их переименуют. Но это так. Мало ли, вдруг есть менее извращенный способ и кто-то подскажет.

 , ,

Mizantrop_LoL ()