LINUX.ORG.RU

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


0

0

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

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

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

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

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

★★☆

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

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

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

namezys ★★★★ ()

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

#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 ★★★ ()
Ответ на: Re: [Си][баловство] Указатель на код. от Spectr

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

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

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

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

Stahl ★★☆ ()
Ответ на: Re: [Си][баловство] Указатель на код. от Stahl

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

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

да.

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

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

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

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

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

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

Spectr ★★★ ()
Ответ на: Re: [Си][баловство] Указатель на код. от Stahl

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

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

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

const86 ★★★★★ ()
Ответ на: Re: [Си][баловство] Указатель на код. от const86

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

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

LamerOk ★★★★★ ()
Ответ на: Re: [Си][баловство] Указатель на код. от LamerOk

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

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

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

const86 ★★★★★ ()

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

Куайн что ли? На Википедии есть примеры.

Yoda_The_Master ()
Ответ на: Re: [Си][баловство] Указатель на код. от LamerOk

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

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

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

namezys ★★★★ ()
Ответ на: Re: [Си][баловство] Указатель на код. от LamerOk

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

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

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

sf ★★★ ()
Ответ на: Re: [Си][баловство] Указатель на код. от LamerOk

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

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

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

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