上次展示了如何做到无限试用,即使是混淆过的Java和so代码也能找到蛛丝马迹。不过不得不说这软件防破解确实做的可以,就是音质每个版本都不一样,毕竟是通过调节软解来改善听感,器材每个人都不一样,哪个版本好用因人而异。
这次同样使用911版本,签名改变以后该软件hi-res播放功能消失,说实话我刚开始是看见那个函数有获取签名的,我以为能hook掉所有,结果是独立检测的,开发者为了不让你发现异常可谓是绞尽脑汁
来看一下他的RSA是藏在哪。
首先来看一下Jvav部分的签名校验,因为mt自带的一键过签可以kill掉这个,所以没必要再去手改了,不过也可以看一下。反编译前建议使用mt管理器对dex进行反混淆,因为里面有些特殊字符串很影响浏览。
反编译后搜索代码
>signatures
,看到最后一个。
1.png (112.92 KB, 下载次数: 0)
下载附件
2021-9-24 20:37 上传
这里虽然是混淆过的,但是像这类布尔值对比,一般结果在反编译后会放在开头,v0就是对比一致的结果,v1就是不一致返回的结果,值为0就会弹出盗版提示了。可以修改代码中的跳转逻辑,或者改寄存器的值都是可以的。实际上签名值就保存在当前类名的开头,拉到上面就能看到了。
dex并没有用太多的代码进行保护,就一个混淆和签名校验,因为开发者使用的是标准api接口,所以mt管理器可以轻松入侵。
但是上一个帖子hook了以后还有个问题,就是hi-res这个按钮不见了。
具体状况如下:
1、未hook签名时,我换回原始签名文件就正常了,重签名后按钮消失不见。
2、hook了以后,无论签名是否未原始,都不能显示按钮。
初步判断APP不但获取了签名值,而且还检测了自身是否被代{过}{滤}理。现在祭出神器ida加载so,为了方便理解以下都是静态地址。
ida加载完毕后搜索字符串
toByteArray
,进入sub_488E8,那么这里就是签名校验的一个部分,如果校验不通过会导致hi-res按钮不显示。
1.png (64.01 KB, 下载次数: 0)
下载附件
2021-9-24 21:24 上传
正确签名值如上图,红框分别获取了当前签名值和正确签名值,然后进行一个对比。
1.png (114.52 KB, 下载次数: 0)
下载附件
2021-9-24 21:34 上传
为什么是这里,用16进制编辑器对比一下就可以很清楚的看到so有一个签名文件。通过查找调用就能很快发现在哪里验证的。
v4 = ((*env)->GetObjectClass)(env);
v5 = (*env)->GetMethodID(env, v4, "getPackageManager", "()Landroid/content/pm/PackageManager;");
v6 = sub_18D9F8(env, a2, v5);
v7 = (*env)->GetMethodID(env, v4, "getPackageName", "()Ljava/lang/String;");
sub_18D9F8(env, a2, v7);
v8 = (*env)->GetObjectClass(env, v6);
v9 = (*env)->GetMethodID(env, v8, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
v10 = sub_18D9F8(env, v6, v9);
v11 = (*env)->ExceptionOccurred(env);
(*env)->ExceptionClear(env);
if ( v11 )
return 0;
v13 = (*env)->GetObjectClass(env, v10);
v14 = (*env)->GetFieldID(env, v13, "signatures", "[Landroid/content/pm/Signature;");
v15 = (*env)->GetObjectField(env, v10, v14);
v16 = (*env)->GetObjectArrayElement(env, v15, 0);
v17 = (*env)->GetObjectClass(env, v16);
v18 = (*env)->GetMethodID(env, v17, "toByteArray", "()[B");
函数获取签名后,再对比保存在so里面的值,对比不通过就偷偷地把按钮藏起来,让你用着不舒服。
1.png (75.6 KB, 下载次数: 0)
下载附件
2021-9-24 21:50 上传
r2是正确签名值,r3就是获取到的签名值,因为so已经混淆过了,所以它把r3+1字节数存入r12,r2+1的地址写入r1。要让对比的结果一致改法比较多,改判断或者改寄存器都是可以的。比如LR改成r3,让它自己和自己比。
1.png (27.37 KB, 下载次数: 0)
下载附件
2021-9-24 22:02 上传
上图是读取地址,可以试一下能不能过。
改好后按钮还是没有显示,因为上一层它做了hook检测,检测自身是否被代.理。
1.png (47.71 KB, 下载次数: 0)
下载附件
2021-9-24 22:30 上传
如上图16进制,一直卡那里走不下去,nop掉.text:0004960C就可以了。
实际上不需要修改签名值,因为之前已经hook了,这里只是做了一个检测而已,nop掉
BNE loc_495EC
之后那个hi-res按钮就显示出来啦。
1.jpg (31.31 KB, 下载次数: 0)
下载附件
2021-9-24 22:44 上传