目录
- 🕒 1. 软件解密技术
- 🕘 1.1 概述
- 🕘 1.2 爆破
- 🕘 1.3 跟踪注册
- 🕘 1.4 写出注册
- 🕒 2. 破解相关问题
- 🕘 2.1 破解程度
- 🕘 2.2 破解线索
- 🕒 3. 实验:使用 OllyDbg 破解 PDF转换器
- 🕘 3.1 OllyDbg 布局介绍
- 🕘 3.2 OllyDbg 基本使用
- 🕘 3.3 流程
🕒 1. 软件解密技术
🕘 1.1 概述
- 针对数据的解密在于如何推导密钥
- 而针对软件的解密技术则在于寻找注册码完成注册甚至跳过注册,因此软件解密又被称为软件破解,即crack
🕘 1.2 爆破
- 本质——修改程序流程,跳过注册保护的步骤
- 方法——对程序代码进行静态分析
- 工具——W32Dasm等静态反汇编软件
例:某知名录屏软件破解补丁
🕘 1.3 跟踪注册
- 本质——分析软件注册码计算过程,计算注册码
- 方法——对程序代码进行动态分析
- 工具——OllyDbg等动态调试软件
🕘 1.4 写出注册
- 本质——根据软件注册码计算方法,编写注册机
- 方法——基于动态分析
- 工具——编程语言
例:Typora注册机
🕒 2. 破解相关问题
🕘 2.1 破解程度
软件破解程度通常分为两种:
完全破解:对于需要输入指定注册码的软件,通过对程序的跟踪找到预置的正确注册码,并将软件成功注册
- 使用的技术手段:跟踪注册-动态分析
暴力破解:若软件本身没有提供注册功能或加密技术比较复杂,无法得到正确注册码,只能通过修改程序改变运行方向
- 使用的技术手段:爆破-静态分析
🕘 2.2 破解线索
使用W32Dasm 等反汇编工具打开目标软件的EXE文件,将其由不可读的机器语言 反汇编为 可读的汇编语言
对该汇编代码进行静态分析,找出与软件注册相关的语句
****: ******** MOV/PUSH EAX,[********]
****: ******** MOV/PUSH EDX,[********]
****: ******** CALL ********
****: ******** TEST EAX,EAX
****: ******** JNZ ********
通常软件程序内部都会调用一个子程序(即 CALL ****)来验证输入的注册码是否正确
例如对于注册码显式存在的程序,一般都会将输入的注册码和正确的注册码放进寄存器,然后调用验证子程序进行判断,并将结果返回,主程序根据子程序返回的结果决定是否注册成功
🕒 3. 实验:使用 OllyDbg 破解 PDF转换器
🕘 3.1 OllyDbg 布局介绍
以“pdftiger.exe”为目标程序,主界面如下
反汇编窗口:当载入目标程序后,在该窗口内显示源汇编代码
- 但不包含基本信息、对话框信息和引入表信息
- 自动定位到程序入口点
- 反汇编窗口共4列
- 地址栏:代码的虚拟地址VA(程序访问存储器所使用的逻辑地址就称为虚拟地址,也就是常说的内存偏移地址)
- 十六进制:十六进制形式表示的源码
- 反汇编:目标程序的源汇编代码
- 注释:API函数信息等
信息窗口:
- 在动态调试时,该窗口内显示出当前代码行的各个寄存器信息,或API函数的调用、跳转等信息
- 用来辅助了解当前代码行的寄存器情况
数据窗口:
- 该窗口默认以十六进制方式显示目标软件在内存中的数据
- 数据窗口分3列,分别为VA地址、HEX数据和ASCII码,也可设置为Unicode等模式
寄存器窗口:
- 该窗口 动态显示CPU各个寄存器的内容,包括
- 数据寄存器:EAX、EBX、ECX、EDX
- 指针及变址寄存器:ESP、EBP、ESI、EDI
- 段寄存器:CS、DS、SS、ES
- 目标软件使用过程中,输入的用户名、机器码、注册码等信息一般都会放在这些寄存器中,因此在动态分析时要多查看寄存器内容
堆栈窗口:
- 显示堆栈的内容,也就是EBP和ESP所指向的内容
- 堆栈较为重要,API函数或子程序都会利用它来传递参数、变量等信息
- 若传递的信息是字符串形式,会在注释里显示
- 对于注册码明文比较的目标程序,在堆栈中可能就会显示出正确注册码
🕘 3.2 OllyDbg 基本使用
跳转到指定VA:【Ctrl+G】
- 在弹出的对话框中输入想要跳转的代码行的VA地址,如“0049232E”,单击【确定】
搜索代码:【Ctrl+F】
- 在弹出的对话框中输入想要搜索的汇编指令,如“push ebp”,单击【查找】
增加标签:【:】
- 选中某行汇编代码,在键盘上敲下“:”,为该行代码增加标签,VA地址将红色显示,可快速定位
增加注释:【;】
- 选中某行汇编代码,在键盘上敲下“;”,为该行代码增加注释,便于标记代码功能
修改代码:【Ctrl+E】
- 使用十六进制直接修改本行汇编代码
动态调试:【F9】
- 载入目标程序后,按【F9】可以运行程序
- OllyDbg 将实时记录用户操作后的内存情况
【F7】
- 单步跟踪目标程序,一条代码一条代码地执行,遇到call语句会进入指定位置,遇到retn返回
- 右侧寄存区窗口中的指针ESP也发生变化
下断点:【F2】
- 进行动态调试时,要让目标程序中断在关键代码处,再根据显示的动态信息进行代码分析
- 因此需要给目标程序下断点
🕘 3.3 流程
启动PDFTiger,点击【立即购买】,弹出输入注册码的对话框,随便输入注册码,单击【确定】,弹出对话框,出现提示字符串“注册码错”,将其作为破解线索。
使用OllyDbg 打开目标程序“PDFTiger.exe”
主界面如图所示:
进入反汇编窗口,右键选择【搜索】-【所有模块】-【字符串】
OllyDbg 会打开另外一个窗口
在窗口下方搜索框内输入“注册码错”进行搜索
选中该行按下双击后,反汇编窗口内会自动定位到所在的汇编代码
“注册码错”的上方有一个“jmp”跳转,选中后发现其跳转目的地在“注册码错”的下方
我们希望跳转一定会执行,这样就可以跳过“注册码错”了
继续检查是否还有待跳转箭头的干扰语句
“jmp”的下一行 “mov dword…”,选中后发现它是某条跳转语句的目的地,有箭头指向它
也就是说,若上文某个语句先执行,并成功跳转到该行,程序会一直按序运行到“注册码错”
在“jmp”和“注册码错”之间只有一个干扰语句
我们希望这样的来自上文的跳转指令不会执行,因此将对应的跳转指令 改为 空指令“nop”
如果发现没有小箭头,可以这样调出
那么是哪个跳转语句 跳到了这个位置呢?
选中该位置,在信息窗口中显示跳转来自四条语句,将四条语句都修改为nop指令才可以
选中该提示信息,右键选中【显示引用】
在弹出的对话框中选中第一个引用,单击即跳转到引用位置
然后选中该行代码,右键单击选择【二进制】-【用NOP填充】
继续重复上述操作,直至四条语句均修改完毕
在反汇编区,右键【补丁】
在弹出的窗口中选择【修补文件】,将其另存为“PDF破解版.exe”
双击“PDF破解版.exe”,随意输入注册码,发现已注册成功
❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页