吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11705|回复: 37
收起左侧

[原创] 《XXX考试学习系统2016单机版》破解笔记

  [复制链接]
herculesrance 发表于 2016-7-24 22:16
本帖最后由 H夜 于 2019-6-6 18:13 编辑

本人对破解完全出于兴趣,这次要破解的程序《英格驾驶员考试学习系统2016版》单机版,官网网址如下:http://www.jsyst.cn/product/,安装程序在此下载,注册机见附件。 这个程序无壳,比较简单,适合我等学习练手。废话不多说,先直接双击程序,进入界面如下,需要注册码,随便输入数字,点击注册,弹出对话框,知道程序是重启验证。

1

1
由此想着MessageBox断点,于是用OD载入,断在此处:

2

2
可知程序是VB写的,下bpx RtcMessageBox,看看能否断下,下完断点,点击注册,程序没断下来,只好另寻他路。搜索字符串(UNICODE),可以找到点有用的信息:“注册码已保存,重启程序生效!”来到这个位置:

3

3

向上翻不远处,可以看到vbaFileOpen函数,还有\reg.dat字符串。

4

4
于是大胆猜测:reg.dat就是我们输入注册码后保存的地方。可以在程序根目录下发现reg.dat文件。记事本打开这个文件,发现并不是我们输入的12345,应该是加密了的,不管他。继续猜:既然是重启验证,肯定下次启动时,程序会先读reg.dat,才能跟正确的注册码判断。
大胆猜测,小心求证:直接搜索reg.dat字符串下断也行,给__vbaFileOpen下断也行,重启后果然断下,来到:

5

5
跟进这个call 0048C2B0:

6

6

继续跟,通过这个call调用DeviceIOControl函数,得到硬盘序列号(我的机器是8字节)和硬盘型号等信息。
回到00490E5F,知道了这个函数功能是取硬盘序列号,返回值在EAX里,再往下走几步,到了关键算法:

7

7

创建一个固定数组A[8]={37,18,17,4A,30,3E,79,D4},然后依次与硬盘序列号每一字节异或。得到新数组B[8],然后有一固定序列(长度为62,十六进制为3E):                 ;  abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,
B%3E+1,在序列里找到;然后B/3E+1,在序列里找到,最后组成16字节数组就是注册码。剩下任务就是写注册机了。(由于是菜鸟,写个注册机还要翻基础知识,特别是读取硬盘序列号还是从网上copy的函数,还有char*转char[],关于char运算要先转换为unsigned char,再转换为int,注册机程序在本机xp系统下测试通过,不知道在win7以上效果如何。)
第一次发文,朋友们轻喷,不对的地方,请指正。
之前的分析确实有点问题,出于咱严谨的态度,经过再一次调试。
最后算法基本如下:
1、取得本机第一个硬盘的序列号并转化为char型数组A[c](各硬盘序列号位数c可能不一样);
2、创建一个十位char数组B[10]={37,18,17,4A,30,3E,79,D4,B7,93};
3、依次取A[]^B[10](满足A[c]的位数:当c<=10时,B[10]按顺序取,当c>10时,B[10]取完了重新取B[0]),结果放入C[c];
4、读取固定字符串"bcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",并转化为char数组D[62],字符串的长度为62(即0x3E);
5、依次从数组C[c]中取C,将C除以D[62]的长度0x3E,商存入Ei,余数存入Fi;
6、依次从数组D[62]中取D[Fi]、D[Ei],结果存入char数组G[2*c],这个G[]就是最后的序列号。
源代码如下:
int main(int argc, char* argv[])
{
        char* temp;
        char hdID[256];
        char sample[256];
        char serial[256];
        char crypt[10]={0x37,0x18,0x17,0x4A,0x30,0x3E,0x79,0xD4,0xB7,0x93};
        strcpy(sample,"abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\0");
        int samlenth=62;
    CGetHDSerial HDSerial;  // 创建实例   
    temp=HDSerial.GetHDSerial(); // 得到硬盘序列号
        int i=0;
        int j=0;
        int h=0;
        int n=0;
        int k=0;
        int m=0;
        while(temp!='\0')//去掉硬盘序列号前面的空格
        {
                if(temp!=0x20)
                {
                        hdID[j]=temp;
                j++;
                }
            i++;
        }
        hdID[j]='\0';
    cout<<"your computer harddisk serial number is:"<<hdID<<endl<<endl<<endl;
    for(i=0;i<j;i++)
        {        h=(i>=10)?(i-10):i;
                {k=2*i;
                 hdID=hdID^crypt[h];
                 n=(int)(unsigned char)hdID%samlenth;
                 m=(int)(unsigned char)hdID/samlenth;
                 serial[k]=sample[n];
                 serial[k+1]=sample[m];
                }
        }
    serial[k+2]='\0';
        cout<<"the serial number is: "<<serial<<endl;
        getchar();
         return 0;
}

注册机(修改).zip

34.52 KB, 下载次数: 154, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 8热心值 +8 收起 理由
bailandi + 1 谢谢@Thanks!
lgg51 + 1 谢谢@Thanks!
浅笑如昔丶 + 1 感谢 楼主,希望能维护更新!
yeyulang + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
luozh7682 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Hmily + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
呱叽呱叽 + 1 谢谢@Thanks!
dengyaning + 1 谢谢@Thanks!

查看全部评分

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

 楼主| herculesrance 发表于 2016-7-26 16:04
Hmily 发表于 2016-7-26 15:17
建议把算法分析部分完善一下。


有老大的支持,必须重新再梳理一遍。
之前的分析确实有点问题,出于咱严谨的态度,经过再一次调试。
算法基本如下:
1、取得本机第一个硬盘的序列号并转化为char型数组A[c](各硬盘序列号位数c可能不一样);
2、创建一个十位char数组B[10]={37,18,17,4A,30,3E,79,D4,B7,93};
3、依次取A[]^B[10](满足A[c]的位数:当c<=10时,B[10]按顺序取,当c>10时,B[10]取完了重新取B[0]),结果放入C[c];
4、读取固定字符串"bcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",并转化为char数组D[62],字符串的长度为62(即0x3E);
5、依次从数组C[c]中取C,将C除以D[62]的长度0x3E,商存入Ei,余数存入Fi;
6、依次从数组D[62]中取D[Fi]、D[Ei],结果存入char数组G[2*c],这个G[]就是最后的序列号。


由于现在在单位,注册机以及c源码回家后重新再写,一并奉上。

点评

整理到正文中吧,赞  详情 回复 发表于 2016-7-26 17:17
 楼主| herculesrance 发表于 2016-7-29 19:34
byh3025 发表于 2016-7-29 15:43
不过现在我用假码注册时出现了这,不知是哪里出问题了

确实是。
[Asm] 纯文本查看 复制代码
0045AD54   .  83F8 09       cmp eax,0x9                              ;  Switch (cases 0..9)  [color=Red]这里应该是个消息处理函数,9个分支,可以到每个分支里看看,如果往下2行有 JE语句,改成JNE,爆破OK。[/color]                                 
0045AD57   .  0F87 3C130000 ja 货车科目.0045C099
0045AD5D   .  FF2485 FCC045>jmp dword ptr ds:[eax*4+0x45C0FC]
0045AD64   >  E8 C75F0300   call 货车科目.00490D30                       ;  Case 0 of switch 0045AD54
0045AD69   .  66:85C0       test ax,ax
0045AD6C   .  0F84 BE120000 je 货车科目.0045C030                     [color=Red]就是这里JE改为JNE[/color]


Jack.K 发表于 2016-7-24 22:26
搞不懂这种科目一的软件还要收费,网上不是一大堆免费吗?科目二模拟车的收费还正常!
 楼主| herculesrance 发表于 2016-7-24 22:33
Jack.K 发表于 2016-7-24 22:26
搞不懂这种科目一的软件还要收费,网上不是一大堆免费吗?科目二模拟车的收费还正常!

所以说要撸掉嘛。
 楼主| herculesrance 发表于 2016-7-24 22:37
这个软件无壳,函数和注册码也都是明文保存,破解起来不难。关键是真要写点东西的时候,还是要到网上查知识,学到不少。感觉学破解还是要靠兴趣,不然没法支撑下去啊。
半醉半醒半浮沉 发表于 2016-7-24 22:58
感谢分享,学习了
laixingcui 发表于 2016-7-24 23:02
来保存一下,为以后考车试嘛。
lilililininini 发表于 2016-7-24 23:15
我也在背科目一的题目,不过好像一般用不到这个软件
爱的漩涡 发表于 2016-7-24 23:24
不知道驾考宝典和这个差多少
jkl1074 发表于 2016-7-24 23:28
好教程!
dengyaning 发表于 2016-7-25 10:16
虽然驾照已经考了三年了,但是考驾照的经历历历在目,不容易的说。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-25 03:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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