170530 逆向-CrackMe(6)

来源:互联网 发布:amd 知乎 编辑:程序博客网 时间:2024/06/05 00:10

1625-5 王子昂 总结《2017年5月30日》 【连续第241天总结】

A.CrackMe(6)

B.CrackMe(5)的难度是三星╮(╯_╰)╭自认为还是个菜鸟没可能通过,所以先做后面简单的吧

先拖入PEiD,发现是Delphi,无壳

放入OD中运行,点击HELP后知道本程序有两关:首先OK按钮是无效的,需要通过cancella使其有效;然后才能使用OK

字符串查找,发现没有任何有意义的单词

拖入DeDe,找到Cancella触发事件的地址,在OD中下断并跟随

逐步运行,在最后的地方找到一个test al,al后je,估计此处为关键跳转

爆破成功

同理,在DeDe中找到OK触发事件的地址,在OD中下断并跟随

逐步运行,在最后的地方同样是test al,al和je,爆破也成功


注册算法:

Cancella的地方逐步跟随,一步一步研究尝试,最终明白算法:

首先,Name的长度要大于5才能继续

取Name的第五个字符的ASCII码,除以7后取余,+2后阶乘,设结果为A

把Name的每个字符的ASCII与A相乘,结果累加后减去注册码

与0x7A69相等则判断通过

我的解决方法是随便输入一个Name,然后在内存中跟随得到结果,再用7A69相减逆推出注册码

这样的话注册机就很好做出了:同样算法得到结果,与7A69作差,结果就是注册码了

ps:我本来以为负数会导致错误的,尝试了一下结果可以╮(╯_╰)╭ 也对,StrToInt当然可以识别负数吧

然后进入到最后的serial算法,同样道理一步一步跟,基本类似:

首先,Serial的长度要大于5才能继续

把Serial的每个字符的ASCII平方后取16进制下的低四位,然后乘以位数,再除以19,余数+0x41后作为该位的值

每个字符处理以后形成一个新的字符串,与Serial比较,相等则通过

值得一提的是似乎重复进行了两次完全相同的比较,难道是防止爆破?爆两次不就行了吗_(:з」∠)_

ps:Serial不允许输入数字以外的字符,但是Name允许

判断过程非常复杂,重复性极强,不断重复判断单个字符。没有尝试各种组合来跟下去

但是只要相等似乎就能通过

这样注册机似乎只能反过来做,由Serial得到Name的值


另外,在下断过程中发现有一个事件会在修改Serial的文本框时触发,但是由于Cancella和OK两个按钮已经能完成所需功能,就没去跟运行


在查看他人的逆向过程时,发现他认为是有3个事件:修改文本框时如果Serial满足条件可使OK有效;点击Cancella可使Cancella消失;点击OK可使OK消失

不过我在逆的时候点击Cancella可以使Cancella消失、同时OK有效

还有就是他觉得只能输入一次Name和Serial,同时满足三(两)个条件

然而程序本身是允许分别输入分别通过的

如果同时满足两个条件的话就需要写注册机进行穷举了,应该难度不大吧

C.明日计划

CrackMe(7)

原创粉丝点击