在智友论坛无意中看到一款漫画软件,下载量还不错,lsp应该很熟悉是干什么的
我也下载下来看了一下,最开始应该是先用mt管理器去签名,然后再加弹窗,因为我看见了弹窗入口和mt类,是什么弹窗我没注意看。我去找了原版重签名测试闪退。so只有1个而且很小应该不算难,而且这签名校验我感觉有点意思,所以才想发这个帖子。
准备工具:
1、NP管理器
2、64,以64位安装包为例
3、16进制修改器
我知道有不少人什么都不知道就点进来的,因为这个是逆向分析的版块,所以……不看这方面的建议直接关闭网页。
原版软件重签名后打开直接退出,基本上确定有签名校验,智友论坛的那个成品用的是MT管理器一键去除签名校验,去广告的话我给个7分吧,因为还有广告位。全局搜索signatures,然后根据日志打印,确定根源在so,所以接下来要去修改so。libJniTest
刚开始我用日志打印so的输出表,本来想写死到smali里面,但因为字符串包含转义符而无法写入smali,所以我的思路是先转换成16进制,网址:
https://www.bejson.com/convert/ox2str/,然后再输出smali反转的结果,这样就解决了转义符的问题。但是打开软件还是不行,结果发现so输出不止1个字符串 所以这个方法行不通。
打开so的输出表,搜索文字signature并勾选所有事件,genkey10和getStringComFromNative就是要修改的函数,随便双击一个进去,并查看伪代码,发现都有一个很长的字符串,以genKey10为例,完整函数代码如下:
[C++]
纯文本查看 复制代码__int64 __fastcall genKey10(__int64 a1, __int64 a2){ unsigned __int64 v2; // x24 __int64 v3; // x19 __int64 v4; // x21 __int64 v5; // x0 __int64 v6; // x0 __int64 v7; // x22 __int64 v8; // x0 __int64 result; // x0 __int64 v10; // x20 __int64 v11; // x0 __int64 v12; // x21 __int64 v13; // x22 __int64 v14; // x23 __int64 v15; // x21 __int64 v16; // x20 __int64 v17; // x22 __int64 v18; // x21 __int64 v19; // x22 __int64 v20; // x21 __int64 v21; // x22 int v22; // [xsp+8h] [xbp-4D8h] char v23; // [xsp+Ch] [xbp-4D4h] __int64 v24; // [xsp+498h] [xbp-48h] v2 = _ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2)); v3 = a1; v4 = a2; v24 = *(v2 + 40); v5 = time(0LL); srand(v5); v6 = (*(*v3 + 248LL))(v3, v4); v7 = v6; v8 = (*(*v3 + 264LL))(v3, v6, "getPackageManager", "()Landroid/content/pm/PackageManager;"); result = (*(*v3 + 272LL))(v3, v4, v8); v10 = result; if ( result ) { v11 = (*(*v3 + 264LL))(v3, v7, "getPackageName", "()Ljava/lang/String;"); result = (*(*v3 + 272LL))(v3, v4, v11); v12 = result; if ( !result ) goto LABEL_11; (*(*v3 + 184LL))(v3, v7); v13 = (*(*v3 + 248LL))(v3, v10); v14 = (*(*v3 + 264LL))(v3, v13, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"); (*(*v3 + 184LL))(v3, v13); result = (*(*v3 + 272LL))(v3, v10, v14, v12, 64LL); v15 = result; if ( !result ) goto LABEL_11; (*(*v3 + 184LL))(v3, v10); v16 = (*(*v3 + 248LL))(v3, v15); v17 = (*(*v3 + 752LL))(v3, v16, "signatures", "[Landroid/content/pm/Signature;"); (*(*v3 + 184LL))(v3, v16); result = (*(*v3 + 760LL))(v3, v15, v17); if ( result ) { v10 = (*(*v3 + 1384LL))(v3, result, 0LL); (*(*v3 + 184LL))(v3, v15); v18 = (*(*v3 + 248LL))(v3, v10); v19 = (*(*v3 + 264LL))(v3, v18, "toCharsString", "()Ljava/lang/String;"); (*(*v3 + 184LL))(v3, v18); v20 = (*(*v3 + 272LL))(v3, v10, v19); v21 = (*(*v3 + 1352LL))(v3, v20, 0LL); memcpy( &v22, "19342243308201aca00302010202045816e7ec300d06092a864886f70d01010505003066310d300b0603550406130450696361310d300b06" "03550408130450696361310d300b060355040713045069636131133011060355040a130a5069636120436f6d696331133011060355040b13" "0a5069636120436f6d6963310d300b0603550403130452554646301e170d3136313033313036343235325a170d3431313032353036343235" "325a3066310d300b0603550406130450696361310d300b0603550408130450696361310d300b060355040713045069636131133011060355" "040a130a5069636120436f6d696331133011060355040b130a5069636120436f6d6963310d300b060355040313045255464630819f300d06" "092a864886f70d010101050003818d0030818902818100907a73e634417ec44986ea4a553e5efcba5a65480507ad5a994d621fd1ea1eb5ed" "d87e8fab306a781514d9c740bc7dfef76fb09d82ba5db30377fd77f752a6437a20dbeb423e30716da0cc62244317cbeba9c64bec0584e481" "3316d69d5438a357ff456920f9c9f558bb7cc4c4a40037b646e098ca96d0b8a7cf19097fbc8f9b0203010001300d06092a864886f70d0101" "050500038181001338c00449fce7f36c4aa2c398b974ecd9f87b1c957a6e0ea03affd6e8488c7b3cf5943e122f75bc53a69bbdaf3cfc94dd" "95d3fb46b7c852034dd6da2173da19fca8bf44f0fbed46355a1bc1e310f0533bb049c69a8b6a2c1329b5c657cdeed600ea70625935c21dac" "8e4a386d79e83106793ac2139b6142570b0cf840c7895c", 1167LL); v22 = 842543155; v23 = 48; LODWORD(v10) = strcmp(v21, &v22) == 0; result = (*(*v3 + 1360LL))(v3, v20, v21); } else {LABEL_11: LODWORD(v10) = 0; } } if ( *(v2 + 40) == v24 ) result = v10; return result;}
从getPackageManager到signatures,获取签名校验葬爱家族,下面很长的字符串就是签名错不了。如果对比不一致会返回0,memcpy:拷贝N个字符串。
这时候打开np管理器,查看他的原始签名数值为:
30820243308201aca00302010202045816e7ec300d06092a864886f70d01010505003066310d300b0603550406130450696361310d300b0603550408130450696361310d300b060355040713045069636131133011060355040a130a5069636120436f6d696331133011060355040b130a5069636120436f6d6963310d300b0603550403130452554646301e170d3136313033313036343235325a170d3431313032353036343235325a3066310d300b0603550406130450696361310d300b0603550408130450696361310d300b060355040713045069636131133011060355040a130a5069636120436f6d696331133011060355040b130a5069636120436f6d6963310d300b060355040313045255464630819f300d06092a864886f70d010101050003818d0030818902818100907a73e634417ec44986ea4a553e5efcba5a65480507ad5a994d621fd1ea1eb5edd87e8fab306a781514d9c740bc7dfef76fb09d82ba5db30377fd77f752a6437a20dbeb423e30716da0cc62244317cbeba9c64bec0584e4813316d69d5438a357ff456920f9c9f558bb7cc4c4a40037b646e098ca96d0b8a7cf19097fbc8f9b0203010001300d06092a864886f70d0101050500038181001338c00449fce7f36c4aa2c398b974ecd9f87b1c957a6e0ea03affd6e8488c7b3cf5943e122f75bc53a69bbdaf3cfc94dd95d3fb46b7c852034dd6da2173da19fca8bf44f0fbed46355a1bc1e310f0533bb049c69a8b6a2c1329b5c657cdeed600ea70625935c21dac8e4a386d79e83106793ac2139b6142570b0cf840c7895c
复制代码但是你会发现一个问题,那就是开头对不上,另一个函数也是这样。也就是30820这几个字符串没了。
因为这个签名值不管什么app开头都是30820,所以我估计开发者为了防止别人完整搜索到签名值,所以就抹掉了前面的30820。那么现在的修改思路就是不管前面的5个数字,直接把重签名后的数字覆盖到原来的位置即可。
so改为用16进制编辑器打开,然后把充签名后的数字覆盖进去,保留前5位。
如上图,复制后5位即可,余下的填充00。
改好后测试,成功!
这软件签名校验的不同之处在于开头的数值不一样,如果你直接搜索完整的签名值,或者从开头复制了部分签名值搜索肯定找不见,这个也许能拦下一些马虎的萌新,然后就黑人问号了
发表评论: