zoukankan      html  css  js  c++  java
  • WinHex18.4算法分析

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

    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日以前的所有升级对我来说都是免费的.

  • 相关阅读:
    vim/vi——\n只能被替换或删除 \r只能用来插入或替换
    程序算法与人生选择【转】
    【R】大型机Linux系统安装R及bsub提交R任务
    Mothur 命令手册Mothur命令中文解释(一)
    集群与分布式的区别
    【R】Linux安装R语言包(Installing R packages on Linux)
    Android TableLayout 常用的属性介绍及演示
    handler.obtainMessage()理解
    利用sax处理xml(推荐)
    Android 的权限设置大全3
  • 原文地址:https://www.cnblogs.com/cqubsj/p/6635611.html
Copyright © 2011-2022 走看看