很少有汇编语法问题和反汇编代码的解释



我正在尝试对可执行文件进行逆向工程,以完成某些练习/挑战。

我在 IDA64 反汇编器中打开了该文件。大多数代码是隐藏的,但三个子例程是可见的(包括开始(。我在组装方面的主要经验是在学校使用MIPS - 所以我有几件事让我感到困惑:

  1. 这行是什么意思? ebx 地址处的值是 0 还是只是它的第一个字节?

    mov     byte ptr [ebx], 0
    
  2. 当我看到这两行代码时,地址"1000h"是什么?含义 - 我在哪里可以找到它,里面有什么?IDA 中的所有代码从 401000 开始。

    mov     ebx, 1000h
    xor     [ebx], eax
    
  3. 是否有关于 eax、ebx 和 esi 寄存器的约定,我应该在代码开头假设它们有什么?可执行文件要求用户输入 - 我可以假设此输入在任何特定的寄存器中吗?

x86架构是典型的CISC架构,它可以执行不同大小的存储。
mov [ebx], 0不明确(使用哪种大小?(,但mov byte [ebx], 0将大小固定为 8 位。
ptr只是一个修饰,因此指令读起来几乎是自我记录的:移动到ebx零指向的字节
这也解释了指令的语义,互联网上有很多关于 x86 寻址模式的教程。
我拿起了第一个。

1000h是一个奇怪的地址,它可能在进程的工作集之外,它也是.text部分的典型RVA(相对虚拟地址(。
这让我认为有一个重新定位条目指向该指令的操作数。
IDA 免费无法调试,但 x64dbg 可以,请尝试调试程序以查看地址是否变成类似BASE_ADDRESS + 1000h.
加载后,IDA 将显示 PE 部分的静态视图,因此您可以检查全局变量的初始值,但要查看内存的实时视图,您必须调试程序。

正式地,在PE入口点,寄存器具有未定义的值,但由于执行在用户模式库中开始,因此某些值泄漏,尽管这不是可靠的ABI。
编译器和 API 使用了一些调用约定,您应该对此进行自定义。
每个编译器也将有其典型的寄存器分配算法,但这可能太复杂而无法展示模式,而是在非常简单的例程中。输入
值可能会在某个时候出现在某个寄存器中,但找到时间和地点是最困难的部分。
通过研究应用程序行为,您可以写下一组可能的输入 API,程序将使用并破坏其中的每一个。
返回到程序代码后,您将拥有输入字符串(IO 是基于字符串的(。 或者,您从一开始就对应用程序进行逆向工程,训练有素的分析师可以轻松找到WinMain,如果程序没有混淆或用非常抽象的语言编写,它将很快找到读取输入的位置。
第三种方法是使用非常接近原始技术编写一个精简的孪生应用程序,然后分析后者。
这样,您也有一个源代码来克服反汇编的迷雾。

最新更新