Assembly 几个汇编语法问题和反汇编代码的解释

Assembly 几个汇编语法问题和反汇编代码的解释,assembly,x86,masm,disassembly,intel-syntax,Assembly,X86,Masm,Disassembly,Intel Syntax,我正在尝试对一个可执行文件进行反向工程,这是一些练习/挑战的一部分 我在IDA64反汇编程序中打开了该文件。大部分代码都是隐藏的,但有三个子例程(包括Start)是可见的。我在组装方面的主要经验是在学校使用MIPS,因此我有几件事让我感到困惑: 这条线是什么意思?ebx地址的值是0还是它的第一个字节 mov byte ptr [ebx], 0 当我看到这两行代码时,地址“1000h”是什么?意思-我在哪里可以找到它,里面有什么?IDA中的所有代码从401000开始 mov e

我正在尝试对一个可执行文件进行反向工程,这是一些练习/挑战的一部分

我在IDA64反汇编程序中打开了该文件。大部分代码都是隐藏的,但有三个子例程(包括Start)是可见的。我在组装方面的主要经验是在学校使用MIPS,因此我有几件事让我感到困惑:

  • 这条线是什么意思?ebx地址的值是0还是它的第一个字节

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

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


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

    1000h
    是一个奇怪的地址,它可能在进程的工作集之外,并且它也是
    .text
    部分的典型RVA(相对虚拟地址)。
    这使我认为有一个重定位项指向该指令的操作数。
    IDA free无法调试,但可以,请尝试调试程序,查看地址是否变成类似于
    BASE\u address+1000h

    加载后,IDA将向您显示PE节的静态视图,因此您可以检查全局变量的初始值,但要查看内存的实时视图,您必须调试程序

    正式地说,在PE入口点,寄存器具有未定义的值,但由于在用户模式库中开始执行,。
    编译器和API都会使用它们,您应该习惯于使用它们。
    每个编译器也会有其典型的寄存器分配算法,但这可能过于复杂,无法显示模式,而是在非常简单的例程中。
    输入值可能会在某个点的某个寄存器中,但查找何时何地是最难的部分。
    通过研究应用程序的行为,您可以写下一组可能的输入API,程序将使用这些API并在每一个API上中断。
    返回程序代码后,您将获得输入字符串(IO是基于字符串的)。 或者,您可以从一开始就对应用程序进行反向工程,经过培训的分析员可以很容易地找到
    WinMain
    ,如果程序没有被混淆或用非常抽象的语言编写,它将很快找到读取输入的位置。
    第三种方法是使用与原始应用非常接近的技术编写精简的twin应用程序,然后分析后者。

    通过这种方式,您还可以获得一个源代码来克服反汇编的迷雾

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

    1000h
    是一个奇怪的地址,它可能在进程的工作集之外,并且它也是
    .text
    部分的典型RVA(相对虚拟地址)。
    这使我认为有一个重定位项指向该指令的操作数。
    IDA free无法调试,但可以,请尝试调试程序,查看地址是否变成类似于
    BASE\u address+1000h

    加载后,IDA将向您显示PE节的静态视图,因此您可以检查全局变量的初始值,但要查看内存的实时视图,您必须调试程序

    正式地说,在PE入口点,寄存器具有未定义的值,但由于在用户模式库中开始执行,。
    编译器和API都会使用它们,您应该习惯于使用它们。
    每个编译器也会有其典型的寄存器分配算法,但这可能过于复杂,无法显示模式,而是在非常简单的例程中。
    输入值可能会在某个点的某个寄存器中,但查找何时何地是最难的部分。
    通过研究应用程序的行为,您可以写下一组可能的输入API,程序将使用这些API并在每一个API上中断。
    返回程序代码后,您将获得输入字符串(IO是基于字符串的)。 或者,您可以从一开始就对应用程序进行反向工程,经过培训的分析员可以很容易地找到
    WinMain
    ,如果程序没有被混淆或用非常抽象的语言编写,它将很快找到读取输入的位置。
    第三种方法是使用与原始应用非常接近的技术编写精简的twin应用程序,然后分析后者。
    通过这种方式,您还可以获得一个源代码来克服反汇编的迷雾

    甚至不要试图“猜测”汇编的任何内容,这没有任何意义(它的语法没有那么“逻辑”,它不是为progr.设计的progr.语言,而是为描述CPU硬件功能而设计的助记符,它遵循“硬件设计”逻辑)。你可以先做一些教程或阅读一些书来获得基本知识