经过分析,注册码分为六个部分:

Name: "xxx"

Addr1: "yyy"

Addr2: "zzz" 这三个字符不代表长度

Key1: "32个十六进制数的字符串" 它在内存中的形式是:比如字符串是

"18A519949D4E5F1FAED08A3EAB7CC665" 它会以两个字符为单位作为一个字节, 以顺序列在内存中  ===> 18 A5 19 94 等等

Key2: "32个十六进制数字符串" 同上

Chksm: "kk" 就一个字节

 

以上的六个部分的后半个部分会被拷贝到以下位置:

xxx 5e2f14

yyy 5e2f65

zzz 5e2fa2

 

key1的值 5e2fdf

key2的值 5e2fef

                   key1和key2中的值在内存中是紧密相连的.

Chksm的值 5e30f9

 

以上六个部分的前半个部分,会进行比较, 也就是说必须一模一样. 除了中间的空格还可以被替换成其他字符

 

 

用PEID查看发现未加壳,之后查看导入表,发现关键函数

在lstrcmpiA下断,随意输入注册码,之后发现,注册判断函数在sub_568A74

 

整串字符串的分离和拷贝跟sub_569fa4有关, 他会清除一些分隔符, 进入下一部分.

六个部分的前半部分都是以如下的形式进行检测的:

其中5e42fc是一个中转站:

在sub_569fa4中,会将分离出来的字符串拷贝到5e42fc中,如果是后半部分的字符串那么还会拷贝到[5e2F14,+0xeb)的相应位置

以上是六段注册码的分离以及部分检测.

下面是checksum的值的计算方式:

就是把5e2f14开始的0xeb个字节, 以字节为单位全部相加

由于这个数据块前面已经置过0, 所以不会有其他影响因素.

checksum就是把5个部分的后半部分以字节为单位全部相加,得到的值的低字节,就是checksum的值了.

 

另外0x5e3238的值决定了软件的到期时间

0x5e3238的值是由key1的首word和尾word异或得到的, 得注意字节序, 这个值必须在[46e4,5221)之间,高字节必须&&0x80==0

 

key1的倒数第3个字节 byte_5e2fec and 0x1f == 0x13 ==>5e2fec == 0x13 或0x33 0x53 73 93 b3 e3

byte_5e2fec/32 ==> 5e31a2 !=5,8,6 那么b3就不行了` 0 1 2 3 4 5 6

byte_5e31a2 [2,6]

 

Name: "aaaa"
Addr1: "bbbb"
Addr2: "cccc"
Key1: "2A3C1111111111111111111111535770"
Key2: "11111111111111111111111111111111"
Chksm: "E3"

Genuinely Licensed for personal use. 个人使用

Software is unlocked. All Updates released before 2018/03/28 are free for me.

软件已经解锁. 2018年3月28日以前的所有升级对我来说都是免费的.

posted on 2017-03-28 16:47  fuckitup123  阅读(733)  评论(0编辑  收藏  举报