首先声明,本文章纯粹是出于个人逆向爱好学习,请勿用于其它目的!!!
不得不说QQ的签名验证机制做的比微信好,以至于让我这菜鸟话费了大量的时间在定位分析上了(过程的心酸就不在这诉说了啊,你懂的。。。)。 好了,废话不多说,大致说下QQ的签名验证实现思路,成功重打包过QQ的亲们,我相信你们遇到过这样的情况,APK是重打包成功了,但是APK不能用了,登录不了,而且老是提示Appid is invalid!. 没错,这个由于QQ做了签名验证(而且还不是一般的JAVA层代码验证,可恶的腾讯竟然把签名验证放到了so包里面,更加可恶的是这个so包竟然不是放在常规的libs目录下),在经过了N般波折后,终于还是找到了这个签名验证so包所在\assets\lib\armeabi下的libcodecwrapperV2.so。 接下来就是使用IDA挂起这个so,搜索到里面的onReceData函数,进入到里面的ParseRecvData,最终可以在里面看到真正的签名验证“元凶”了——:ParsePhSigCheck,请注意.text:0001B43A BEQ loc_1B480,意思是如果条件符合就会跳转到loc_1B480,否则就往下执行到ParsePhSigCheck检验签名,所以破解的思路就来了,绕过签名验证不就可以了吗,没错,就是这个简单粗暴。把BEQ 指令修改成BNE就OK了(至于如何修改so包,请百度参考关于鬼哥的修改so包教程!) MOV R3, SP.text:0001B434 ADDS R3, #0x57.text:0001B436 LDRB R3, [R3].text:0001B438 CMP R3, #0.text:0001B43A BEQ loc_1B480.text:0001B43C LDR R1, [SP,#0x68+var_5C].text:0001B43E LDR R2, [SP,#0x68+var_60].text:0001B440 LDR R3, [SP,#0x68+var_40].text:0001B442 MOVS R0, R1 ; this.text:0001B444 MOVS R1, R2 ; _JNIEnv *.text:0001B446 MOVS R2, R3 ; CSSOData *.text:0001B448 BL _ZN13CCodecWarpper15ParsePhSigCheckEP7_JNIEnvRK8CSSOData ; CCodecWarpper::ParsePhSigCheck(_JNIEnv *,CSSOData const&).text:0001B44C LDR R3, [SP,#0x68+var_40].text:0001B44E CMP R3, #0.text:0001B450 BEQ loc_1B46A.text:0001B452 LDR R3, [SP,#0x68+var_40].text:0001B454 CMP R3, #0.text:0001B456 BEQ loc_1B466.text:0001B458 LDR R3, [SP,#0x68+var_40].text:0001B45A LDR R3, [R3].text:0001B45C ADDS R3, #4.text:0001B45E LDR R3, [R3].text:0001B460 LDR R2, [SP,#0x68+var_40].text:0001B462 MOVS R0, R2.text:0001B464 BLX R3 修改so包后,重新打包,运行,登录,恭喜你,可恶的Appis is invallid不见了,APK也可以正常登录使用了。一下是修改后的APK,别客气,拿去用(仅供逆向学习参考)。QQ破解版:(注:不支持在模拟器上运行,至于原因,有待研究)