C 从exe文件确定变量的值

C 从exe文件确定变量的值,c,programming-languages,executable,reverse-engineering,exe,C,Programming Languages,Executable,Reverse Engineering,Exe,假设我有一个打印变量值的程序。让我们将该变量命名为“i”。二进制文件的格式为“.exe”。如何确定“i”的值,并了解特定值是来自“.exe”格式的变量“i”的值?这取决于该变量是局部变量还是全局变量。如果它是全局的,那么使用正确的工具就很容易了,我不能推荐任何特定的工具,因为我使用Linux。您可以在符号表中找到符号i的位置,这将显示“i”的位置。如果你想知道它包含什么值,那么,你只能看到它的初始值,而不是运行时的值,因为你看到的是exe文件,而不是程序的运行图像。如果未初始化,则无法看到其初始

假设我有一个打印变量值的程序。让我们将该变量命名为“i”。二进制文件的格式为“.exe”。如何确定“i”的值,并了解特定值是来自“.exe”格式的变量“i”的值?

这取决于该变量是局部变量还是全局变量。如果它是全局的,那么使用正确的工具就很容易了,我不能推荐任何特定的工具,因为我使用Linux。您可以在符号表中找到符号i的位置,这将显示“i”的位置。如果你想知道它包含什么值,那么,你只能看到它的初始值,而不是运行时的值,因为你看到的是exe文件,而不是程序的运行图像。如果未初始化,则无法看到其初始值;否则,它的初始值可能会在值位置旁边的工具中以十六进制显示,因此您必须对其进行解码

如果它是一个局部变量,那么情况就不同了。该变量根本没有名称,因为编译程序时会丢失局部变量名称。在函数执行期间,它可能只占据堆栈上的一个位置。例如,第一个变量通常位于-8%ebp中,第二个变量位于-12%ebp中,等等。4%ebp和0%ebp是特殊的。因此,如果您在汇编代码中查找exe,那么-8%ebp很可能会引用函数中的第一个局部变量。同样,您无法知道它有什么值,因为您正在静态地查看exe。所有这些都取决于所使用的编译器,以及它所设置的优化级别


抱歉,没有提供任何特定的工具。我假设您可以访问一些反编译工具,这些工具将向您显示汇编代码和符号表。

这取决于变量是局部变量还是全局变量。如果它是全局的,那么使用正确的工具就很容易了,我不能推荐任何特定的工具,因为我使用Linux。您可以在符号表中找到符号i的位置,这将显示“i”的位置。如果你想知道它包含什么值,那么,你只能看到它的初始值,而不是运行时的值,因为你看到的是exe文件,而不是程序的运行图像。如果未初始化,则无法看到其初始值;否则,它的初始值可能会在值位置旁边的工具中以十六进制显示,因此您必须对其进行解码

如果它是一个局部变量,那么情况就不同了。该变量根本没有名称,因为编译程序时会丢失局部变量名称。在函数执行期间,它可能只占据堆栈上的一个位置。例如,第一个变量通常位于-8%ebp中,第二个变量位于-12%ebp中,等等。4%ebp和0%ebp是特殊的。因此,如果您在汇编代码中查找exe,那么-8%ebp很可能会引用函数中的第一个局部变量。同样,您无法知道它有什么值,因为您正在静态地查看exe。所有这些都取决于所使用的编译器,以及它所设置的优化级别


抱歉,没有提供任何特定的工具。我假设您可以访问一些反编译工具,这些工具将向您显示汇编代码和符号表。

有专门针对游戏玩家的工具。基本上,它们能够监视和修改另一个进程的全局变量。@ruslik,但它们通常用于特定的游戏。我见过一些通用程序,可以让您在程序中搜索值并修改它们:和,但它们都适用于Windows。@mgiuca您所说的很好。但是,我想知道GDB是如何从可执行文件中获取局部变量名的?@user1218927:使用-g构建的可执行文件包括调试符号表,其中包括堆栈地址到局部变量名的映射。因此,如果您有这样一个可执行文件,那么像GDB这样的调试工具可以为您提供有关正在处理的函数、变量和行号的大量信息。但这些符号通常在二进制文件发布时被去除,这既是出于大小的原因,有时也是为了阻碍反向工程的尝试而进行的混淆。游戏玩家有专门的工具。基本上,它们能够监视和修改另一个进程的全局变量。@ruslik,但它们通常用于特定的游戏。我见过一些通用程序,可以让您在程序中搜索值并修改它们:和,但它们都适用于Windows。@mgiuca您所说的很好。但是,我想知道GDB是如何从可执行文件中获取局部变量名的?@user1218927:使用-g构建的可执行文件包括调试符号表,其中包括堆栈地址到局部变量名的映射。所以如果你有这样一个可执行文件,一个调试工具 像GDB一样,它可以为您提供大量有关正在处理的函数、变量和行号的信息。但这些符号通常在二进制文件发布时被去除,这既是出于大小的原因,有时也是出于阻碍反向工程尝试的混淆。