2021-08-26

环境

1、工具
IDA、OllyDBG 、ExeinfoPE、DIE

汇编

寄存器

1、CPU通用寄存器
EAX 累加器, 它是很多加法乘法指令的缺省寄存器。
EBX 基地址寄存器, 在内存寻址时存放基地址。
ECX 计数器, 是重复(REP)前缀指令和LOOP指令的内定计数器。
EDX 则总是被用来放整数除法产生的余数。
ESI/EDI 分别叫做”源/目标索引寄存器”,因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串。
EBP 基址指针, 它最经常被用作高级语言函数调用的”框架指针”
ESP 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。

指令

1、资料转移指令
MOV 移动
MOVC 程式记忆体移动
MOVX 外部RAM和扩展I/O口与累加器A的数据传送指令
PUSH 放入堆叠
POP 由堆叠取回
XCH 8位元交换
XCHD 低4位元交换
SWAP 高低4位元交换

2、算术指令
ADD 两数相加
ADDC 两数相加再加C
SUBB 两数相减再减C
INC 加一指令
DEC 减一指令
MUL (MUL AB乘法指令仅此一条)相乘指令,所得的16位二进制数低8位存累加器A高8位存B
DIV (DIV AB 除法指令仅此一条)相除指令,所得商存A,余数存B
DA (DA A 只此一条指令)调整为十进数

3、逻辑指令
ANL做AND(逻辑与)运算
ORL做OR(逻辑或)运算
XRL 做(逻辑异或)运算
CLR 清除为0
CPL 取反指令
RL 不带进位左环移
RLC 带进位左环移
RR 不带进位右环移
RRC 带进位右环移

4、控制转移类指令
JC C=1时跳
JNC C=0时跳
JB 位元=1时跳
JNB 位元=0时跳
JBC 位元=1时跳且清除此位元
LCALL 长调用子程序
ACALL 绝对调用子程序
RET 由副程式返回
RETI 由中断副程式返回
AJMP 绝对转移
SJMP 相对转移
JMP @A+DPTR 散转,相对DPTR的间接转移
JZ A=0时跳
JNZA 0时跳
CJNE 二数比较,不相等时跳
DJNZ 减一,不等於0时跳
NOP 空操作

5、位变量指令
SETB 设定为1
ORG 程序开始,规定程序的起始地址
END 程序结束
EQU 等值指令(先赋值后使用)例:SUM EQU 30H
DB 定义字节指令
DW 定义字内容
DS 定义保留一定的存贮单元数目
BIT 位地址符号指令 例:SAM BIT P1.0
RET 子程序返回指令
RETI 中断子程序返回指令
$ 本条指令地址

脱壳

常用工具

1、文件分析工具:Fi,GetTyp,peid,pe-scan
2、OEP入口查找工具:SoftICE,TRW,ollydbg,loader,peid
3、dump工具:IceDump,TRW,PEditor,ProcDump32,LordPE
4、PE文件编辑工具PEditor,ProcDump32,LordPE
5、重建Import Table工具:ImportREC,ReVirgin
6、ASProtect脱壳专用工具:Caspr,Rad,loader,peid

理论知识

1、ESP定律
向堆栈中压入下一行程序的地址。
2、call指令
1.向堆栈中压入下一行程序的地址;
2.JMP到call的子程序地址处。
例如:
00401029 . E8 DA240A00 call 004A3508
0040102E . 5A pop edx
在执行了00401029以后,程序会将0040102E压入堆栈,然后JMP到004A3508地址处!
3、ret指令
1.将当前的ESP中指向的地址出栈;
2.JMP到这个地址。
4、OEP
OEP程序的入口点,找到OEP就能快速脱壳,如果把壳比作锁,OEP就是锁孔。

方法与修复

1、找到一个带有压缩壳的程序,使用ExeinfoPE或者DIE查壳
在这里插入图片描述
通过软件查看程序信息,该程序被UPX压缩
在这里插入图片描述
2、将程序载入OD
在这里插入图片描述
3、使用IDAF分析解壳位置,根据ESP堆栈平衡原理,找到OEP位置在popa处
在这里插入图片描述
4、OD中跳转到0040EA0E处,运行代码
在这里插入图片描述在这里插入图片描述
5、F8单步步过到004010CC
在这里插入图片描述
6、右键使用OllyDump脱壳调试进程,入口地址为10CC
在这里插入图片描述
7、使用LordPE、ImportREC进行修复转储,脱壳完成。

OllyDBG动态调试

常用快捷键

F2
设置断点,只要在光标定位的位置按F2健即可,在按一次F2键则会删除断点。
F8
单步步过,每按一次这个键执行一条反汇编窗口中的一条指令,遇到call等子程序不进入其代码。
F7
单步步入:功能同单步步过(F8)类似,区别是遇到ll等子程序会进入其中,进入后首先会停留在子程序的第一条指令上。
F4
运行到选定位置,作用就是直接运行到光标所在位置处暂停。
F9
运行,按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。
Ctrl+F9
执行到返回,此命令在执行到一个ret (返回指令)指令时暂停,常用于从系统部分返回到我们调试的程序部分。

破解

1、OD载入要破解的程序,F9运行,用户名和序列号就是接下来要破解的对象
在这里插入图片描述
2、工具栏打开常用断点设置,设置断点
在这里插入图片描述在这里插入图片描述
3、任意输入用户名和序列号,点击check,程序运行到断点处
在这里插入图片描述
4、Ctrl+F9执行到返回
在这里插入图片描述
5、一直F8运行,图中edx和eax处就是用户名和序列号的压栈处
在这里插入图片描述
6、F7进入call指令处,此处是循环判断
在这里插入图片描述在这里插入图片描述
7、循环判断完后,会将返回值放入inc中,此时eax中为0
在这里插入图片描述在这里插入图片描述
8、F8运行到循环语句设置断点,继续F8运行,结果显示“序列号错误,再来一次!”
在这里插入图片描述
9、由此判断004011F5处是关键跳转点,设置断点,重新运行程序,运行到断点时,修改je指令,运行程序,破解成功。

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值