这段代码如何能够使用堆栈?

逆向工程 部件 x64dbg
2021-07-03 11:06:22

我正在尝试对软件进行逆向工程,以按我的预期扩展其功能。所以我没有源代码。无论如何,我习惯于看到像下面这样开头的代码,并且我很清楚那里实际发生了什么。

push ebp
mov ebp,esp
sub esp,10h

但是当我看到下面这个样子时,我的担忧就来了

mov edi,dword ptr [0E9A474h];
imul eax,dword ptr [edi+5AF4h],70h;
cmp dword ptr [ebp+eax-35DCh],0h;
je some_location

并且函数的序言没有这样的指令

sub esp,10h

至少我可以知道函数用于局部变量存储的堆栈的大小。

额外的问题是:

  1. 就汇编语言而言,这是一个好的编程吗?
  2. 这个函数和另一个函数之间会不会在内存中发生冲突?
  3. 是否有可能知道这个函数在堆栈中的限制?无论是大小
1个回答

函数序言(push ebp等)在汇编中很常见,但不是必需的。ebp通常用于本地变量访问,但也可以用作通用寄存器,就像eax.

汇编允许代码在任何地方操作堆栈指针,并且不强制它遵循任何约定——只要没有异常,CPU 不会关心;它只会执行eip寄存器指向的指令只要您的程序有足够的权限,它就不会阻止您访问(甚至修改)其他函数的内存。我认为这回答了你的前两个问题。

关于你的第三个问题,一般来说是不可能的。然而,通常情况下,你可以看一下修改的指令esp(如pushpop等),并从中推断出它。如果您向我们展示了整个函数,则在这种特殊情况下更容易判断大小。

事实上,您与我们共享的指令似乎没有访问该函数或任何其他函数的局部变量。我不知道存储在ediebp寄存器中的值是什么,但我猜它们指向堆上一些动态分配的数据。