selph
selph
发布于 2022-07-20 / 192 阅读
0
0

新160个CrackMe练习:017-Cabeca

算法难度:⭐⭐

爆破难度:⭐⭐

信息收集

运行情况:

image

查壳与脱壳:

无壳,Delphi程序,那个年代很流行Delphi啊

image

查字符串:

存在一些提示字符

image

调试分析

依然是拖IDR,复制出来在编辑器里写注释

窗口里有两个事件,一个是Name编辑框键入的时候触发的,一个是点击Try按钮触发的

image

直接看按钮的验证逻辑:经过函数初始化部分之后,判断了两个数字,不为0则向下进行,然后一系列获取编辑框的值,判空

这一段主要是判断三个编辑框是否有输入,无输入就骂你傻子,然后清空编辑框

image

接下来判断序列号,第一个数字和序列号1对比,第二个数字和序列号2对比,如果都对比上了,则提示成功

image

后面就是验证失败的逻辑了,到这里问题来了,这两个数字是哪来的?刚刚看到界面还有个键入事件,去看看这个函数:

首先校验键入的值的合法性,是否小于0x80,也就是是否是ascii字符,不是就跳转,是就往下走

对字符减去8作为索引,从数组中取一个值,以这个值作为新的索引去跳转表中去跳转执行

image

看看跳转表跳转地址的功能:就是操作这两个值,然后返回

这两个数字是在键入Name的时候生成的

image

暴力破解

爆破思路就是去改校验时候的那几个跳转,比如判空跳转,对比跳转等

算法分析

写注册机逻辑也很清晰了,对于每一个Name的字符,都进行一个指定的操作,就是对两个数字进行add,但是要录入很多数字,麻烦,这里直接手算一个输入:

Name = s
Serial1 = 2224
Serial2 = 1

结果:

image

总结

新160个CM里第一次见到的新姿势:通过键入事件在输入时自动生成校验码


评论