滴水逆向
exe文件头 4D 5A 90 00 03
逆向过程:二进制>>>汇编>>>C程序
常用计量单位:
byte 字节 = 8(bit)
word 字 = 16(bit)
dword 双字 = 32(bit)
内存读写
寄存器:
32位:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI
16位:AZ、CX、DX、BX、SP、BP、SI、DI
8位:AL、CL、DL、BL、AH、CH、DH、BH
DS:数
SS:ESP、EBP
ES:EDI
指令:
mov 存放
add 添加
sub 减少
lea 取编号
push 入栈
pop 取栈值
lea 获取内存编号
rep 重复
pushad 8个寄存器保存堆栈
popad 恢复寄存器
xchg 交换数据
sbb 带借位减法
movs 移动数据。内存-内存
stos 将AL/AX/EAX的值存储到[EDI]指定的内存单元
rep 按计数寄存器(ecx)中指定的次数重复执行字符串指令
jmp 修改eip
EFLAGS寄存器
JCC
jmp 寄存器/立即数 #只修改eip
call 寄存器/立即数 #修改eip,往栈加入值
retn #返回
cmp cmp eax,ecx #比较两个操作数,不修改操作数的值只修改标志位
test test eax,eax #两个数值比较结果不保存,只需改标志位
je、jz #结果为零则跳转(相等时跳转) ZF=1
jne、jnz #结果不为零则跳转(不想等时跳转) ZF=0
js #结果为负则跳转 SF=1
jns #结果为非负则跳转 SF=0
jp、jpe #结果中1的个数为偶数则跳转 PF=1
inp、ipo #结果中1的个数为奇数则跳转 PF=0
jo #结果溢出了则跳转 OF=1
jno #结果没有溢出则跳转 OF=0
jb、jnae #小于则跳转(无符号数) CF=1
JNB、JAE #大于则跳转(无符号数) CF=0
JBE、JNA #小于则跳转(无符号数) CF=1 or ZF=1
JNBE,JA #大于则跳转(无符号数) CF=0 or ZF=0
JL、JNGE #小于则跳转(有符号数) SF != OF
JNL、JGE #大于等于则跳转(有符号数) SF=OF
JLE、JNG #小于等于则跳转(有符号数) ZF=1 or SF != OF
JNLE,JG #大于则跳转(有符号数) ZF=0 and SF=OF