接下来想如何破。
1. 伪造license.bin。尚未分析证书的加密算法,仅从读取license.bin并判断证书是否有效来看,工作量不小,且算法不一定可逆。
2. 计算License ID。在界面输入ID,如果有效才能点OK
因此估计本地有验证License ID是否为有效格式的算法。这倒还好。
从这里可以看到证书文件的生成过程: 把LicenseID传到服务器,如果服务器验证通过,再通过SSL加密方式将License.bin下载到本地。假如服务器没有合法登记的LicenseID,估计就算格式有效也无法获取到LicenseID。
3. 绕过验证过程。即使证书无效,也在所有判断是否有效的地方bypass。
看起来只能采用方法3了。对于方法3,也找了很多地方,走了不少弯路。开始一直从IMVSACore.dll入手,觉得要搞的地方很多有点麻烦。退回到问题本身,又多分析了一下两个.NET DLL,总算找到了入手点。
IMVSACore.dll本身只提供验证License的功能,而本身并不会对结果进行进一步处理。可以看出,这里IncludeManager.dll调用IMVSACore!ExportGetLicenseInfo之后,把结果保存于类LicenseInfo中。
LicenseInfo类的结构:
回到IMVSACore.dll的导出函数ExportGetLicenseInfo中,用Windbg跟一下,分别断在该函数执行前及执行后:
从堆栈上找到参数指针
ExportGetLicenseInfo返回后,读取前3个参数。
从
这里的调用方式我们可以看到,前3个参数分别对应
LicenseInfo.isValid == 1,
LicenseInfo.isTrial == 1,
LicenseInfo.daysRemaining = 0x1C
再回头看看这里:
只要isValid == 1 && isTrial == 0,就认为是注册版了。再去查看其它检查isTrial的地方,结果发现它只检查这个成员值,比如前面图里打水印的地方。
因此决定就修改这里。问题是,在哪里改好呢?两个.NET dll有strong name验证和加密,比较麻烦,思来想去最后还是回到IMVSACore.dll里去改。下ba断点,找到填输出参数的地方:
isValid是这里填的:
mov al, [esp+88h+var_70]
mov [edx], al
isTrial是这里填的:
mov dl, [esp+88h+var_6F]
mov [ecx], dl
我直接改掉了:
然后修正一下checksum,完工。
PS. 不足之处还望指教
PPS. 有什么同类软件更好用的麻烦推荐