CrackMe006:隐藏掉按钮

下面是网上的160个CrackMe的部分逆向笔记,包括逆向思路、注册机实现和逆向中常用的知识整理

注意:逆向前一定要先操作一下软件,熟悉软件的运行现象;逆向一定要自己操作一遍,看是很难看会的(高手除外)

CrackMe006CrackMe007是同一个作者,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(实际是函数的入口地址)处设置断点,输入test123456当做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.参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值