逆向工程 1

逆向工程(一):汇编、逆向工程基础篇
汇编是逆向工程的基础
1.位是电脑数据量的最小单位,字节是最基本单位。其他还有字(16位),双字(24位),千字(1024字节),兆(1048576字节),电脑数据单位进制为 1024.
2.寄存器是电脑的数据储存位置。特别注意ESP,EBP,EIP.
AX是这个32位寄存器的名字,EAX的低16位部分被称作AX,AX又分为高8位的AH和低8位的AL两个独立寄存器。 
3.寄存器大小分为i.单字节寄存器:
AL and AH
BL and BH
CL and CH
DL and DH
ii.单字寄存器,包含两个单字节寄存器。包括:通用寄存器,索引寄存器(指针寄存器),段寄存器,指令指针寄存器
iii. 双字(32位)寄存器:
2字=4字节=32位,EAX、EBX、ECX、EDX、EDI…… 
如果16位寄存器前面加了‘E’,就代表它们是32位寄存器。例如,AX=16位,EAX=32位。 
4.标志寄存器,代表某种状态,注重Z-Flag(零标志),The O-Flag(溢出标志),The C-Flag(进位标志)。
ZF是破解中用得最多的寄存器(通常情况下占了90%),它可以设成0或者1。若上一个运算结果为0,则其值为1,否则其值为0。OF寄存器在逆向工程中大概占了4%,当上一步操作改变了某寄存器的最高有效位时,OF寄存器会被设置成1。进位寄存器的使用大概占了1%,如果产生了溢出,就会被设置成1。
5.段偏移:一个段是一本书的某一页:偏移量是一页的某一行。
6.栈:栈是内存里可以存放稍后会用到的东西的地方,临时存放,最后存入数据最先输出。
指令ADD(加):加法指令将一个数值加在一个寄存器上或者一个内存地址上。
AND (逻辑与) ,AND运算对两个数进行逻辑与运算。同真为真(1),否则为假(0)
CALL (调用):CALL指令将当前的相对地址(IP)压入栈中,并且调用CALL 后的子程序
CDQ:CDQ指令第一次出现时通常不好理解。它通常出现在除法前面,作用是将EDX的所有位变成EAX最高位的值。
CMP (比较):CMP指令比较两个值并且标记CF、OF、ZF
DEC (自减):dec用来自减1,相当于c中的–
DIV (除):IV指令用来将EAX除以除数(无符号除法),被除数通常是EAX,结果也储存在EAX中,而被除数对除数取的模存在除数中。
IDIV (整除):IDIV执行方式同div一样,不过IDIV是有符号的除法,idiv指令可以标记CF、OC、ZF。
IMUL (整乘):MUL指令可以把让EAX乘上一个数(INUL 数值)或者让两个数值相乘并把乘积放在目标寄存器中(IMUL 目标寄存器, 数值,数值)或者将目标寄存器乘上某数值(IMUL 目标寄存器, 数值)
INC (自加):INC同DEC相反,它是将值加1,INC指令可以标记ZF、OF
INT:INT 的目标数必须是产生一个整数(例如:int 21h),类似于call调用函数,INT指令是调用程序对硬件控制,不同的值对应着不同的功能。
LEA (有效地址传送):LEA可以看成和MOV差不多的指令LEA ,它本身的功能并没有被太广泛的使用,反而广泛运用在快速乘法中
MOV (传送):MOV指令将源数赋值给目的数,并且源数值保持不变
MUL (乘法):同IMUL一样,不过MUL可以乘无符号数。
NOP (无操作):这个指令说明不做任何事,所以它在逆向中运用范围最广
OR (逻辑或):语法:OR 目的数,源数,OR指令对两个值进行逻辑或运算
POP:POP指令将栈顶第一个字传送到目的地址。 每次POP后,ESP(栈指针寄存器)都会增加以指向新栈顶
PUSH:PUSH是POP的相反操作,它将一个值压入栈并且减小栈顶指针值以指向新栈顶。
REP/REPE/REPZ/REPNE/REPNZ:重复上面的指令:直到CX=0。ins必须是一个操作符,比如CMPS、INS、LODS、MOVS、OUTS、SCAS 或 STOS
RET (返回):RET指令的功能是从一个代码区域中退出到调用CALL的指令处。RET digit在返回前会清理栈.
SUB (减):SUB与ADD相反,它将源数减去目的数,并将结果储存在目的数中SUB可以标记ZF、OF、CF
TEST:这个指令99%都是用于”TEST EAX, EAX”,它执行与AND相同的功能,但是并不储存数据。如果EAX=0就会标记ZF,如果EAX不是0,就会清空ZF
XOR:XOR指令对两个数进行异或操作这个指令清空OF、CF,但会标记ZF

你可能感兴趣的:(逆向工程 1)