该软件为某威客网站付费求破软件(下载地址:http://fj1.p.680.com/Item/2016-6/8/0_20166811723.zip),软件为key文件注册,绑定机器码,有时间跟功能限制(最大连接数限制),注册成功运行界面如图:
未注册运行提示:
1、查壳显示未加壳:
2、od载入,bp MessageBoxW,F9运行,断下后,在后面的retn 0x10地址f4,f8,回到程序领空,如图:
3、在call显示出错信息子程序第一个入栈参数上右键—转到je XXXX,只有一个跳转至此。程序到了这里:
4、从比较指令前一个函数过程GetPrivateProfileIntA,可以看到,是对临时文件date.tmp中的date字段进行检查,很明显是检查运行时间之类的,不管它,在其第一个入栈参数上继续右键—转到,这次有4个jne ,跟踪第一个:
5、可以看到call子程序有5个入栈参数,最后一个是0x80h,子程序返回比较先比较的是eax是否是0x64h,第二,第三次比较是两个常数,根据常规判断,这个call应该是对key文件进行解密或者字段分离,爆破的话就在这几个jne动手脚。不过call前面有个“导入授权文件时出错”入栈,然后jmp,说明在这之前还有key文件检查,这个call很可能只是数据分离。继续上翻至此:
赫然出现key文件名,以及三个call子程序,第一个检查的是eax=0退出,第二个检查的eax≠80退出,第三个检查的eax≠0授权文件正确,根据key文件是0x80字节判断,第三个call是关键。
6、Call地址上下断点,重载运行,让我们看一下这个call的几个参数:
在00318D62 . c745 f8 586d5>mov dword ptr ss:[ebp-0x8],0x596d58上右键跟随立即数,注意看数据窗口显示,初看只是一堆乱七八糟的数据,但估计是解密key要用到的,注意看标出数据的尾部,02 03 01 00 01 ,熟悉RSA加密的话,应该知道这就是rsa加密的公钥,这说明key文件是采用rsa加密,看来只能爆破了。
7、不过仔细观察这组数据,会发现后面有段数据跟rsa公钥一样,如图:
注意观察,突出显示的数据与数据窗口第一行的数据,发现公钥完全一下,一个密钥没必要放两份在软件中,开始对rsa加密不熟悉,查找资料才知道后面这部分就是私钥,没明白作者采用rsa加密,私钥放到软件里是神马意思,不管它,把公钥,私钥分离出去再说,留着写注册机用。
8、跟踪解密函数过程,在第二层:
这个jle跳转的,eax返回的是0,意味着注册文件错误,因此前面这个call eax不能返回0,
跟进去看看:
进去一看蒙圈了,好像跟错了,显示ASCII".\crypto\asn1\tasn_dec.c" 之类的,貌似des加密,退出这个call,跟进cmp eax,0x64前面那个call,并检查入栈参数。
Esp+4 这个参数地址是key文件,另两个参数不明,跟进去发现字符串".\crypto\rsa\rsa_lib.c",rsa加密无疑了。
9、数据窗口跟踪esp+8地址参数,跟踪更改:
更改后的数据比key文件少了0x1c个字节。正好是0x64个字节,观察这组数据,发现随后的两个常量比较的字符串都在其中,注意0x1c开始的dword,是000003e8,转换成10进制是1000,0x20开始的dword,是0133a076,转换成10进制是20160630,这正是该软件的连接数以及到期时间,看来这就是解密后key,但是缺的 0x1c哪去了。
10、Call下断,重载运行,f9之后esp+8地址第一个字节下硬件写入断点,然后f9,
程序断在这里:
11、f8一次,在esi上右键—数据窗口显示,再往前翻0x80字节:
根据数据结构,这因该就是rsa解密后key文件,进一步测试分析数据结构,解密后的key是从01开始,00结尾的0x80个字节,从0x1c偏移开始的0x24字节是所谓系统特征码,0x37偏移的dword是最大连接数,0x3b偏移开始的是运行期限,形如20160630的16进制形式。其它字段都是固定字符,但似乎只有两组进行了校验,最后的16个字节按说一般应该是前面所有字符的检验和,但作者似乎并未在程序中检查。
12、根据数据结构更改连接数以及运行期限,利用前面分离出来的公钥私钥,用vc++写了一个rsa注册机,测试成功!运行画面入开头所示。
13、总结:这个软件不加壳,爆破很容易,也就10几分钟时间,后来发现是rsa加密,想玩一下公钥替换,无意中发现了私钥,觉得有必要写出来跟大家分享一下,没什么技术含量,见笑!
|