【发布时间】:2014-11-01 00:50:39
【问题描述】:
我试图弄清楚 agument 是如何实际记录在 c/c++ 程序的编译二进制文件中的。以下是我的程序。我只是想让它尽可能简单
void f(char a,char b){}
int main(){f(12,23);}
为了真正能够“读取”二进制文件,我需要将其转换为某种 ASCII“可表示”形式。我发现了
grep $'\xx' a.out
实际上使用 a.out 作为二进制文件和 xx 作为十进制 ascii 代码。但是 grep 不能告诉我任何事情,因为它只会输出“二进制匹配”。如果我强迫它用'-a'打印出来,它只会打印出所有东西。不过,我可以使用 -c 选项来查看其中有多少:
grep $'\12' b.out (I renamed the file) ==> 4
grep $'\23' b.out ==> 3
但是为了研究一些东西,我需要确切的位置。所以我编写了另一个程序,它基本上打印出符合 char 的 ASCII。
#include<iostream>
using namespace std;
int main(){char c;
while(cin>>c)cout<<(int)c<<' ';}
但是当我运行以下命令时,结果实际上不匹配:
./a.out<./b.out|tr ' ' '\n'|grep -c '^12$' ==> 0
./a.out<./b.out|tr ' ' '\n'|grep -c '^23$' ==> 4
我想知道我在测试程序中写错了什么吗?还是 grep 有某种特殊的机制(比如不是逐字节)?哪一个是正确的?或者有人可以直接给我答案: func(1,2,3,4) 中的“1,2,3,4”如何以二进制形式记录
EDT1 感谢您的建议,我使用“od -tu1”来替换我的测试程序,效果非常好。而且我稍微增强了我的测试程序,这样论点会更明显,数字不会“消失”:
void f(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,int n,int o,int p,int q,int r,int s,int t){a+=b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t;}
int main(){f(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);}
通过更改这些参数并使用“diff”命令,我终于找出了这些数字在二进制文件中的位置:
0002560 68 36 104 19 0 0 0 199 68 36 96 18 0 0 0 199
0002600 68 36 88 17 0 0 0 199 68 36 80 16 0 0 0 199
0002620 68 36 72 15 0 0 0 199 68 36 64 14 0 0 0 199
0002640 68 36 56 13 0 0 0 199 68 36 48 12 0 0 0 199
0002660 68 36 40 11 0 0 0 199 68 36 32 10 0 0 0 199
0002700 68 36 24 9 0 0 0 199 68 36 16 8 0 0 0 199
0002720 68 36 8 7 0 0 0 199 4 36 6 0 0 0 65 185
0002740 5 0 0 0 65 184 4 0 0 0 185 3 0 0 0 186
0002760 2 0 0 0 190 1 0 0 0 191 0 0 0 0 232 234
如你所见,19~9都写得很清楚了。但是从 8 到 0,事情开始以一种无法理解的方式发生变化。数字之间的位移变得越来越小。而且我也不明白它们之间的数字是多少(我明白 0 是“int”部分(小端序?))。这些数字是否代表某种“插件”地址?那么它们根据不同的位置是不同的,它们的长度也不同?
【问题讨论】:
-
你可以编译成汇编器使用:
g++ -S -o prog.s prog.cpp -
有了
cout<<hex;,事情应该会更好…… -
然而确切地数字出现在您的可执行文件中,它们肯定不会以文字文本
"12"和"23"的形式出现。它们将出现在 binary 中(尽管不是00001100),而 GREP 在执行二进制时非常糟糕(它是为纯文本设计的)。即使这样,它也会发现 lots 只出现字节“12”。 -
@Galik,assemble do 看起来很清晰,但我对可执行文件中的实际位置(或结构)更感兴趣
-
“之间的数字”是实际的 CPU 操作码,它们将您的参数移动到进一步处理的位置。将您的普通转储与生成的汇编程序进行比较;一些操作码长 1 个字节(加上参数字节),一些占用更多空间。