我的问题是 proc 附近是什么意思?

逆向工程 艾达 拆卸 调试
2021-06-14 09:40:04
sub_123434 proc near 
mov esi, [ebp-1Ch] 
sub_123434 endp

proc 附近是什么意思?有人可以解释整个功能吗?

1个回答

至于procendp,从这里开始near可以从这个文档中找到一个很好的解释,它说明如下:

如果过程与调用程序在同一代码段中,则属性为 NEAR;或 FAR 如果在不同的代码段中。

代码的内容是这样的:

mov esi,[ebp-1Ch]

这段代码正在将一个值从堆栈移动到esi寄存器中。根据所使用的编译器和上下文,您可能会从寄存器约定收集其他信息,其中涉及将值移入esi寄存器。更具体地说,请考虑这篇文章中已接受的答案

此外,ebp-(与 相对ebp+)是已传递给函数的参数的典型标志——这些值驻留在堆栈中的内存地址中,只要该特定堆栈帧存在,就可以引用这些值

关于[ebp-1Ch],这是一个指针。在这种情况下,ebp寄存器包含一个内存地址(或者,更具体地说,in 中的值ebp被视为对内存地址的引用而不是文字值),并且-1Ch是该内存地址的偏移量。小写的“h”仅仅是肺炎,意思是“十六进制”,并为此目的,也有时会看到的前缀是0x引用的偏移和/或基于十六进制值,如:[ebp-0x1C]考虑到这一点,您真的可以将其视为[ebp-1C].

难道注意,ebp并且[ebp]是不同的东西。[ebp]意味着里面的值ebp被视为对内存地址的引用。让我们假设里面ebp0xD34DC0DE现在考虑以下几点:

mov esi,ebp
mov esi,[ebp]
mov esi,[ebp-1C]

每一项的结果如下:

mov esi,ebp // esi 现在包含文字值 0xD34DC0DE

mov esi,[ebp] // esi 现在包含内存地址 0xD34DC0DE 中的任何内容

mov esi,[ebp-1C] // esi 现在包含内存地址 0xD34DC0C2(即 0xD34DC0DE - 1C)中的任何内容

总体而言,该子程序看起来除了将数据从堆栈移动到寄存器之外什么也没做。作为一个完全盲目的假设,如果我们假设传递给其各自函数的每个参数都是 4 字节宽,则[ebp-1C]引用传递给这个子程序的父程序的第 8 个参数。在这种情况下,其他感兴趣的值可能驻留在[ebp][ebp-04][ebp-08][ebp-0C][ebp-10][ebp-14],和/或[ebp-18]

最终,我们在这里缺乏上下文来收集您提供的这个函数的目的是什么——不过,同样,上述约定的组合可能会告诉您很多关于 mov 指令可能是什么的一部分。查看调用约定以获得额外的清晰度。您应该能够根据此处的信息推断和研究其余部分。