160CrackMe-004

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

初探

打开程序,看到需要输入用户名和注册码,提示如果正确下面会出现一张朱茵的照片。

分析

使用DIE查看一下,无壳,使用Delphi编写的。

使用OD搜索一下字符串,可以看到几个字符串,其中有恭喜注册成功的字样,可以看到还有黑头这样的问题,但是点进去查看没有什么。

下断点在恭喜这里,但是看不到什么有用的信息,在获取用户名的长度,然后加上循环次数这样,但是这并不是注册码,然后跳转的关键在esi+0x30c这里,如果这里的值不等于0x85就会跳转到失败。

此时想到刚才的黑头这样的字样,在程序中出现这样的感觉多少会和注册码有点关系。

那个地方只有在程序运行的时候才会到达,当跑起来下断是不会断下来的,那里如果出现这样的字眼,并且调用的都是同一个函数,那么有没有可能就是把字符串存在内存里,找到地方下一个断点看看,如果注册码确实用到的话肯定会调用。

根据字符串找到地方跟一下,发现这里有一个地方向一个地址写入了这些字符串,在这里下一个硬件访问断点看看。

下断点之后,刚输入注册码就断下来在一个地方,跑几步,看到寄存器有一个值,这很像注册码。

大致分析看一下,可以看到在这里有一个向esi+0x30c写入3c的地方,这里有一个JNZ决定是否执行,那么这里应该是一个很关键的地方

看这里,在前面进行了一个比较,然后决定是否跳转。12345是我们输入的注册码

而黑头Sun Bird12dseloffc-012-OKb1ackie这个是生成的,可以看到b1ackie是用户名目前只有中间这个12不知道是如何生成的,继续分析一下。

1
2
3
4
5
00457D2C  |.  8B45 E0       mov eax,dword ptr ss:[ebp-0x20]                  ;  输入的注册码
00457D2F |. 8B93 18030000 mov edx,dword ptr ds:[ebx+0x318] ; 生成的
00457D35 |. E8 52BFFAFF call CKme.00403C8C
00457D3A |. 75 0A jnz short CKme.00457D46
00457D3C |. C783 0C030000>mov dword ptr ds:[ebx+0x30C],0x3E

这个数字是在前面生成的,是根据输入用户名的长度加上0x5生成的。ebx+0x2F8中是长度,可以通过同样的下断点方法去分析这里的值。

1
2
3
4
5
6
00457C66  |.  8BB3 F8020000 mov esi,dword ptr ds:[ebx+0x2F8]                 ;  用户名长度
00457C6C |. 83C6 05 add esi,0x5 ; 加上0x5
00457C6F |. FFB3 10030000 push dword ptr ds:[ebx+0x310]
00457C75 |. 8D55 F8 lea edx,dword ptr ss:[ebp-0x8]
00457C78 |. 8BC6 mov eax,esi
00457C7A |. E8 85FEFAFF call CKme.00407B04 ; 转字符串(10进制)

这里只要相等就会给关键地址赋值0x3E,但是并不是0x85,继续在这里下断点看一下什么情况。(此时输入黑头Sun Bird12dseloffc-012-OKb1ackie就可以注册成功,不过点击一次是不行的,要连续点击好几次才行)

但是每次点击都会断在恭喜的那个JNZ那里,可以发现值并没有被改变,还是3E,是我断点的问题,不要下访问断点,改成写入断点,看看在哪里可以写入85。

然后疯狂点击图片,就会断下来,可以看到这里先判断是否等于0x3E然后再赋值0x85。

什么情况才会到这里,其实就是双击会到这里,而普通的点击就是刚开始0x85比较那里,还是借助Dedark工具可以看的更仔细,可以看到事件,用这个工具可以很方便的定位到刚才的几个地方而不需要借助硬件断点,很方便。

那么现在整个流程就清楚了,需要输入正确的注册码之后,先双击再点击就可以成功注册。

注册机编写

注册码很简单,获取用户名的长度,然后加上5,放在黑头Sun Bird和dseloffc-012-OK中间,最后再加上用户名即可。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>

int main() {
printf("输入name:\n");
char name[20];
gets_s(name, 20);
int len = strlen(name);
len += 5;
printf("注册码:\n");
printf("黑头Sun Bird%ddseloffc-012-OK%s", len, name);
}


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