不同的地方是,3000整个验证过程都写在主函数里,3500是封装到最后的一个函数内,反而便于我们直接F5分析了,因为3000验证过程写在主函数里,又因为其反反编译的缘故,我们不便于分析序列号,但是3000虽然主函数不能直接F5,但是其验证过程封装在子函数内,子函数可以直接F5,神不神奇
首先在主函数里找到他封装的验证函数位置:
然后跟进,这个地方有点意思,很多逆向的思路,看他是否匹配ES3US,所以以我们正常的思维,按理说应该让他匹配,但其实这个地方,不应该让他匹配,因为第一组数应该是SI3US,其实这个在输入序列号的时候,已经提示了第一组数是SI3US,真是太搞笑了
因此我们应该跟进449B2C函数
贼坑的地方,第二组序列号他会有过滤机制,比如123456对应的整型:1E240就会被过滤,一开始搞得我不行,但是输入一些不常见的,那个循环判断就能过掉了,所以说平时一开始验证序列号,别拿123456这种,很容易就被过滤掉了
其实sub_4F521E是计算函数,可以写注册机的地方。整个思路就是:拿最后一组数变为整型,然后拿第二组数经过一个计算,和最后一组数比较,然后判定。
输入:SI3US-990831-xxxxx
拿OD看一下:
拿最后一组数11111的整型和计算的结果比较,可以看到结果是00011064,即为:69732
得到一组序列号:SI3US-990831-69732,验证一下:
还有贼坑的地方:
我们到449A4E里面看一下,传参的v5,进去之后其实是a2,这个函数里面的v5不是真正的那个v5,佩服写代码的老哥
拿来写注册机的函数:4F521E
三、sourceinsight4.0
首先先查壳,没有壳
之后先使用一下,捕捉关键语句:the serial number you entered is not correct
直接扔到ida里,准备搜索关键字符串,然后定位
一键F5
从上面的代码可以看出来序列号结构:
SXXX-XXXX-XXXX-XXXX
第一组第二个数必须是数字
S(0-9)(T/B/S/U)X-X(R/G/D/F)XX-XXXX-XXXX
为了能返回result=1,我们需要跟进sub_445DD0函数内,看一下怎么保证这个函数能够返回数值0
然后我们继续跟进sub_444820
因此能够得出:
每组第一位必须是字符,这样可以保证直接过掉
sub_445D00过掉之后,我们继续看,最后一组数根据前三组计算得到
sub_50A560是根据前三组数计算最后一组数的函数,然后判断是否相等,因此要保证相等,就跟进sub_50A560函数看,然后根据综上的分析,可以编写注册机
不编写注册机,根据前几位的特征,我们可以直接用OD拿出来看最后一组数
先来一组个人用例,然后在OD里跟调
得到最后四位YZJU,然后重载source insight看,成功绕过
四、sourceinsight最新版
和sourceinsight4版本,主要区别是对于每组数首字节的判断
因为原来的版本,sub_445DD0函数的意义不大(开发者自己的问题?逗乐了)
目测对于sourceinsight4105版本,不用限制首字符是字母,可以拿OD跟踪尝试一下
我们测试序列号:
S4SV-UFWT-ZPRA-1111
一样,可以拿出最后一组数的结果,S4SV
对于注册机的编写,两版程序相同
这就是以上四个版本我的分析过程,可以说收获很多,也希望网友们能一起探讨讨论!