Native部分的注册算法分析
Native部分
错误提示信息为 Invalid license key
通过IDA Pro 查找,(针对 64bit Mac OS X 动态库)
找到引用 这个字符串类的地方,在 方法 LiveProfiling::initCommunication(JNIEnv *) 中
会进行打印操作,那么我们定位逻辑,到底从哪里来得。
这个流程是通过 LiveProfilingSession::initParameters(JNIEnv *) 这个方法的返回值进行
处理的。那么进入这个部分 LiveProfilingSession::initParameters(JNIEnv *)
仔细找找能够发现 LicenseChecker::checkLicenseKey(char *, bool) 这个方法,
那么以后就着重 LicenseChecker C++ 类进行分析了。
64位汇编中经常有 rbx, r12d 这种,不明白,
这样也导致了最终注册机没有采用全部独立编写的问题。
LicenseChecker::checkLicenseKey 的逻辑
{
License:String
if(license startsWith("FLOAT")){
// goto FLOAT license check
}else{
char ch = license charAt(0);
if(ch == 'A'){
// 正式版
LicenseChecker::checkNormalLicense(license)
}else{
// 试用版
}
}
}
LicenseChecker::checkNormalLicense(license) 逻辑
{
license countDashes 获取 - 个数
if(count > 3){
LicenseChecker::isChecksumValid(license);
}
}
LicenseChecker::isChecksumValid(license) 逻辑
{
strrchr 查找 license 最后一个 - 的位置
计算这个之前的个数
必须大于4
if(len > 4){
int crcValue;
clearCRC32(&crcValue); // crcValue = -1
addCrc32b(&crcValue, license, len); // 最后一个 - 之前的内容加到 crcValue中
addCrc32b(&crcValue, "jprofiler version key1", ""len); // 插入特定版本的key1
tempCRC = 0;
getCRC32(&tempCRC, &crcValue); // 将 crcValue中数值处理到 tempCRC
clearCRC32(&crcValue); // crcValue = -1
addCrc32b(&crcValue, license, len); // 最后一个 - 之前的内容加到 crcValue中
addCrc32b(&crcValue, "jprofiler version key2", ""len); // 插入特定版本的key2
tempCRC2 = 0;
getCRC32(&tempCRC2, &crcValue); // 将 crcValue中数值处理到 tempCRC
var10:String
var20:String
LicenseChecker::calculateChecksum(tempCRC, var10, true); // 将tempCRC转换为字符串
LicenseChecker::calculateChecksum(tempCRC2, var20, true); // 将tempCRC2转换为字符串
nativeHash <= var10 append var20;
// 和 license中最后的 - 之后的内容进行比较 是否相等
}
}
由此可见上面的方法,就是 nativeHash的计算方法
