LINUX.ORG.RU

[Си][баловство] Указатель на код.

 


0

0

Так получилось, что появилось на работе немного свободного времени
и решил я немного побаловаться с Си...

Интересно, как получить указатель на начало исполняемого кода?
И вообще это возможно?

Я с такими штуками сталкивался только на асме и под ДОС.... Там
достаточно всё просто. А тут какбы не реальный режим и всё серьезно?

Основная цель -- заставить бинарик выводить в консоль свой бинарный же
код...

Как вам задачка?

★★☆

Что значит бианрный код?

Можно получить, смотри куда мэпится бинарник и его секции

namezys ★★★★
()

#include <iostream>

#include <stdio.h>

using namespace std;

int main(void) {

int (* fn)(void) = main;

cerr << "...1" << endl;

// (*fn)(); // - to call

unsigned long fn_p = (unsigned long)fn_p;

unsigned char *p = (unsigned char *)fn_p;

for(int i = 0; i < 20; i++)

fprintf(stderr, "0x%02X", p[i]);

cerr << endl;

cerr << "...2" << endl;

return 0;

}

Spectr ★★★
()
Ответ на: комментарий от Spectr

Ну я так понимаю это выведет код, начиная с ф-ции main()?

А ведь никто не гарантирует, что она будет в самом начале?
Или гарантирует?
А зачем тогда понятие "точки входа"?

Или я сильно-сильно туплю?

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

не кто ничего не гарантирует

нет даже гарантии, что тебе дадут его прочитать

namezys ★★★★
()
Ответ на: комментарий от Stahl

> Ну я так понимаю это выведет код, начиная с ф-ции main()?

да.

> А ведь никто не гарантирует, что она будет в самом начале?

она не будет в самом начале - вначале будет пролог для создания глобальных переменных etc.

>А зачем тогда понятие "точки входа"?

для описания поведения глобальных переменных в С, и инициализации этих объектов.

т.е. если совсем уж стартовую точку - то без внешних прог не обойтись, ну или внешних данных.

P.S. а какая практическая польза от этого?

Spectr ★★★
()
Ответ на: комментарий от Stahl

> А ведь никто не гарантирует, что она будет в самом начале?

Что за "начало", о котором мы тут ведём речь? Подозреваю, всё это очень сильно завязано на формат бинарника и ABI. Да и зачем вам это начало нужно? Что вы с ним делать будете? Разве что удовлетворённо созерцать числовое значение указателя на это начало...

const86 ★★★★★
()
Ответ на: комментарий от const86

Это открывает простор для метапрограммирования. Ведь можно будет не только читать, но и писать туда. В итоге получим программу, которая пишет сама себя. Воплощение мечты лиспера на С/С++ ))))

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> Это открывает простор для метапрограммирования.

Да это понятно, вопрос был именно про некое начало. Указатель на произвольную функцию получить - это даже проще, чем на переменную, амперсанд пририсовывать не обязательно... :)

const86 ★★★★★
()
Ответ на: комментарий от LamerOk

А что у нас стало разрешено писться в область кода? Она разве не read and excecute only

> Это открывает простор для метапрограммирования. Ведь можно будет не только читать, но и писать туда. В итоге получим программу, которая пишет сама себя. Воплощение мечты лиспера на С/С++ ))))

namezys ★★★★
()
Ответ на: комментарий от LamerOk

> Это открывает простор для метапрограммирования. Ведь можно будет не только читать, но и писать туда. В итоге получим программу, которая пишет сама себя. Воплощение мечты лиспера на С/С++ ))))

Для кодогенерации хватит mmap с PROT_EXEC на исполнение сделать (заодно и размер тзвестный будет). А .text патчить - последнее дело, которое еще и не везде дадут (RHEL?, non-x86).

sf ★★★
()
Ответ на: комментарий от LamerOk

> Это открывает простор для метапрограммирования. Ведь можно будет не только читать, но и писать туда. В итоге получим программу, которая пишет сама себя. Воплощение мечты лиспера на С/С++ ))))

ТЕМА СИСЕК (C/C++) НЕ РАСКРЫТА!

fmjs
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.