簡體   English   中英

cryoPID如何創建ELF標頭,或者有簡單的方法生成ELF?

[英]How does cryoPID create ELF headers or is there an easy way for ELF generation?

我正在嘗試在C語言中執行檢查點/重新啟動程序,並且正在研究cryoPID的代碼,以了解如何重新啟動進程。 在代碼中,cryoPID創建了要在使用某些全局變量的函數中重新啟動的進程的ELF標頭,這確實令人困惑。

我一直在尋找一種簡單的方法來創建ELF可執行文件,甚至嘗試使用libelf,但我發現大多數時候這些程序的文檔中有些必要的信息是含糊的,我無法理解該怎么做。 因此,在這方面的任何幫助都將是巨大的。

看到cryoPID的代碼,我看到它以一種簡單的方式完成了整個創建過程,而不必設置所有標頭字段,等等。但是我似乎無法理解它使用的代碼。 首先,在創建ELF的函數中,以下代碼是相關的(在arch-x86_64 / elfwriter.c中):

Elf64_Ehdr *e;
Elf64_Shdr *s;
Elf64_Phdr *p;
char* strtab;
int i, j;
int got_it;
unsigned long cur_brk = 0;
e = (Elf64_Ehdr*)stub_start;

assert(e->e_shoff != 0);
assert(e->e_shentsize == sizeof(Elf64_Shdr));
assert(e->e_shstrndx != SHN_UNDEF);

s = (Elf64_Shdr*)(stub_start+(e->e_shoff+(e->e_shstrndx*e->e_shentsize)));
strtab = stub_start+s->sh_offset;

stub_start是在cryopid.h中由宏clarify_writer定義的全局變量:

#define declare_writer(s, x, desc) \
    extern char *_binary_stub_##s##_start; \
    extern int _binary_stub_##s##_size; \
    struct stream_ops *stream_ops = &x; \
    char *stub_start = (char*)&_binary_stub_##s##_start; \
    long stub_size = (long)&_binary_stub_##s##_size

在writer _ *。c中使用此宏,這些文件是實現文件編寫器的文件。 例如,在writer_buffered.c中,使用以下代碼調用宏:

struct stream_ops buf_ops = {
    .init = buf_init,
    .read = buf_read,
    .write = buf_write,
    .finish = buf_finish,
    .ftell = buf_ftell,
    .dup2 = buf_dup2,
};
declare_writer(buffered, buf_ops, "Writes an output file with buffering");

因此,將stub_start聲明為未初始化的全局變量(上面的代碼不在任何函數中),並且看到在clarify_writer中的所有變量均未在代碼的任何其他部分設置,因此我假設stub_start只是指向的一部分。 bss部分,但似乎cryoPID就像指向自己的ELF標頭一樣使用它。

任何人都可以幫助我解決此問題,或以任何方式幫助我輕松創建ELF標頭嗎?

如評論中所述,它使用類似於objcopy的方式來設置這些變量(它不使用objcopy命令,但我認為可能是“設置”變量的自定義鏈接器)。 不能完全找到什么,但是我可以通過mmap'先前編譯的可執行文件並使用該映射設置變量stub_start和stub_size來重現此行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM