我正在尝试创建一个程序来监控自己的校验和。为此,我试图找到一个可以将校验和放入二进制文件的地方。在检查了布局并检查了一些已编译的可执行文件之后,其中有几个:
前三个地方之一可以用于我的目的吗?我的意思是,理论上,我可以在任何地方写入数据,但这些地方够用吗?也许我在二进制文件中遗漏了一些其他可能的地方。或者我应该退回到只在文件末尾写入校验和?
创建一些全局数组,用它找到.data 部分并在此处写入校验和。现在我不确定是否可以通过查看二进制文件找到指向数组开头的指针;
这很简单,只是不要放入 .data 部分,创建你自己的部分。
$ cat file.c
#include <stdio.h>
__attribute__((__section__("_mydata"),__used__)) volatile char mydata[1024];
int main() {
printf("%s\n", mydata);
}
$ gcc file.c
$ objcopy --update-section _mydata=<(echo -n 'hello') ./a.out && ./a.out
hello
$ objcopy --update-section _mydata=<(echo -n 'world') ./a.out && ./a.out
world
除此之外的所有方法:
创建一些全局数组,用它找到 .data 部分并在此处写入校验和。
调用某种未定义的行为。这些方法可能看起来有效,直到它们不起作用。
我不确定是否可以通过查看二进制文件找到指向数组开头的指针
在未剥离的二进制文件中找到该数组的位置绝对是easy——阅读符号表,找到你的符号的名称,它的地址将就在那里。
您还可以使用
__attribute__((section(...)))
将该数组放置在单独的部分中,即使符号被剥离,也可以从部分标题中找到该部分。
也就是说:
.data
内容将改变校验和(除非你也从校验和计算中排除数组)和