玩玩破解
说明
笔记整理自:玩玩破解,写给新人看
软件下载
破解三兄弟:PEID,DIE,OD
PEDI:检查软件是否有壳
DIE:除了检查软件是否有壳外,主要查看软件是用什么编程语言写的
OD:分析软件源代码,通过修改机器码来修改exe文件
其它软件:Inline Patch ,UPX
Inline Patch:在程序文件中把补丁代码写入文件里面达到破解的目的
UPX:UPX 是一种高级的可执行文件压缩器,可以对exe进行打包或者解包(加壳或者去壳)
天翼云打包下载:点我下载
汇编知识
1、常见指令
指令 | 说明 |
---|---|
cmp a,b | 比较a与b |
mov a,b | 把b的值给a |
ret | 返回主程序 |
nop | 英文“no operation”的简写,空指令 就是当代码执行到这里的时候无论如何都不会跳转,都会继续往下执行代码 |
call | 调用子程序 |
eax寄存器 | 所有子程序也就是CALL的返回值都存放在EAX里面 距离 call 下面最近的 eax 里面存放的就是 call 执行的结果 |
pop | 出栈 |
push | 压栈 |
2、跳转指令
指令 | 说明 |
---|---|
JE | 等于则跳转 |
JNE | 不等于则跳转 |
JZ | 为 0 则跳转 |
JNZ | 不为 0 则跳转 |
JS | 为负则跳转 |
JNS | 不为负则跳转 |
JC | 进位则跳转 |
JNC | 不进位则跳转 |
JO | 溢出则跳转 |
JNO | 不溢出则跳转 |
JA | 无符号大于则跳转 |
JNA | 无符号不大于则跳转 |
JAE | 无符号大于等于则跳转 |
JNAE | 无符号不大于等于则跳转 |
JG | 有符号大于则跳转 |
JNG | 有符号不大于则跳转 |
JGE | 有符号大于等于则跳转 |
JNGE | 有符号不大于等于则跳转 |
JB | 无符号小于则跳转 |
JNB | 无符号不小于则跳转 |
JBE | 无符号小于等于则跳转 |
JNBE | 无符号不小于等于则跳转 |
JL | 有符号小于则跳转 |
JNL | 有符号不小于则跳转 |
JLE | 有符号小于等于则跳转 |
JNLE | 有符号不小于等于则跳转 |
JP | 奇偶位置位则跳转 |
JNP | 奇偶位清除则跳转 |
JPE | 奇偶位相等则跳转 |
JPO | 奇偶位不等则跳转 |
OD使用
1、软件界面
- 代码区,就是显示汇编代码的地方,我们查看程序执行代码就看这个区,改跳转进行爆破都是在这个区实现
- 信息区,显示我们程序运行每句代码的相关信息,比如跳转的地址和一些数据,很多时候当我们在真假码比较的代码执行的时候,在信息区会出现真码。
- 数据区,就是显示程序的数据的地方,我们想看某个地址里面的值,就在这个区域里查看。查看某个地址的数据和在代码区查看某个地址的代码的方法是一样的,就是在所在的区的任意位置按
CTRL + G
,然后输入地址,点确定。 - 寄存器区,里面会显示寄存器。EAX、ECX、EBX、EDX等八个首字母是E的都叫做寄存器。寄存器的作用和程序的其他内存地址一样,都是用来存放数据的,区别就是寄存器在CPU里面,读取数据的速度比从内存地址里要快,
- 堆栈区。堆栈也是内存的一部分,它的特殊之处就在于它总是和子程序(CALL)相关联,堆栈里面的地址存放的数据有三种类型,一是存放调用某个CALL下面一行代码的地址。二是存放CALL的参数。三是CALL在运行过程中的变量值。我们如果想“追码”和了解验证的“算法”,那么我们就需要进入验证CALL,这个时候堆栈就起了关键的提示作用了,堆栈里面会先显示出假码,因为假码是验证CALL的参数,接着出现验证CALL下面一行语句的地址,最后会显示出验证CALL里面计算出的数值,就是变量值,如果没有加密的话,就会显示出计算出来的真码。
2、快捷键
快捷键 | 说明 |
---|---|
F3 | 打开要调试的程序 |
F2 | 为程序打断点或者取消断点 |
F4 | 运行到选定位置 在这行代码上按键盘上的F4,然后按F9运行,程序就停在这行代码上了 |
F7 | 单步步入 一行一行执行程序,会步入被调试程序的 Call 中 |
F8 | 单步步过 一行一行执行程序,不会进入CALL,而是一下子就执行完整个CALL |
F9 | 运行程序 |
CTRL + F9 | 让程序快速执行到你现在运行的子程序代码的结尾处 |
ALT + F9 | 当程序暂停在系统领空的时候,ALT+F9 可以让程序就一下子就执行完当前系统领空的代码回到了程序领空 |
① CTRL+F9
破解软件只需要关注软件作者自写的代码
如果目前程序暂停的代码位置,在操作系统提供的函数(子程序)代码内,这些就不是我们需要关心的
如何分辨是软件作者自写的代码还是操作系统提供的代码呢?简单说,软件作者自写的代码基本上都是小地址,操作系统的函数代码都是大地址
看下图红色方框内的代码地址,都是004…..,这些就叫做小地址。
我们再看上面写着CM1,就是我们要破解的软件的名字,就更加证实我们目前程序暂停在作者自写的代码上,也可以形象的说“我们现在处在程序领空”。
作为对比,看下面这一张图
现在红色方框内的地址都是7开头的,这就是大地址。
我们再看显示的是 user32,不再是我们要破解的软件的名字CM1,这就说明目前程序暂停的代码位置不是作者自写的代码内,而是在操作系统提供的函数(子程序)代码内,我们也可以形象的说“我们目前处在系统领空”。
CTRL + F9
的作用就是当我们发现此刻程序停留在系统领空以后,我们就赶快按 CTRL + F9
执行到系统函数的结尾处,因为花时间看系统函数内部的代码完全是浪费时间
② ALT+F9
作用就是当程序暂停在系统领空的时候,按一下 ALT + F9
,程序就一下子就执行完当前系统领空的代码回到了程序领空。这样就省事了。所以我们破解的时候,经常用的手法就是在诸如 MessageBoxA
这样的操作系统提供的函数下断点,程序断下来后,就按一下ALT+F9从系统领空返回到程序领空,再分析代码。
提醒一下,如果是 MessageBoxA函数,你按完 ALT+F9 后你会发现并没有返回到程序领空,怎么回事?很简单,你需要把错误提示信息框关闭,然后程序就自动返回到程序领空了,因为错误信息框在等待用户操作,你不操作,程序就一直停留在等待操作的状态中。
3、操作系统提供的API函数
打断点到操作系统提供的API函数
选择插件,API断点设置工具,常用断点设置
在里面选择自己需要打的断点,确定以后运行程序
在运行程序到窗口弹出前一步,会有一个打好的断点
说明
函数 | 作用 |
---|---|
MessageBoxA | 弹出信息框 |
GetwindowsText | 读取窗口内的输入文本 |
SendMessage | 发送鼠标左键单击消息 |
GetDlgItemInt | 用户输入转换为整数 |
SetWindowsTextA | 改变指定窗口的标题栏的文本内容 |
4、查看什么语言编写的
快捷键 Ctrl + G
,搜索 00401000
00401000
这行代码,显示的是 xor eax,eac
,只要是 00401000
这行代码是这样的,就是易语言写的程序
但是无论在PEID 还是 DIE 里面面,易语言程都会识别为 Microsoft Visual C++
5、加壳软件分析
直接使用OD分析
面对加壳软件,我们有两种选择,一种是先脱壳再用OD分析,一种是不脱壳直接用OD分析。
直接使用OD分析的话,可以先运行程序,然后在OD,菜单栏: 选择文件—>附加
,选择要分析的软件,快捷键 Ctrl + G
,搜索 00401000
,然后在插件,中文搜索搜索引擎里面选择智能搜索,去搜索关键字符串
或者直接使用OD打开程序,可能会出现提示,选择否以后
先 F9 运行程序,在程序运行起来以后(看OD左上角),然后快捷键 Ctrl + G
,搜索 00401000
,然后在代码区右键,中文搜索搜索引擎里面选择智能搜索,去搜索关键字符串
没有经过脱壳,直接使用OD分析的话,修改代码以后无法保存,此时需要用到软件Inline Patch
首先选择要破解的软件路径,然后根据在OD的修改,填写补丁地址和补丁数据,添加完成以后,选择生成即可。
先脱壳再分析
使用PEiD查壳后发现是UPX壳
使用UPX命令行工具进行脱壳
1 | upx.exe -d <需要脱壳的程序路径> |
成功以后再次检查
后面就可以直接拖入OD进行调试了
6、关于00401000
EXE 可执行文件可以在Windows 95上加载的最低地址是4MB,即0x00400000
加壳软件一般就是直接搜索
00401000