学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

450

积分

0

好友

15

主题
发表于 2021-1-27 11:53:28 | 查看: 16637| 回复: 3
本帖最后由 Print动 于 2021-1-27 11:54 编辑

主要内容
1.010Editor介绍
2.010暴力破解分析
3.010算法分析
4.010网络验证分析(此项省略)

功能介绍
16进制修改
文本修改
模板解析各种文件格式
文件对比

暴力破解思路
1. 找到注册的窗口
2. 测试注册窗口的反应
3. 根据反应做出下一步分析的打算
猜测APIAPI下断动态调试
挑出敏感字符串,在程序中搜索
4. 动态分析,定位关键跳转,修改代码
5. 动态分析,定位关键call,修改代码

先试试暴力破解
先安装一个正版的010 Editor
30天的有效期

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

输入序列号的地方,随便输点什么进去

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

看一下基本的验证方式,有个弹框

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

查看一下弹出的提示框使用的API 是什么
右键查看一下主模块

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

可以看到有很多对QT5的调用

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

调用很多,查找不是很方便,所以需要用IDA看一下,文件不小,IDA分析时间需要久一点
查看一下导入表,发现没有CreateWindow类的函数调用

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

不管什么样的界面库,想要弹出那个窗口,都是要调用API的。
找到和窗口有关的动态库模块二,user32
还得回到OD 中去找。
就是这个模块儿。
双击进去
这个模块儿里面,都是窗口API函数。

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

如果不知道在哪下断点,就在这四类里面全部下断点了。

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
挨个尝试还是比较麻烦的。
底层调用的应该是CreateWindow

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
Ctrl+G 搜索一下,下断点。

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
Chack一下,断下来了

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
栈回溯分析一下
可以看到调用时从这里开始的

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
挨个进去扫一眼,看看哪个里面有没有敏感字符串

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
看到这里,发现里面有敏感字符串

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
分析一下代码

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
接着向上看

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
测试了一下,这里是可以断下来的,可以判断这里是一个关键跳转。
接着挨个看一下这两个跳转

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
发现这两个跳转是在一起的

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
测试了一下,可以断下来

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
跟着流程走一下,最终发现判断的是第一个标记中eax的值,上面的call应该就是一个关键函数(这是一个C++程序,是一个vs2013版本的程序)

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
关键字符串

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
向上找关键跳转

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
继续向上分析
总体分析截图

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
F7进去,F8运行一下
看到了三个关键的JE跳转

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
将关键跳转置空

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
这里弄失败了,尝试下一个方法
既然你要求DB 是正确的,那么直接给你DB

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
爆破成功了
对了,在这之前还做了一个操作,关闭随机基址,这里忘记截图了

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
爆破到此为止了。
爆破思路总结:
1. 找到注册窗口
2. 测试注册窗口的反应
3. 根据反应做出下一步分析打算
猜测APIAPI下断动态调试
挑出敏感字符串,在程序中搜索
4. 动态分析,定位关键跳转,修改代码
5. 动态分子,定位关键call,修改代码

最简单的方式,弹出提示窗口后,搜索提示的字符串,可以很快找到关键代码。

010算法分析
关键函数
一步一步分析
边测试边写C语言
测试

重新找到关键函数

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
观察一下参数

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
C++程序 ecx传参,这应该是一个This指针
根据提示是一个字符串数组

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
数据窗口跟随05E3A728

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
继续数据窗口跟随

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
密码的位置也找到了

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
Esc返回继续数据窗口跟随

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
不截图了,这个里面就没有什么有用的东西了
***********************************************************

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
如果访问到了用户名和密码再详细分析

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
上面就应该是判断用户名是否为空

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
继续走

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
M看一下  属于全局变量,不清楚是什么东西,先不看这里了
看一下输入的密码

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
跟踪,找到用户名密码的访问代码
一步一步分析,加注释
反复推敲,找出规律
写代码验证

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
从下面的跳转开始看
跟着跳转走一下

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
到现在,第三个字节是确定是
写代码测试一下

int main()
{
srand(time(NULL));
    byte k[10] = { 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA };
        while (true)
        {
                byte k0 = rand()%0xFF;
                byte k6 = rand() % 0xFF;
                byte al = (k0 ^ k6 ^ 0x18 + 0x3D) ^ 0xA7;
                if (al > 0)
                {
                        k[0] = k0;
                        k[6] = k6;
                        break;
                }
                while (true)
                {
                        byte k1 = rand() % 0xFF;
                        byte k7 = rand() % 0xFF;
                        byte k2 = rand() % 0xFF;
                        byte k5 = rand() % 0xFF;
                        DWORD ESI = (0x100 * (k1 ^ k7 & 0xFF) + k2 ^ k5 & 0xFF) & 0xFF;
                        DWORD EAX = (((ESI ^ 0x7892) + 0x4d30) ^ 0x3421) & 0xffff;
                        if (EAX % 0XB == 0 && EAX / 0XB <= 0X3E8)
                        {
                                k[1] = k1;
                                k[7] = k7;
                                k[2] = k2;
                                k[5] = k5;
                                break;
                        }
                }
        }
        printf("%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X\n", k[0], k[1], k[2], k[3], k[4], k[5], k[6], k[7], k[8], k[9]);
        system("pause");
        return 0;
}

4122-3344-5566-7288-99AA
输入程序测试一下
前面分析的没有问题
下面分许用户名用到的代码

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
用户名经过加密

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
偷个懒,吧程序附加到IDA

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
OD中进入函数

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
F5进来看一下

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
看着还是比较轻松的

双击这个数组,从IDA中把数组的地址复制下来去OD中找一下,复制出来。

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
OD中找一下数组基址

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
名字改一下,然后吧函数复制出来。

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
参数名和函数名改一下

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破
关键代码

while (true)
        {
                BYTE k0 = rand() % 0xFF;
                BYTE k6 = K[6];
                BYTE al = (k0 ^ k6 ^ 0x18 + 0x3D) ^ 0xA7;
                if (al >= 9)
                {
                        K[0] = k0;
                        K[6] = k6;
                        break;
                }

        }
        while (true)
        {
                BYTE k1 = rand() % 0xFF;
                BYTE k7 = K[7];
                BYTE k2 = rand() % 0xFF;
                BYTE k5 = K[5];
                DWORD ESI = (0x100 * (k1 ^ k7 & 0xFF) + k2 ^ k5 & 0xFF) & 0xFFFF;
                DWORD EAX = (((ESI ^ 0x7892) + 0x4d30) ^ 0x3421) & 0xFFFF;
                if (EAX % 0XB == 0 && EAX / 0XB == nRet)
                {
                        K[1] = k1;
                        K[7] = k7;
                        K[2] = k2;
                        K[5] = k5;
                        break;
                }

去除网络验证(上面爆破中,有关键函数,自己进去找一下)

两种方法破解010Editor--编写注册机--爆破

两种方法破解010Editor--编写注册机--爆破

算法总结
1. 判断用户名密码是否为空
2. 将密码字符串转为16进制字节数据
3. 验证密码16进制
4. K[3] = 0X9C 或者 0XFC或者0XAC
5. SUB_00407644函数的返回值不能为0
6. SUB_004083C8函数的返回值不能为0且小于等于03e8
7. 将用户名转为ascii字符串

注册机总结
1. 通过随机字节穷举符合条件的值
2. 指定用户名,调用加密函数求出KEY
3. KEY拆分,指定到密码字节数组
4. 穷举剩下的字节

注册机源码.rar

8.45 MB, 下载次数: 5, 下载积分: 学币 -3

两种方法破解010Editor--编写注册机--爆破

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

    发表于 2021-2-2 13:59:43
    每天都有1次免费给楼主评分送学币的机会!
    timfang 发表于 2021-5-6 17:14 详情  回复
    先占楼,再膜拜

      发表于 2021-5-6 17:14:48
      少年持剑 发表于 2021-2-2 13:59
      每天都有1次免费给楼主评分送学币的机会!

      先占楼,再膜拜
      发表于 2021-5-12 21:34:12
      吃水不忘挖井人,我也去发帖分享好的资源。

      小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

      GMT+8, 2024-11-21 23:02 , Processed in 0.486897 second(s), 56 queries .

      Powered by Discuz! X3.4

      Copyright © 2001-2021, Tencent Cloud.

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