160CrackMe-001

本文最后更新于:2021-08-09 晚上

初探

打开程序会弹出如下的窗口,根据标题可以看出,我们需要“杀死”这个弹窗。

程序主题界面有两部分,第一部分是序列号加名字。

第二部分是单纯的序列号,应该是比较简单。

看完大体流程,开始分析。

分析

查询程序的基本信息,可以看到未加壳,是用Delphi语言编写的。

先分析单纯的序列号。

用OD打开程序,搜索字符串,搜索错误的提示,可以看到成功与错误的提示,还有一个JNZ,这里应该是关键的判断跳转。

在函数头部下断点,开始分析。可以看到它把Hello和Dude!压入栈之后,再将其拼接起来组成新的字符串,然后再与我们输入的序列号进行比较。

那么这里的序列号就是Hello Dude!。输入正确的序列号之后,弹出正确的窗口。

再来分析序列号加用户名

还是通过搜索错误提示的字符串,即可找到关键的跳转,在最后的跳转前查看一下,可以看到栈存放着两个值进行比较,一个是我们输入的123456,另一个是CW-80360-CRACKED,那么这个应该是要输入的serial。往上开始寻找这段序列号是如何生成的。在函数头部下断开始分析。

首先是检测了输入的用户名长度,不可以小于4位。

继续往下看,可以看到CW,-,CRACKED和数字这几段,然后通过一个函数将它们拼接起来,字母都是本身有的,那么就需要寻找数字的生成。

数字是通过sub_406718生成的,而其中的参数是通过0x431750处传入的,那么这个值是从哪来的,从上分析。可以看到这里的计算过程。它是获取输入用户名第一位然后乘以0x29再乘以2。而之后的sub_406718作用是将十六进制转为十进制字符串。

到这里整个过程就分析了,开始尝试编写注册机

注册机编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "pch.h"
#include < stdio.h >
#include <string.h>
#include <corecrt_malloc.h>
int main()
{
char Name[20];
printf("请输入大于四位的用户名\n");
gets_s(Name, 20);
int Num;
Num = (Name[0] * 0x29) * 2;
char* s1="CW";
char* s2 = "CRACKED";
char* s3= "-";
char* serial = (char*)malloc(100);
sprintf(serial, "%s%s%d%s%s", s1, s3, Num, s3, s2);
printf("用户名是:%s\nserial是:%s", Name, serial);
return 0;
}

输入用户名b1ackie,就可以计算出正确的serial。

输入正确的值查看

弹窗的消除

先根据弹窗的提示信息,搜索字符串,可以定位到此处。

执行出来,可以看到在外部有一个JZ跳转可以跳过这个弹窗函数,我们只需要将其修改为JMP就可以无条件跳走了。

小结

第一个crackme,还是比较简单的,没有什么难度,做起来比较轻松。

还记得上次做这个还是大一的时候,那个时候也刚接触这块没多久,当时还是看着帖子一步一步学着来。学习记录还是要坚持做下去,这些crackme也要坚持争取全部都做一遍。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!