零基础x64dbg之32位与64位汇编基础
(编辑:jimmy 日期: 2024/12/26 浏览:3 次 )
上一篇:零基础x64dbg教程大纲
一、前言
看到标题,可能有些人问为什么要学汇编,我们不是来学脱壳破解的么?其实x64dbg中的内存窗口里大部分都是汇编指令,只有掌握了一些汇编基础,才能更好的破解。本课的汇编知识是针对破解的,并未完全是汇编。
二、正文
1、二进制、十进制、十六进制:
二进制:二进制是计算技术中广泛采用的一种数制,由0和1两个数码来表示。进位规则是“逢二进一”,借位规则是“借一当二”。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的,一般在末尾加D表示二进制,如:1110D、0101D等
十进制:十进制数用0、1、2、3.........9 , 这十个数来表示。十进制(计数法)是以10为基础数字系统,满十进一,是我们生活中最常见,也是最常用的。
十六进制:十六进制在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或a~f)表示,其中:A~F表示10~15,这些称作十六进制数,十六进制一位可以对应4位二进制数字,在调试器中,内存地址就是以十六进制表示的。
2、通用寄存器:
32位汇编:
在32位汇编中,通用寄存器包括了8个32位的寄存器:EAX、EBX、ECX、EDX、ESP、EBP、EDI及ESI。其中EAX、EBX、ECX、EDX在一般情况下作为通用的数据寄存器,用来暂时存放计算过程中所用到的操作数、结果或其他信息。
如图:
除此之外,这8个寄存器,还有以下作用:
EAX作为累加器用,所以它是算术运算的主要寄存器。在乘除指令中指定用来存放操作数。另外,所有的I/O指令都使用AX或AL与外部设备传送信息。
EBX在计算存储器地址时,可作为基址寄存器使用。
ECX常用来保存计数值,如移位指令、循环指令和串处理指令中用作隐含的计数器。
EDX在作双字长运算时,可把DX和AX组合在一起存放一个双字长数,DX用来存放高16位数据。此外,对某些I/O操作,DX可用来存放I/O的端口地址。
ESI是源变址寄存器
EDI是目的变址寄存器
ESP称为堆栈指针寄存器,用来指出栈顶的偏移地址。
EBP称为基址指针寄存器,在寻址时作为基地址寄存器使用,但它必须与堆栈段寄存器SS联用来确定堆栈段中的存储单元地址
64位汇编:
在破解中32位汇编与64最大不同就体现在寄存器与内存地址上,32位内存的最大值为0xFFFFFFFF,而64位汇编内存最大值是0xFFFFFFFFFFFFFFFF,此外64位汇编中有16个寄存器,是32位汇编的两倍,这些寄存器分别为:RAX、RBX、RBP、RSP、RSI、RDI、R8、R9、R10、R11、R12、R13、R14、R15,用途与32位汇编的寄存器相似,用来暂时存放计算过程中所用到的操作数、结果或其他信息。
如图:
3、标志寄存器(标志位):
用来记录程序中运行结果的状态信息,它们是根据有关指令的运行结果由(CPU)自动设置的。其中记录的状态信息作为后续条跳转指令的控制条件,称为条件码。
如图:
其中,这8个标志位都有不同的作用:
进位标志——CF:记录运算时最高有效位产生的进位值,这里的进位指二进制的无符号数据。
符号标志——SF:记录运算结果的符号。结果为负时为1,否则为0。
零标志——ZF:运算结果为0时ZF位为1,否则为0。
溢出标志——OF:用于判断溢出(注意:溢出这个概念只对于有符号数据而言,就如同进位只对于无符号数据而言)当OF=0时,说明没有溢出;当OF=1时,说明溢出了。
辅助进位标志——AF:记录运算时第3位产生的进位值。
奇偶标志——PF:用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时为1,否则为0。
定时器溢出标志——TF:当cpu在执行完一条指令后,如果检测到TF位的值为1,则产生单步中断,引发中断过程。通过这个位,就可以在debug中对程序进行单步跟踪。
中断允许标志位——IF:中断允许标志位。当IF=1时,cpu在执行完当前指令后响应中断,引发中断过程;当IF=0时,则不响应可屏蔽中断。
方向标志位——DF:当DF=0时,每次操作后,ESI、EDI递增;DF=1时,每次操作后,ESI、EDI递减。
三. 后记
由于这段时间在忙着制作教程配套的破解工具包,所以耽误了很长时间,教程做的比较匆忙,有什么问题可在下面指出。等做完破解工具包时,我会发上来供大家使用。小问题:各个进制的转换方法?请在下面回答,下一节揭晓答案。
下一篇:【JS逆向】某习通登录密码逆向