算法难度:⭐⭐
爆破难度:⭐⭐
信息收集
运行情况:
查壳与脱壳:
无壳,Delphi程序,那个年代很流行Delphi啊
查字符串:
存在一些提示字符
调试分析
依然是拖IDR,复制出来在编辑器里写注释
窗口里有两个事件,一个是Name编辑框键入的时候触发的,一个是点击Try按钮触发的
直接看按钮的验证逻辑:经过函数初始化部分之后,判断了两个数字,不为0则向下进行,然后一系列获取编辑框的值,判空
这一段主要是判断三个编辑框是否有输入,无输入就骂你傻子,然后清空编辑框
接下来判断序列号,第一个数字和序列号1对比,第二个数字和序列号2对比,如果都对比上了,则提示成功
后面就是验证失败的逻辑了,到这里问题来了,这两个数字是哪来的?刚刚看到界面还有个键入事件,去看看这个函数:
首先校验键入的值的合法性,是否小于0x80,也就是是否是ascii字符,不是就跳转,是就往下走
对字符减去8作为索引,从数组中取一个值,以这个值作为新的索引去跳转表中去跳转执行
看看跳转表跳转地址的功能:就是操作这两个值,然后返回
这两个数字是在键入Name的时候生成的
暴力破解
爆破思路就是去改校验时候的那几个跳转,比如判空跳转,对比跳转等
算法分析
写注册机逻辑也很清晰了,对于每一个Name的字符,都进行一个指定的操作,就是对两个数字进行add,但是要录入很多数字,麻烦,这里直接手算一个输入:
Name = s
Serial1 = 2224
Serial2 = 1
结果:
总结
新160个CM里第一次见到的新姿势:通过键入事件在输入时自动生成校验码