下面是网上的160个CrackMe的部分逆向笔记,包括逆向思路、注册机实现和逆向中常用的知识整理
注意:逆向前一定要先操作一下软件,熟悉软件的运行现象;逆向一定要自己操作一遍,看是很难看会的(高手除外)
文章目录
CrackMe004和CrackMe005是同一个作者用Delphi写的小程序;由于平时逆向C++程序多一些,因此CrackMe005就没有逆向
1.现象
程序输入用户名和验证码后,没有提示信息,也没有验证按钮弹出,此时CrackMe001的关键字符串思路应该失效了;不过据说输入正确的验证码会显示一张美女的图片
2.逆向思路
常规的通过错误提示框中特定字符串为突破口的方式对本程序失效,需要寻找新的突破口,先看一下程序是用什么语言编写的
注意:如果看过上面介绍,这里就操作了寂寞;其实这步还是很有用的,因为正常逆向程序前,都要运行一下程序,看一下程序使用的编程语言和是否有壳等基本信息,后面笔记也会有这个步骤
程序使用Delphi
语言编写,无壳;可以使用Delphi
的反编译工具Darkde4
尝试看看能不能找到突破口
step 1.寻找突破口?
- 在
窗体
部分
直接双击模块,会弹出详细信息,会发现本来以为会显示图片的控件是一个按钮,且关联了2个事件(单击和双击事件)
- 在
过程
部分
描述整个程序的所有响应事件和对应的RVA(相对偏移地址,相对内存映像基地址的偏移);下面有5个事件,在窗体
部分可以看到与控件的对应关系
突破口1:通过单击和双击事件,用相应的RVA可以直接在OD中查找函数入口(OD的反汇编窗口显示的地址就是RVA形式,其实这里的RVA是有误导的,在PE中这应该叫VA),分析函数的具体实现
step 2.单击事件
提示:OD分析程序前,可以使用IDA生成MAP文件供OD调试用,这样可以提高逆向的效率;笔记里基本上OD都是导入了IDA分析的MAP文件后,才开始OD的调试的
单击事件Panel1Click
的RVA是0x457FB8
,在这个地址处设置断点,输入用户名和注册码(test123
和456
);断点命中后分析函数执行流程
下面是单击事件入口处的截图,OD界面的显示效果可以根据自己的习惯进行设置(下面截图也给出了设置位置)
下面是单击事件处理逻辑的主要部分的截图,可以看到通过分析,爆破的结果也展示出来了
注意:下面是使用OD作为主要逆向工具才会有这么详细的截图的,后续笔记很多都是结合OD和IDA分析的,因为IDA更好的代码展示,呈现处理逻辑时,很多用的都是IDA了
上述函数执行流程汇总:
- 1.获取用户名,将用户名长度 +
0x1E
的结果转化成字符串 - 2.拼接:步骤1的字符串 + 用户名 + 循环次数;累计循环18次,因此用户名
test123
,计算结果是“37test12318”
- 3.比较:
[esi+x0x30C]
的值与0x85
是否相等?不相等直接退出,相等进行另一个类似的重复校验,接着会显示一副美女图片
结论:通过函数处理的流程发现,只有第3步是关键,第1和2步相当于分析了个寂寞…(如果使用IDA分析,很容易就看到跳过步骤1和步骤2);一句话,[esi+0x30C]的值要求是0x85
注:如果暴力破解的话,分析流程已经结束了,后面就不用看了
step 3.双击事件
分析完单击事件,取消单击事件设置的断点,用同样的套路分析双击事件
这次吸取教训,先看看双击对用户名的整个流程;发现真正有用的是[esi+x0x30C]
的值与0x3E
是否相等?相等,将[esi+0x30c]
赋值成0x85
(单击事件的关键跳转需要的条件)
00457E7C >/. 55 push ebp ;_TForm1_Panel1DblClick,双击事件的响应函数
...
00457EF5 |. 83B>cmp dword ptr ds:[esi+30C], 3E ;关键比较,要求是0x3E
00457EFC |. 75 >jnz short <loc_457F08> ;关键跳转
00457EFE |. C78>mov dword ptr ds:[esi+30C], 85 ;如果[esi+30C]是0x3E,则[esi+30C]=0x85(单击事件的要求)
00457F08 >|> 33D>xor ebx, ebx
...
暴力破解:如果暴力破解的话,将
00457EFC
处的汇编指令改成nop
;每次先双击一下显示图片的界面,再单击一下,就会显示出图片
step 4.寻找第二个突破口
通过分析单击事件([esi+0x30C]值是0x85)、双击事件([esi+x0x30C]值是0x3E)的关键跳转需要的条件发现,只要满足[esi+x0x30C]值是0x3E,2个事件就会同时满足,因此看看代码里什么时候将[esi+x0x30C]赋值为0x3E作为下一个突破口
在OD中,右键 -> Search for -> All constants
中输入3E,查看是否有对[esi+x0x30C]赋值语句?
找到一个怀疑点,定位到相应的反汇编代码,找到对应的函数的入口,发现是_TForm1_chkcode
函数
如果还记得Darkde4
的话,会发现_TForm1_chkcode
函数是注册码输入框键盘按键弹起的响应函数,猜测这个函数就应该是写出程序注册机的关键函数
step 5.chkcode事件分析
在_TForm1_chkcode
函数处设置断点;输入注册码时,当输入第一个字符时就命中断点(因为有键盘弹起的操作)
注意:分析这个程序要吸取教训,作者很喜欢设置一些无关紧要的运算逻辑进行干扰
可以先从第二个突破口开始分析,分析附近代码会发现,用户名"test123"
对应的正确的序列号是"黑头Sun Bird12dseloffc-012-OKtest123"
用这个分析出来的正确序列号验证一下是ok的(先双击后单击才可以),说明分析的是正确的
为了写出注册机器,需要分析一下正确序列号生成逻辑
正确逻辑:先获取用户名长度,加5转换成十进制,然后用特定字符串执行拼接公式:"黑头Sun Bird"+用户名长度+"dseloffc-012-OK"+用户名
step 6.注册机
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char pwd1[30] = "黑头Sun Bird";
char pwd2[30] = "dseloffc-012-OK";
char user_name[100] = {0};
printf("请输入用户名:");
scanf_s("%s", user_name, 100);
printf("对应的序列号:%s%d%s%s\n", pwd1, strlen(user_name) + 5, pwd2, user_name);
system("pause");
return 0;
}
用注册机生成的用户名和序列号,先双击一下显示图片位置,再单击,显示出图片,验证结果:
3.扩展:MAP文件辅助OD进行调试
OD分析程序前,让IDA帮忙自动添加一些函数的签名,这在处理不熟悉的编程语言时很用,当然也可以将自己的一些分析一起进行保存,下面是CrackMe004案例的分析结果
只有个别的函数没有分析成功,这大大减轻了分析的工作量,下面是生成MAP文件给OD使用的方法:
step 1.IDA操作生成.MAP文件
step 2.OD导入.MAP文件
步骤:OD->插件->LoadMapEx加载MAP文件
下面是OD加载MAP文件前后的对比,只要使用过一次MAP文件,相信下次再逆向程序时,你一定先用IDA分析一波
4.参考
- 1.VB程序逆向反汇编常见的函数 - 笨笨D幸福 - 博客园 (cnblogs.com)
- 2.常用软件可以在这里下载:爱盘 - 最新的在线破解工具包 (52pojie.cn)
- 3.160个Crackme_鬼手56的博客-CSDN博客
- 4.《使用OllyDbg从零开始Cracking》系列的文章也不错