C 如何在内存中查找返回指令

C 如何在内存中查找返回指令,c,debugging,memory,opcode,C,Debugging,Memory,Opcode,我有一些C代码,它调用一个函数。我正在Windows上的visual studio中编译此代码。是否有一种直观的方式来查看返回指令(操作码)和返回地址? 我尝试在VisualStudio中使用内存窗口,但我只看到缓冲区“blie”和一些十六进制解释的内存值。我认为CC可能是一个操作码,但我希望有一种方法/软件可以清楚地查看返回指令和返回地址 #include <stdio.h> #include <stdlib.h> int foo(char *); int main

我有一些C代码,它调用一个函数。我正在Windows上的visual studio中编译此代码。是否有一种直观的方式来查看返回指令(操作码)和返回地址? 我尝试在VisualStudio中使用内存窗口,但我只看到缓冲区“blie”和一些十六进制解释的内存值。我认为CC可能是一个操作码,但我希望有一种方法/软件可以清楚地查看返回指令和返回地址

#include <stdio.h>
#include <stdlib.h>

int foo(char *);

int main(int argc, char *argv[])
{
    if (argc != 1)
        return printf("Supply an argument, dude\n");
    foo(argv[0]);
    return 0;
}

int foo(char *input)
{
    unsigned char buffer[600] = "";

    printf("Adres: %.8X\n", &buffer);
    strcpy(buffer, input);
    return 0;
}
#包括
#包括
int foo(字符*);
int main(int argc,char*argv[])
{
如果(argc!=1)
返回printf(“提供一个参数,dude\n”);
foo(argv[0]);
返回0;
}
int foo(字符*输入)
{
无符号字符缓冲区[600]=“”;
printf(“地址:%.8X\n”、&buffer);
strcpy(缓冲区,输入);
返回0;
}
文件摘录:

RET指令将程序控制从当前正在执行的程序转移 执行(被调用的过程)返回到调用它的过程(被调用的过程) 调用过程)。控制权的转移是通过复制返回来完成的 从堆栈到EIP寄存器的指令指针

正如您所看到的,返回地址在堆栈上,所以在反汇编中无法看到

关于查找返回指令-不容易。很可能您使用的是x86CPU,它是CISC,具有可变长度的操作码(与RISC相比)。这意味着,为了找到任何操作码,您必须首先“查找”之前的所有操作码


顺便说一句:您可以在VS中看到代码的反汇编。

返回地址位于堆栈内存区域(由
rsp
寄存器指向,假设您位于
x86\u 64
),而执行函数返回的代码位于代码内存区域如果要查看返回地址,请在
RET
指令上停止进程,并查看堆栈顶部。


如果只想查看生成的代码,可以使用反汇编程序。在使用Windows时,您可以尝试开源。还有其他选项,例如,您可以在这个问题中查看其他选项的列表:

简言之,不,没有简单的方法。您需要一个完整的反汇编程序。谢谢您@halfr的回复。我在VS中尝试了以下操作:。当我在RET指令下停止时,ESP在00FDF988上。这是否意味着回信地址是00FDF988?如果是这样,我假设它是内存中的一个十六进制值(a1 15 d5 00),这些值如何转换为00FDF988?因为
x86
是一个体系结构,所以与字节在内存中的存储方式相比,必须以“相反”的顺序读取返回地址。在您的示例中,
esp
指向的字节是
a1 15 d5 00
,因此返回地址是00D515A1。