如何将标记插入到 C 代码中,以便它出现在 .elf 文件中?
How to insert marker into c code so that it appear in .elf file?
我想检查 .elf 文件是从特定代码还是从其他代码构建的
有没有办法在 C 上写一些东西,以便通过查看二进制 elf 文件来识别它?
好吧,我想您可以在代码中插入一个文字字符串。如果您实际上不使用此字符串,编译器可能会决定在优化期间将其删除,因此也许您可以尝试这样的操作:
#include <stdio.h>
int main(int argc, char *argv[]) {
char *id_string = "MARKER";
if (argc < 0) { // (never true)
puts(id_string);
}
return 0;
}
找到适合我的解决方案:
static const char MARKER[] __attribute__((used)) = "A_A_A_A";
您可以使用db
(或.byte
)声明。
__asm {
db 0x00 0x01 0x02
}
不要忘记跳过这段代码。
为什么要把事情复杂化?将东西插入 ELF 二进制文件的方法是通过声明全局变量和非静态函数。无需使用字符串和其他类似工具不可靠地挖掘二进制文件,也无需挖掘可能由某些东西意外生成的幻数。
int this_is_my_marker;
符号table中会出现一个名为this_is_my_marker
的符号。
这当然假设您使用的是一个相对健全的系统,该系统具有动态库和 unixy 语义(ELF 几乎暗示了这一点)。默认情况下所有全局 variables/functions 最终都在符号 table 中的原因是动态库从主程序解析符号是合法的。由于这几乎已经完成了,所以有人会在没有这样做的情况下发明一个 unixy 操作系统的风险很小。 (这也是 gcc 有那些奇怪的 -fvisibility
标志的原因)
我想检查 .elf 文件是从特定代码还是从其他代码构建的
有没有办法在 C 上写一些东西,以便通过查看二进制 elf 文件来识别它?
好吧,我想您可以在代码中插入一个文字字符串。如果您实际上不使用此字符串,编译器可能会决定在优化期间将其删除,因此也许您可以尝试这样的操作:
#include <stdio.h>
int main(int argc, char *argv[]) {
char *id_string = "MARKER";
if (argc < 0) { // (never true)
puts(id_string);
}
return 0;
}
找到适合我的解决方案:
static const char MARKER[] __attribute__((used)) = "A_A_A_A";
您可以使用db
(或.byte
)声明。
__asm {
db 0x00 0x01 0x02
}
不要忘记跳过这段代码。
为什么要把事情复杂化?将东西插入 ELF 二进制文件的方法是通过声明全局变量和非静态函数。无需使用字符串和其他类似工具不可靠地挖掘二进制文件,也无需挖掘可能由某些东西意外生成的幻数。
int this_is_my_marker;
符号table中会出现一个名为this_is_my_marker
的符号。
这当然假设您使用的是一个相对健全的系统,该系统具有动态库和 unixy 语义(ELF 几乎暗示了这一点)。默认情况下所有全局 variables/functions 最终都在符号 table 中的原因是动态库从主程序解析符号是合法的。由于这几乎已经完成了,所以有人会在没有这样做的情况下发明一个 unixy 操作系统的风险很小。 (这也是 gcc 有那些奇怪的 -fvisibility
标志的原因)