新160个CrackMe分析-第2组:11-20(下)

作者:selph

 

目录:

• 011-wocy.11

• 012-ACG-crcme12

• 013--Acid_burn3

• 014-Splish4

• 015-BradSoblesky.15

• 016-fly_crkme36

• 017-Cabeca7

• 018-crackme_00068

• 019-Acid_Byte.39

• 020-cosh.310

011-015请看上期

1.      016-fly_crkme3

算法难度:⭐⭐⭐

爆破难度:⭐

信息收集

运行情况:

          

查壳与脱壳:

UPX壳,直接ESP定律脱壳即可

 

         

调试分析

Delphi程序,截图不方便注释,之后用IDR直接复制代码到everEdit里写注释了:

找到校验按钮,分析校验函数sub_00444B30:

首先是判断用户是否有输入,无输入则弹窗,有输入则跳转到00444B78:

 

 

接下来校验输入的数据,输入的内容必须是0x30~0x39之间,也就是纯数字:

          

接下来校验字符串长度:这个cm允许的输入是9,10,11字符,对于每种输入都有单独的计算,这里以输入长度为9位为例:输入格式是xx-xxx-xx

 

接下来进行了一个取数字的操作:进行了7段,总之就是把字符串中间的-去掉,把数字拼接在一起

 

取完数字之后,转换成Int类型保存起来:

 

          

接下来又进行了7段运算,运算出结果累加起来:

 

          

这里调用了一个00444B20的函数,功能类似C的pow函数,对一个数(eax)求n(edx)次方,这里Delphi函数调用约定是fastcall:

 

          

累加完成之后会进行对比:累加的值和输入的数字是否一样

 

          

相同则跳转到成功提示上:

 

          

然后再往下就是10字节长度和11字节长度的运算对比了,方法类似,都是分别计算一个次方,然后和原数比较,相同则成

算法分析

注册码生成算法:

     #define _CRT_SECURE_NO_WARNINGS
#include
#include

int main()
{
    for (int i = 1000000; i < 9999999; i++)
    {
        int sum = 0;
        char tmp[8] = { 0 };
        _itoa(i, tmp, 10);

        for (int j = 0; j < 7; j++) sum += pow(tmp[j]-'0',7);
        if (i == sum)std::cout << i << std::endl;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极安御信安全研究院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值