吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8625|回复: 15
收起左侧

[原创] 160个Crackme026之六段式注册码详解

  [复制链接]
鬼手56 发表于 2019-4-12 10:35
本帖最后由 鬼手56 于 2019-4-12 10:39 编辑

查壳

1554987561204.png

这个Crackme也是用VB写的,难度是问号,自我感觉应该值三颗星

分析程序

1554987667323.png

首先根据字符串提示,来到按钮点击事件的开头

1554987720250.png

下断点,随便输入一个用户名和序列号,开始分析程序

1554987773580.png

算法分析

这个程序的算法分成六个部分,下面依次对每个部分的算法进行详细的讲解

基础校验


1554987920939.png

首先获取输入的用户名的长度,必须大于4,如果不大于则提示错误

第一部分

最难也是最麻烦的就是第一部分了,如果解决了这个部分,那么后面剩余的四个部分就不成问题

1554988016167.png

1-1 首先获取用户名长度,然后以用户名长度作为循环的次数,开始一轮循环,即i=strlen(username)

1554988129548.png

1-2 获取用户名第一位的ASCII值->username[0]

1554988218045.png

1-3 用户名的第一位的ASCII值乘以432.4再乘以17.79,->`username[0]*432.4*17.79`

1554988413840.png

1-4 将1-3-result除以0x15,然后把浮点数值转为字符串->`username[0]*432.4*17.79/0x15`

1554988490649.png

1-5 跳到循环开始处,开始新一轮循环

1554988588085.png

1-6 取最后一次循环的计算结果,然后舍去小数部分->`username[usernameLength-1]*432.4*17.79/x0x15`

1554988822140.png

1-7 将1-6的结果转为浮点数后加上用户名的第一个字节的ASCII值 这个就是完整的第一部分的算法了

用代码表示这部分的算法结果如下:

(username[usernameLength - 1] * 432.4*17.79 / 15 + username[0])

剩下的几部分算法也都是基于这个部分的结果

第二部分

1554989226749.png

2-1 首先将用户名的第一位的ASCII值乘以0x19->username[0]*0x19

1554989390493.png

2-2 用1-4的结果减去2-1的结果,->(username[usernameLength - 1] * 432.4*17.79 / 15 - username[0] * 0x19)

第三部分

第三部分直接就是第一部分以十六进制形式转成字串的结果->username[usernameLength - 1] * 432.4*17.79 / 15

第四部分

1555034606179.png

第四部分就是用username[0]*用户名的长度再减去0x1B->username[0] * usernameLength - 0x1b

第五部分

1555034861844.png

第五部分就是用户名的长度

第六部分

1555034936360.png

第六部分是固定的字符串"-CM",拼接完第六部分之后就算关键的比较函数了。

以上就是这个程序的完整的算法,另外这个作者好像还有点皮,会用SendKey来模拟键盘按键给你捣乱,但对调试程序影响不大。

写出注册机

根据每一部分的算法 我们可以写出这个程序的注册机 代码如下:


[C++] 纯文本查看 复制代码
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
        char username[20] = { 0 };
        printf("请输入用户名:");

        scanf_s("%s", username, 20);
        int usernameLength = strlen(username);
        if (usernameLength < 5)
        {
                printf("用户名长度必须大于5");
        }
        char key[50];
        char key1[10], key2[10], key3[10], key4[10], key5[10];
        sprintf(key1, "%d", (int)(username[usernameLength - 1] * 432.4*17.79 / 15 + username[0]));
        sprintf(key2, "%X", (int)(username[usernameLength - 1] * 432.4*17.79 / 15 - username[0] * 0x19));
        sprintf(key3, "%X", (int)(username[usernameLength - 1] * 432.4*17.79 / 15));
        sprintf(key4, "%d", (int)(username[0] * usernameLength - 0x1b));
        sprintf(key5, "%d", usernameLength);
        memset(key, 0, sizeof(key));
        strcat(key, key1);
        strcat(key, key2);
        strcat(key, key3);
        strcat(key, key4);
        strcat(key, key5);
        strcat(key, "-CM");
        printf("%s\n", key);
        system("pause");
        return 0;
}



验证结果

1555035405871.png

输入注册机算出的序列号,提示成功 破解完成

最后,需要udd相关文件的可以到我的Github下载:https://github.com/TonyChen56/160-Crackme

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
md1993 + 1 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

fishinfire 发表于 2019-5-27 10:54
有个问题,这里不是应该0x15 吗?

sprintf(key1, "%d", (int)(username[usernameLength - 1] * 432.4*17.79 / 15 + username[0]))
 楼主| 鬼手56 发表于 2019-4-13 12:04
_默默_ 发表于 2019-4-13 08:44
发现做crackme的大佬都不用ida

这个程序是用VB写的 用ida意义不大
_默默_ 发表于 2019-4-13 08:44
hgystrike 发表于 2019-4-13 10:12
不明觉厉,66666666666
ibrucekong 发表于 2019-4-16 07:07
认真看每一个步骤,学习了,还从未crack过
zxkj13 发表于 2019-4-28 21:43
nbkbnbkbnbkbnbkb
mashan2014 发表于 2019-4-29 08:43
努力学习,争取天天向上。感谢分享!
木木啊 发表于 2019-4-29 20:23
虽然看不懂 但是还是觉得好厉害
 楼主| 鬼手56 发表于 2019-4-29 21:51
木木啊 发表于 2019-4-29 20:23
虽然看不懂 但是还是觉得好厉害

哈哈哈哈 并不厉害 你也可以
头像被屏蔽
淡若清风云 发表于 2019-5-1 14:22
努力学习,争取天天向上。感谢分享!3

虽然看不懂 但是还是觉得好厉害

哈哈哈哈 并不厉害 你也可以
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-22 15:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表