作为练手的 160 个 CrackMe 系列整理分析

CrackMe 来源:【反汇编练习】160个CrackME索引目录1~160建议收藏备用

011

这个界面稍显不同,只能输入数字 0~9、* 和 # 这几种字符,填入正确序列号后右侧的 “UNREGISTRIERT” 会自动更新为 “REGISTRIERT”。

该程序没有加壳,首先搜索一下字符串,可以看到大量相似和字符串和 “REGISTRIERT” 字样
strings
随便点开一个,往上翻翻就可以看到一个大的 for 循环,里面就是注册验证的流程。找几个其他的字符串引用处,发现代码基本都是类似的,所以先随便找一个看看。

简化后的流程如下:

  1. 取得输入注册码的前7个字符,并转为十进制数字,类似 atoi,若有 * 等符号则自动截断
  2. 从第 1 个字符开始,每次只取单个字符,将字符转为其 ascii 码数字,并与上一步得到的数字相加,再转换为十六进制形式对应的字符串。
  3. 将上一步生成的串依次连接,所有输入字符处理完后即得到最后的注册码。
  4. 最后调用字符串比较函数进行比较,相等则完成注册。

生成的流程知道了,现在来看一下目标字符串,大部分的串都很相似,一开始我以为都是一样的,后来才发现略有不同。因为第 1 步转换的前 7 个字符是固定的,而输入字符被限定在 0~9 和星号井号之内,按照注册码的生成流程,那么每次拼接上的十六进制串之间的值不会相差太大。然后观察这些常量字符串,有大量的 7,并且只有当将串两个一组分开时才会使它们的值比较接近(除去最前面的 0)。而这时其他的字符串的迷惑作用就体现出来了,我开始也以为是有特殊条件生成不同的值。有些串中就含有 “FF”、”7G”、”RR”、”7#” 等无法生成的字符,然后剩下的就是找出正确的目标串。

一个正确的串(其他的我就没管了w)是 “0 81 7E 74 7D 7A 7D 7C 7F 82 83 6D 74 74 7A 7F 7E 7B 7C 7D 82 6D 81 7E 7B 7C”,空格是方便观察插入的,将最小的 6D 带入 ascii 码最小的 #,那么得到第 1 步的数字为 74(0x4A),将该串的前六个字符转化验证一下,0x81-0x4A,0x7E-0x4A,0x74-0x4A,得到 “74*”,说明(运气好ww)是这么转的,然后转换剩下的字符,得到注册码 “74*3032589#**0541238#7412″。