Запись бинарных данных в секцию ELF |
[исправить] |
Стоит задача - в программе запрятать бинарные данные. Допустим архив.
Создаём файл data.cpp для включения запланированных для добавления данных:
volatile char a[DATASIZE] __attribute__((section(".her"))) = {0xfa};
Таким образом мы обозначаем намерения создать переменную в отдельной секции.
Далее компилируем data.cpp в object-файл data.o:
g++ -c -g data.cpp
Смотрим shed-адрес секции. И производим заливку согласно предустановленному
размеру переменной "a". На моём компьютере это выглядит так:
dd if=out.tar of=data.o bs=1 count= seek=52 conv=notrunc
Архив, либо бинарник конечно предварительно может быть зашифрован, дабы
избежать лишних посягательств. Дальнейшую сборку программы можно сделать Make
файлом, но я решил написать командами для наглядности процесса:
g++ -c -g main.cpp
g++ -g -o test main.o data.o
Альтернативный вариант от посетителя maneken:
__asm(
".global data_file\n"
".global _data_file\n"
"data_file:\n"
"_data_file:\n"
".incbin \"data.zip\"\n"
".global data_file_len\n"
".global _data_file_len\n"
"data_file_len:\n"
"_data_file_len:\n"
".int .-data_file \n"
);
extern void * data_file;
extern void * data_file_len;
unsigned char * data =(unsigned char *)&data_file;
int * datalen =(int *) &data_file_len;
|
|
|
|
Раздел: Корень / Программисту и web-разработчику / C/C++, сборка, отладка |
1.2, maneken (?), 05:49, 20/01/2016 [ответить]
| +/– |
А так чем плохо? Ничего дополнительно делать не надо.
__asm(
".global data_file\n"
".global _data_file\n"
"data_file:\n"
"_data_file:\n"
".incbin \"data.zip\"\n"
".global data_file_len\n"
".global _data_file_len\n"
"data_file_len:\n"
"_data_file_len:\n"
".int .-data_file \n"
);
extern void * data_file;
extern void * data_file_len;
unsigned char * data =(unsigned char *)&data_file;
int * datalen =(int *) &data_file_len;
| |
|
|
3.6, a (??), 18:17, 20/01/2016 [^] [^^] [^^^] [ответить]
| +/– |
Делается один раз:
dd bs=10m count=1 if=/dev/random of=random.bin
1+0 records in
1+0 records out
10485760 bytes transferred in 0.636338 secs (16478287 bytes/sec)
time xxd -i random.bin > random.c
real 0m1.997s
user 0m1.935s
sys 0m0.057s
time gcc -c random.c
real 0m9.414s
user 0m8.947s
sys 0m0.350s
| |
|
|
1.7, Аноним (-), 23:23, 24/01/2016 [ответить]
| +1 +/– |
А не проще volatile char a[DATASIZE] = {бинарь}?
| |
|
2.8, Andrey Mitrofanov (?), 10:05, 25/01/2016 [^] [^^] [^^^] [ответить]
| +/– |
> А не проще volatile char a[DATASIZE] = {бинарь}?
Двоичные патчОры ещё не открыли для себя генерацию программ, здесь - хексов в Си. Бинарное программирование оно такое -- сложное и малодоступное.
| |
|
|