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

时间:2018-08-19 06:24:11

标签: assembly x86 masm disassembly intel-syntax

在某些练习/挑战中,我试图对可执行文件进行反向工程。

我在IDA64反汇编程序中打开了文件。大多数代码是隐藏的,但是三个子例程可见(包括“开始”)。我在组装方面的主要经验是在学校里使用MIPS-因此,我感到有些困惑:

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

正式地,在PE入口点,寄存器具有未定义的值,但是由于执行是在用户模式库some values leak, though this is not a reliable ABI中开始的。
编译器和API使用了a few calling conventions,您应该习惯于此。
每个编译器还将具有其典型的寄存器分配算法,但这可能太复杂,以至于无法通过一种非常简单的例程来表现出模式。
输入值可能会在某些时候在某个寄存器中,但是找到何时何地是最困难的部分。
通过研究应用程序的行为,您可以写下该程序将使用的一组可能的输入API,并破坏其中的每个API。
返回程序代码后,您将拥有输入字符串(IO基于字符串)。 或者,您从一开始就对应用程序进行反向工程,经过培训的分析师可以很容易地找到WinMain,并且如果程序没有被混淆或使用非常抽象的语言编写,则可以快速找到输入的位置阅读。
第三种方法是使用与原始应用程序非常接近的技术编写精简的孪生应用程序,然后进行分析。
这样,您还可以获得可以消除反汇编的源代码。