作为汇编语言的课程笔记,方便之后的复习与查阅
本篇为课程第十二次课内容
本文中用到的静态分析与动态分析软件,以及作为示例的破解软件:
- 链接:https://download.csdn.net/download/weixin_42437114/15118252
(百度云一直过不了审!就先传到 CSDN 了,我设的 0 积分下载)
基础知识
- 加密:可以对待加密文件进行加壳,压缩,反跟踪,代码变形等操作,这些操作使用汇编语言最方便,有些只能通过汇编语言实现
- 解密:对待破解文件的分析,跟踪,打补丁等操作,也必须掌握汇编语言,否则无法实现
一些重要的汇编指令
- 相等跳转:
JZ
/JE
机器码:74H
- 不等跳转:
JNZ
/JNE
机器码:75H
- 无条件跳转:
JMP
机器码:EBH
/E9H
- 空指令:
NOP
机器码:90H
屏蔽一些指令可以把它改成90h
静态分析
- 从反汇编出来的程序清单上分析,从提示信息入手进行分析。
- 常用的静态分析工具是 W32DASM、IDA 和 HIEW
示例:利用静态分析破解 CRACKME.EXE
- 打开压缩包中的
CRACKME.EXE
,如果输入的序列号错误,就会显示错误信息
那么我们就从这个提示信息入手,尝试破解 - 首先打开
win32dasm
,对待破解文件进行反汇编
- 查找字符串数据对应的汇编
双击之后就找到了对应的汇编代码位置:
- 定位要修改的汇编代码位置:在上面找到的字符串数据对应的汇编代码上面一点可以看到
jne 004015ad
这个跳转指令,可以猜测这个跳转指令即为序列号是否输入正确的判断语句
- 在二进制文件中更改机器指令,实现暴力破解
- 用
winhex
打开待破解软件:
- 查找
jne 004015ad
对应的机器指令7516
,也可以多搜索几个字节,如75166a40
- 成功定位到了该机器指令处:
- 修改这里的
75
(jne
)为74
(je
)即可使软件在输入错误序列号时跳转到正确的分支上。也可以将7516
改为9090
来屏蔽这个跳转指令。更改后即可破解
- 用
动态分析
- 虽然从静态上可以了解程序的思路,但是并不可能真正了解地了解软件的细节,如静态分析找不出线索,就要动态分析程序,另外,碰到压缩程序,或者软件显示的信息是经过加密的,在运行时解密,静态分析也无能为力了,只能动态分析。所谓动态分析是利用 SoftIce 或 Ollydbg一步一步地单步执行软件
基本 API 函数
GetWindowTextA
: 复制指定窗口中的字符到缓冲区GetDlgItemTextA
:返回对话框中某一个窗口的标题或文字MessageBoxA
:创建、显示和操作信息框- 32 位API常有
A
W
两种形式:MessageBoxA
,MessageBoxW
- 程序获取输入的注册码时可能会用到上面这些API函数,因此可以在 ollydbg 调试时,在这些函数上设置断点
bpx+API函数名
示例:利用动态分析破解 Task Lock.EXE
- 先以管理员方式运行 ollydbg,然后打开
Task Lock.EXE
- 在左下角的命令窗口中输入
bpx GetDlgItemTextA
来设置断点
然后开始调试
- 先随便输入一个序列号,按下 ok 按钮之后就到达了断点
- 通过单步调试,可以发现应该要更改
752b
这个跳转指令
用同样的方法修改跳转指令:
- 成功破解:
软件保护技术
- 从上面的几个例子中可以看出,如果不给自己的软件进行加密工作,会很容易被别人破解。因此软件加密是十分必要的
常用的软件保护技术:
- 给程序加壳;(防分析的第一关)
- 防注册码破解:
- 用户名和注册码尽量不使用明文; (防止盗取密码)
- 注册码生成算法尽量使用多段函数完成,并加入干扰代码,以迷惑破解者; (防止注册机)
- 防暴力破解:
- 程序自身进行完整性检查,发现被修改使用影子文件自动修复;(防止暴破)
- 注册码的合法性检查不只有对错两条分支,构建注册码判断的迷宫,拖死破解者;(防止暴破)