下面是网上的160个CrackMe的部分逆向笔记,包括逆向思路、注册机实现和逆向中常用的知识整理
注意:逆向前一定要先操作一下软件,熟悉软件的运行现象;逆向一定要自己操作一遍,看是很难看会的(高手除外)
文章目录
CrackMe006
和CrackMe007是同一个作者,CrackMe006是基础
1.现象
破解程序要求将Ok
按钮和Cancella
按钮隐藏掉,显示出后面完整的图片
2.程序基本信息
无壳,编程语言是Delphi
3.DarkDe工具分析
分析窗口主要关心窗体
和过程
选项卡,里面会看到控件关联的响应函数(或者叫事件)和相应的RVA
2个关键按钮响应事件的RVA都已经找到,可以用OD开始对程序进行分析
先分析哪个按钮?
推荐先分析Cannella
按钮
教训:我先分析的序列号对话框的响应事件
CodiceChange
,然后显示出Ok
按钮,…;如果先分析Cannella
按钮,破解后Ok
按钮变灰会自动取消
4.分析程序-Cancella按钮
不要着急直接用OD加载程序运行,要先用IDA帮我们分析一波,然后生成MAP文件,在OD中导入MAP文件,这可以大大提高效率(下面分析的都是在MAP加载后的基础上进行分析的)
OD中在Cancella
按钮对应的RVA 442E8
(实际是函数的入口地址)处设置断点,输入test123
和456
当做l临时用户名和序列号;点击Cancella
按钮,断点命中后分析响应函数
step 1.响应函数
下面是响应函数的主要处理逻辑
为了让Cancella
控件不可见,响应函数应该执行的流程:
- 1.获取序列号转成十进制;获取用户名
- 2.执行关键函数(
sub_442AF4
,后面会重点分析),期望结果:eax非零 - 3.关键跳转不跳转,会将
Cancella
控件不可见,Ok
按钮使能
step 2.分析关键函数
为了写注册机,要重点分析一下响应函数中的sub_442AF4
函数
提示:为了加快分析的进度,可以使用OD对照着IDA中的分析结果进行动态调试,下面是对照调试的结果(其中IDA和OD很多注释和变量名都被手动修改了>)
调试技巧:对比发现,IDA的反编译是真的香;根据个人习惯,分析关键函数时,OD最好结合IDA一起使用;两者合在一起相当于IDA查看伪源码(IDA也可以动态调试,看个人习惯),OD是调试器
简单总结:
- 1.对用户名进行特定运算后取阶乘,
结果=阶乘((user_name + 4) % 7u + 2)
- 2.然后这个阶乘值 * 用户名中每个字符的ASCII码,累加
- 3.最后总结果与31337进行比较,相等就返回1,表示成功;不相等返回0,表示失败
一句话:用户名计算的伪序列号 - 真正序列号 == 31337,表示注册成功
step 3.注册机
提示:分析时,顺便修改一下IDA中变量名称,且加注释,分析完后IDA中反编译代码基本就是注册机原型了
注册机主要是为了计算出正确的序列号,关键函数有如下公式:
用户名计算的伪序列号x
- 真正序列号y
== 31337
;即x - y = 31337
,得到y = x - 31337
因此,假设序列号是0,有如下注册机代码(核心部分直接copy的IDA中的分析结果)
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cal_factorial(int n) { // 计算阶乘
int num = 1;
for (int i = 1; i <= n; i++) num *= i;
return num;
}
int sub_442AF4(char* user_name)
{
// 阶乘((user_name + 4) % 7u + 2)
int factorial = cal_factorial(*(unsigned __int8 *)(user_name + 4) % 7 + 2);
int accumulate = 0;
int user_name_len = strlen(user_name);
int i = 1;
do
{
// 阶乘*用户名的每个字符的ASCII码,累加
accumulate += factorial * *(unsigned __int8 *)(user_name + i++ - 1);
--user_name_len;
} while (user_name_len);
return accumulate - 31337; //y = x - 31337
}
int main() {
char user_name[100] = {0};
printf("请输入用户名(长度>6):");
scanf_s("%s", user_name, 100);
printf("对应的序列号:%d\n", sub_442AF4(user_name));
system("pause");
return 0;
}
输入算出来的序列号,点击Cancella
按钮;效果是Cancella
按钮消失,Ok
按钮使能
5.分析程序-Ok按钮
一样的套路分析Ok
按钮,下面是Ok
按钮的分析结果
step 1.响应函数
分析时,用IDA和OD一起进行分析,可以定位到关键函数,关键函数要返回1,才能逆向成功
step 2.分析关键函数
下面是关键函数重要部分的分析截图
关键函数中的校验流程如下:循环取出序列号的最后一位,平方,乘以当前序列号还没有处理字符的长度,对0x19取模运算,再加上0x41
对应的公式:len * (int16)sqrt(serial[len--]) % 0x19 +0x41
step 3.注册机
下面是IDA分析的关键函数的主体部分,简单修改一下就可以写出注册机
对应的简易注册机
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char serial[100] = {0};
char user_name[100] = {0};
printf("请输入序列号(长度>6):");
scanf_s("%s", serial, 100);
for (int i = strlen(serial) - 1; i >= 0; i--) {
user_name[i] = (serial[i] * serial[i] * (i + 1)) % 25 + 65;
}
printf("对应的用户名:%s\n", user_name);
system("pause");
return 0;
}
验证结果:
6.完整的验证操作
-
1.用户名逆向出正确的序列号,使
Cancella
按钮消失,Ok
按钮使能示例:test123 -> -30141
-
2.序列号逆向出用户用户名,使
Ok
按钮消失,显示出完整图片,逆向完成示例:-30141 -> “ACMEUG”
7.参考
- 1.VB程序逆向反汇编常见的函数 - 笨笨D幸福 - 博客园 (cnblogs.com)
- 2.常用软件可以在这里下载:爱盘 - 最新的在线破解工具包 (52pojie.cn)
- 3.【反汇编练习】160个CrackME索引目录1~160建议收藏备用
- 4.160个Crackme_鬼手56的博客-CSDN博客
- 5.《使用OllyDbg从零开始Cracking》系列的文章也不错