# 160个CrackMe 003 Afkayas.2

CrackMe 003是002的加强版,我们看看加强在哪里。

OD运行,发现提示代码可能显示会出现问题,有压缩,用PEDI查一下,
4.png-11.9kB

发现程序并没有壳,这样即使有压缩,我们也可以手动脱掉。
首先,伪码检测:
1.png-6.4kB

进入OD,查找参考文本字符串,之后Call进去


2.png-15.2kB

向上大致查看一下程序的流程,然后找到函数的头部,F2下断,注意这个函数有点长,需要耐心一点

3.png-12.5kB

F9跑起来,输入我们的伪码,开始单步调试,还是同样的原则,先F8,遇到不认识的VB API函数就去查一下他是干什么的,我们需要做的是了解程序的流程,再遇到类似vbaobjset或者vbastrset等明显无关的函数时候可以过得稍微过得快一点,知道看到了熟悉的一段代码;

这段汇编代码与CrackMe2中的代码的流程是一样的,算法就是
(name的长度)*0x15B38+第一个字符的ASCII码值)转成10进制字符串,这个简单。

之后,我们再向后看,肯定有不同的位置,发现出现了浮点数运算:

这里推荐一个介绍x86下的浮点数汇编的博客,很详细
inter x86 浮点寄存器笔记

我们继续对代码进行分析,到跳转条件前一共主要出现了四段浮点数的汇编部分:
5.png-13.1kB

第一部分:

其实这部分并没有做什么实质上的工作,不过通过浮点数运算对内存中的数据进行改动(我们后面会发现这些内存地址都用了,但我们并不需要考虑这些,直接当做硬编码处理就可以了)。

第二部分:

可以看到,这部分对输入的name进行了简单的浮点运算:name=name*3-2

第三部分:

又对name进行了简单的操作,name=name-(-0x15);
第四部分:

第四部分实现的就是上面步骤生成的serial与我们输入的serial进行比较,只不过利用了有一点迷糊性质的浮点数除法,判断结果是否等于1而已。

现在在name=12345的情况下我们得到的serial字符串:
7.png-1kB
OK,对现在分析得到的serial进行检验:
8.png-125.9kB

正确,好的,我们在总结一下算法
首先通过(name的长度)*0x15B38+第一个字符的ASCII码值)转成10进制字符串算出serial,然后serial*3-0x2+0x15算出serial。

写出注册机:(python)

结果:
10.png-2.9kB

检验:
9.png-28.3kB

最后,其实很简单,不过用浮点数汇编来迷惑罢了。

转载于:https://www.cnblogs.com/Space-of-Bruce/p/5529500.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值