IDA静态调试的常用操作
- 新版IDA不自动显示string窗口,需要在view界面自行调出
- 不自动显示地址需要在general栏自己调出
- N:更改名称
- ctrl+e 进入函数
- x ctrl+x 交叉引用
- F5伪C代码
- TAB 伪C代码和汇编流程图切换
- J跳跃到函数
- ctrl+f 搜索字符串
- alt+f 全局搜索字符串
1. 单元、位和字节
1.BIT 位 0或者1
2.BYTE 字节 8bit 0-255 或者十六进制00-FF
3.WORD 字 两个BYTE 16bit 0-FFFF 0-65535
4.DWORD 双字 两个WORD 四个BYTE 32bit 0-FFFFFFFF 0-4294967295
5.KILOBYTE 1024字节 KB
6.MEGABYTE 1024^2 字节 MB
1.寄存器
1.EAX:累加器 (EAX为32位 AX为16位 RAX为64位) accumulaotr 累加
2.EBX 基址寄存器 Base 基址
3.ECX计数器 counter 计数器
4.EDX 数据寄存器 data数据
5.ESI 源变址寄存器 source index 源变址
6.EDI 目的变址寄存器 destination index 目的变址
7.EBP:拓展基址指针寄存器 base pointer 基址指针寄存器
8.ESP: 栈指针寄存器 stack pointer 栈指针寄存器
9.EIP:指令指针寄存器 Instruction pointer
10.CS: Code Segment 代码段寄存器
11.DS: Data Segment 数据段寄存器
12ES: Extra segment 附加段寄存器
13.SS stack segment 栈段寄存器
寄存器一般都是四个字节(32bit程序)
EBP:栈底寄存器
ESP:栈顶寄存器
EIP:下个语句的地址
魔鬼画图的栈情况~~
3.标志寄存器
1.ZF寄存器 Zero-Flag 零标志寄存器
如果上一个运算结果为0,则ZF=1
上一个运算结果为1,则ZF=0.
2.OF寄存器 Overstack-Flag 栈溢出寄存器
当最高位发生变化时为1
比如MOVE AX,7FFF #7FFF=0111 1111 1111 1111
ADD AX,1 #0111 1111 1111 1111+1=1000 0000 0000 0000
AX从7FFF变为8000最高位发生了进位 (二进制进位)
3.CF寄存器 使用较少 比如
MOVE AX,FFFF
ADD AX,1
AX从FFFF 变成0000(存疑),发生了进位 则CF=1
4.常用汇编语句
ADD SUB 加减
ADD 被加数,加数 结果保存在被加数中 会影响ZF,OF,CF
SUB 目的数,源数 将源数减去目的数存在目的数中 影响ZF,OF,CF
AND 与
AND 目标数,原数
AND 11010,01011
结果为01010
CALL 调用**
CALL EAX
CALL 函数
把IP压入栈中然后调用CALL后的函数
CDQ Convert Double to Quad 将精度转换为四精度
该指令先把edx的每一位置成eax的最高位,(若eax>=0x80000000, 则edx=0xFFFFFFFF;若eax<0x80000000,则edx=0x00000000。) 再把edx扩展为eax的高位,也就是说变为64位.
通常出现在除法前面
CMP 比较 **
CMP 目标数,原数 相等时候结果为0,则ZF=1
比较两个数的值然后标记ZF,OF,CF
DEC 自减少1*
DEC 被减数 会更改ZF和OF
INC 自增加1*
INC 被加数 会更改ZF和OF
DIV 除*
DIV 除数 (EAX为被除数,并且结果存在EAX中) 被除数在除数中
MOV EAX,64 #EAX=64H=100
MOV ECX,9 #ECX=9
DIV ECX #EAX=EAX//9=11 ECX=EAX%9=1
会更改CF,OF,ZF
IDIV 整除
IDIV 除数 类似DIV 有符号 标记CF,OF,ZF
IMUL 整乘
IMUL 目标寄存器,数值,数值
IMUL EAX,9,8 结果为IMUL=72d
IMUL 目标寄存器,数值
IMUL EAX,9 结果为EAX=9EAX
INT
int 目标数 调用程序对硬件控制 产生一个整数
LEA 有效地址传送*
LEA 目的数,源数
lea eax,dword ptr [4*ecx+ebx]
将eax赋值为 4*ecx+ebx
MOV 传送**
MOV 目的数,源数
将源数赋值给目的数 并且源数不变
MOV的变形:
MOVS/MOVSB/MOVSW/MOVSD EDI, ESI:这些变形能将ESI指向的内容传送到EDI指向的内容中去
MOVSX:MOVSX指令将单字或者单字节扩展为双字或者双字节传送,原符号不变
MOVZX:MOVZX扩展单字节或单字为双字节或双字并且用0填充剩余部分(通俗来说就是将源数取出置于目的数,其他位用0填充)
MUL 乘法
MUL 数值 类似IMUL
NOP 无操作 什么也不干***
NOP 什么也不做 最重要…
OR 或
OR 目的数,源数 清空OF,CF,设置ZF
OR 10101,01010 结果为11111
POP PUSH ***
POP 目的地址
将栈顶ESP 第一个字 16bit 送到目的地址 结束之后ESP+1 (地址从高向低生长)
PUSH 值
将一个值压到ESP 然后ESP-1
REP/REPE/REPZ/REPNE/REPNZ
REP ins
重复上面的指令直到CX=0 ins为操作符
RET 返回***
RET 或者RET digit
返回到调用之前的CALL处 digit会清栈
TEST 测试与(常用做判断EAX是否为0)**
TEST 操作符,操作符 执行与运算
大量用于 TEST EAX,EAX 如果EAX为0会标记ZF=1 否则清空ZF
XOR 异或***
XOR 目的数,源数
进行异或操作(异或就是不进位的相加 或者是说相同为0不同为1)
XOR 0,1 1
XOR 0,0 0
XOR 1,0 1
XOR 1,1 0
清空OF,CF,标记ZF
常用XOR EAX,EAX 设置EAX为0,不管谁异或自己都是0
JUMPS 跳转***************
指令 条件 条件
JA* -如果大于就跳转(无符号) - CF=0 and ZF=0
JAE - 如果大于或等于就跳转(无符号) - CF=0
JB* - 如果小于就跳转(无符号) - CF=1
JBE - 如果小于或等于就跳转(无符号) - CF=1 or ZF=1
JC - 如果CF被标记就了跳转 - CF=1
JCXZ - 如果CX等于0就跳转 - CX=0
JE - 如果相等就跳转 - ZF=1
JECXZ - 如果ECX等于0就跳转 - ECX=0
JG* - 如果大于就跳转(有符号) - ZF=0 and SF=OF (SF = Sign Flag)
JGE* - 如果大于或等于就跳转(有符号) - SF=OF
JL* - 如果小于就跳转(有符号) - SF != OF (!= is not)
JLE* - 如果小于或等于就跳转(有符号 - ZF=1 and OF != OF
JMP** - 跳转 - 强制跳转
JNA - 如果不大于就跳转(无符号) - CF=1 or ZF=1
JNAE - 如果不大于等于就跳转(无符号) - CF=1
JNB - 如果不小于就跳转(无符号) - CF=0
JNBE - 如果不小于等于就跳转(无符号) - CF=0 and ZF=0
JNC - 如果CF未被标记就跳转 - CF=0
JNE** - 如果不等于就跳转 - ZF=0
JNG - 如果不大于就跳转(有符号) - ZF=1 or SF!=OF
JNGE - 如果不大于等于就跳转(有符号) - SF!=OF
JNL - 如果不小于就跳转(有符号) - SF=OF
JNLE - 如果不小于等于就跳转(有符号) - ZF=0 and SF=OF
JNO - 如果OF未被标记就跳转 - OF=0
JNP - 如果PF未被标记就跳转 - PF=0
JNS - 如果SF未被标记就跳转 - SF=0
JNZ - 如果不等于0就跳转 - ZF=0
JO - 如果OF被标记就跳转 - OF=1
JP - 如果PF被标记就跳转 - PF=1
JPE - 如果是偶数就跳转 - PF=1
JPO - 如果是奇数就跳转 - PF=0
JS - 如果SF被标记就跳转 - SF=1
JZ - 如果等于0就跳转 - ZF=1
河北师范大赛被暴打,还是稳下心学习吧~
感谢大佬https://blog.csdn.net/we08guyy/article/details/54647057 此文章给我很大帮助 还有bilibili DeelMind