如何隔离C++;程序是否从文件头的其余数据中删除? 我想观察两个版本的非常基础的C++程序之间编译的OP代码二进制输出的差异。例如,2+2=?,没有调用任何库。我希望编译后的输出是一个二进制操作码的小文件,带有一些小的头,这对于编译后的程序来说是新的,但是有一些大的头

如何隔离C++;程序是否从文件头的其余数据中删除? 我想观察两个版本的非常基础的C++程序之间编译的OP代码二进制输出的差异。例如,2+2=?,没有调用任何库。我希望编译后的输出是一个二进制操作码的小文件,带有一些小的头,这对于编译后的程序来说是新的,但是有一些大的头,c++,binary,g++,C++,Binary,G++,simple.cpp int main() { unsigned int a = 2; unsigned int b = 2; unsigned int c = a + b; } 编译器: g++ -std=c++0x simple.cpp -o simple 是否有一种格式我可以导出到它,它不包含头文件,只包含我们指示机器执行的操作码二进制文件?如果没有,我可以在生成的文件中查找哪些字节或位置来将相关逻辑与程序隔离 我需要的是机器代码,而不是程序集,因为我的项目是对

simple.cpp

int main()
{
    unsigned int a = 2;
    unsigned int b = 2;
    unsigned int c = a + b;
}
编译器:

g++ -std=c++0x simple.cpp -o simple
是否有一种格式我可以导出到它,它不包含头文件,只包含我们指示机器执行的操作码二进制文件?如果没有,我可以在生成的文件中查找哪些字节或位置来将相关逻辑与程序隔离

我需要的是机器代码,而不是程序集,因为我的项目是对源文件的不同模糊版本进行分析,以尝试根据另一个来识别一个。这是一个复杂的主题,其可行性值得怀疑,但这就是为什么我要求隔离机器代码,而不仅仅是程序集,以便根据真正的机器代码输出测试分析

我尝试用谷歌搜索标题结构,但似乎找不到太多信息。

看到后,您会发现可以使用
--oformat=output format
选项指定输出格式

binary
是一种没有标题的格式

然后,您会发现可以使用
-Wl
选项将选项传递给链接器。
-nostlib
选项对于避免添加额外内容也很有用

结合这些,您可以尝试以下命令:

g++ -std=c++0x simple.cpp -nostdlib -Wl,--oformat=binary -o simple

一种快速的方法可能是使用在线编译器,只需查看汇编窗口:@TEDLYNMO离开表格,代码是在一个气隙系统上编写的:3在工作中执行一个辅助项目,而我的具有internet访问权限的机器没有设置为进行编码。
g++-masm=intel-S-std=c++0x simple.cpp-o-
应该显示与您在godbolt中看到的非常类似的内容。请注意,编译器不是愚蠢的1:1翻译机器。一旦打开优化,您的整个
main
将转换为NOOP,因为没有可观察的行为。要么你打开优化,要么你看不到你期望的,要么你看不到,那么你能从你的发现中得出的结论是有限的use@MSalters迷惑者会想加入一些东西,比如死代码来隐藏他们的签名,还有可能是过多的
goto
s,这两者看起来都像是使用优化的编译器,可以很快删除。我不明白你为什么说经过优化的代码不需要混淆。如果攻击者使用有效负载攻击您,并对其进行了优化,而不会造成混淆,那么下次他们尝试攻击时,您将很容易在ID中识别出该有效负载。。优化与模糊处理相反,它使生成的二进制文件更具可预测性,更难进行有意义的更改。难道不需要
-S
吗?@tedlynmo是的。没有它,我实际上得到了很多0填充的缓冲区space@J.Todd好的,我加上了。希望您不介意Mike。@TEDLYNMO程序集源代码(文本)是用选项
-S
输出的,而不是二进制。向后滚动。你是说
-s
(小的
s
)?@MikeCAT哦,不,我一定是误解了这个问题,以为我想要文本。