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

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

005

005 比 004 复杂了真不是一点半点,流程一环套着一环。。。有了 004 的教训,这次直接拖 dede, 发现有 upx 的壳,手脱了一下发现 dede 扔识别不了(区段没还原吧),不过没关系,可以直接用 hex 编辑器打开查找事件函数地址,字符串前4字节就是函数的地址了。查找事件处理函数
不过在下断之前,先搜索一下字符串,马上就发现了这个,字符串
定位到函数里发现函数前部有几个跳转,爆破只要把这里干掉就好了,的确很简单。注册处
不过非爆破就要整理这个蛋疼的注册流程了!

观察这几个变量,通过注册需要:

  1. esi+0x304 不等于 0xc34
  2. esi+0x308 不等于 0x230d
  3. esi+0x310 等于 0xf94
  4. esi+0x314 等于 esi+0x318
  5. esi+0x31c 不等于 0x3e7

接下来通过查找定位对各个变量的赋值点,可以直接在 OD 中搜索 0x308、0x310 等偏移常量,收集了一通后结果如下:

  • 初始化:0x304=0xc34(有条件), 0x308=0x28e, 0x30c=0x9, 0x314=0xb, 0x318=0x0。
  • esi+0x308: 进入 Button1MouseDown 5次,使其从 0x28e 累加(每次+3)到 0x29d,注意要右键点击。点击注册按钮
  • esi+0x30c: 通过 Edit2DblClick 进行赋值,该函数同时会校验用户名和密码,而且赋的值是经过处理的 GetDiskFreeSpaceEx 返回值(用户名长度也会产生影响),在下面移动鼠标函数里可以看到它的取值范围是 0~3。0x30c取值
  • esi+0x310: 在 MouseMove 事件中先鼠标(从窗口外)移动到右下角,然后(从窗口外)移动到左下角,使其赋值为 0xf94。mousemove
  • esi+0x314: 在 MouseMove 事件里由 0x30c 的值进行初始化,对应有 4 种不同的值。
  • esi+0x318: 通过点击几张三字经图像会使该变量累加一个值,凑成和 0x314 一样即可。
  • 另外左键点注册会使 0x308 变为 0x230d,并且无法恢复,需要重新运行程序。

一开始没找到 Edit2, 知道应该做了手脚但是没想到那个迷之字符串居然真的是个路径,要准备好文件,后来找了找大神的分析才知道要这么做 _(·ω·」∠)_,然后 Edit2 就出来了,同时这也是突破 0x304 校验的地方。

最后总结一下流程:

  1. 准备好文件 X:\ajj.126.c0m\j\o\j\o\ok.txt,内容为 ” ajj写的CKme真烂!”,注意前面有个空格而且最后有两个不可打印字符 0xff 0xff,手动添加吧。
  2. 右键点击注册按钮5次,双击图像控件空白处激活注册码输入框。(双击空白处时要求 0x308 等于 0x29d)
  3. 用户名:长度为3的倍数,留空也行;注册码:长度为8,第二个字符为下划线,第六个字符为英文逗号。然后双击注册码输入框。
  4. 显示“性相近”图像时将鼠标从窗口外右下角移入窗口。
  5. 显示“性本善”图像时将鼠标从窗口外左下角移入窗口。
  6. 根据第 3 步初始化 0x30c 的情况(有4种值),分别用左键或右键点击图像1~4, 使 0x318 累加至 0x314。我的情况是 0x30c 为 4(输入的用户名长度也有影响), 0x314 被设置为 0xdf, 只要右键点击图四 8 次,左键 1 次即可(0x7 + 0x1b * 8 = 0xdf)。
  7. 操作完成后定时器会自动将按钮文字刷新为“注册了”(不要左键点注册这个按钮,点了会导致 0x308 无法通过校验,也是个坑)。