逆向学习笔记2019/11/3

IDA静态调试的常用操作

  1. 新版IDA不自动显示string窗口,需要在view界面自行调出
  2. 不自动显示地址需要在general栏自己调出
  3. N:更改名称
  4. ctrl+e 进入函数
  5. x ctrl+x 交叉引用
  6. F5伪C代码
  7. TAB 伪C代码和汇编流程图切换
  8. J跳跃到函数
  9. ctrl+f 搜索字符串
  10. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值