Assembly 几个汇编语法问题和反汇编代码的解释
我正在尝试对一个可执行文件进行反向工程,这是一些练习/挑战的一部分 我在IDA64反汇编程序中打开了该文件。大部分代码都是隐藏的,但有三个子例程(包括Start)是可见的。我在组装方面的主要经验是在学校使用MIPS,因此我有几件事让我感到困惑: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
mov byte ptr [ebx], 0
mov ebx, 1000h
xor [ebx], eax
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硬件功能而设计的助记符,它遵循“硬件设计”逻辑)。你可以先做一些教程或阅读一些书来获得基本知识