Assembly x86中变量的大小

Assembly x86中变量的大小,assembly,disassembly,Assembly,Disassembly,编译后,C文件中定义的变量的大小在代码的等效程序集中出现在哪里 假设您的第一个代码是: char buffer[2]; char a[3]; char buffer[3]; char a[2]; 您的下一个代码是: char buffer[2]; char a[3]; char buffer[3]; char a[2]; 其中“buffer”和“a”是函数的局部变量 在这两种情况下,当您输入函数时,esp将减少相同的字节数,但是如果您没有访问源代码的权限,并且您只是在反汇编二进制文件,是

编译后,C文件中定义的变量的大小在代码的等效程序集中出现在哪里

假设您的第一个代码是:

char buffer[2];
char a[3];
char buffer[3];
char a[2];
您的下一个代码是:

char buffer[2];
char a[3];
char buffer[3];
char a[2];
其中“buffer”和“a”是函数的局部变量

在这两种情况下,当您输入函数时,
esp
将减少相同的字节数,但是如果您没有访问源代码的权限,并且您只是在反汇编二进制文件,是否有办法区分边界


我想知道二进制文件中是否有一个段跟踪变量的大小。

据我所知,在这种情况下,唯一的判断方法是查看堆栈是如何使用的

一旦将代码编译成汇编,类型信息就不会真正保留,唯一可以推断的是所使用的汇编指令的类型(无论它们是对位、字、双字等进行操作)

IDA Pro有一个反汇编到C的功能,通常是最准确的,它在大多数情况下不会减少到使用C,但在ASM的快速分析方面非常强大。它所做的一件事是找出数组的大小,但是很多时候它只会将它们键入字节(或字符)数组,您可能需要分析代码以查看它是如何准确使用的

我想知道二进制文件中是否有跟踪变量大小的段

不,没有


最多可以找到变量的相对偏移量以及分配的总堆栈。

通常将其放在单独的文件中(或者更常见的情况是:无处放置),但类似的调试信息可能保存在二进制文件中。显然,您不能依赖于此,但如果您可以控制二进制文件的生成,您可以安排信息在那里。

没有办法确定边界,但有一种软件可以显式添加边界标记以进行溢出检测。例如,VisualStudio有这个选项IIRC,如果它检测到“保护字节”被覆盖,就会中断调试器。这种事情不是只有在使用调试模式编译代码时才会出现吗?为了高效的CPU和内存使用,当代码被编译为“发布”时,很多东西会被抛出。我假设在编译源代码时堆栈金丝雀被禁用,我只是在玩二进制文件。是的,这是一个只调试的功能。在我考虑的应用程序中,我无法控制源代码的编译方式,也没有可用的调试信息,只有reloc信息。@Afshin那么数据就不存在了。你只能从它的使用方式来推断它。