最近碰到一款apk,只要修改了dex程序就会进不去,由此想到apk做了dex校验;通过查看application可知加载了libapk-protect.so
通过log可以看到有apk_protect字样
在IDA解析libapk-protect.so后搜索apk_protect,查找它的调用
可以看到这边就是程序退出了,再查找这个函数的调用就只有一处
往前跟踪v81
再往前跟踪v28
可以看到这里有三个判断,判断不一样的话就会进入if函数,这边我们只需要将if函数里赋值0改成赋值1,这样就不会进入退出的函数了;改完之后替换原来的so,发现游戏会一直在登录进不去;这边猜想是有对libapk-protect.so进行验证;
通过抓包发现和正常登陆的包很多不一样,原始app的初始化和登陆与修改后的都不一样;
通过网址等信息跟踪到java层发包的地方
可以看到这边用了xxtea进行加解密,可以hook这个类的openUrl打印参数和返回值
可以看到有发送classes_md5和manifest_md5值,这两个可以校验程序的所有dex和AndroidManifest.xml是否被修改过,把这两个值改成正确的(后面验证虽然这两个值不改也能进游戏,但毕竟是传到服务器的,最好改成正确的值);
这边还没找到so的验证在哪边,但猜想so的验证也要MD5计算,就在计算classes_md5的MD5的函数那边进行hook;
可以看到确实有libapk-protect.so进行MD5运算;
通过查找函数调用,找到校验libapk-protect.so的地方,通过比较MD5值,进行动态代理;
动态代理执行代码如下,MD5值比较和原来的不一样的话,就会进行if里面的操作,抓包看到的101也是下面进行赋值的;
至此,可以通过屏蔽这个so检验的类,也可以在MD5计算那边通过是否是so文件返回正确的MD5值,这样游戏就可以 进入啦;
小结:这个游戏通过so进行dex验证,通过dex进行so验证,两处都要修改,改其中一处都会出问题;还有apk会将dex和AndroidManifest.xml的MD5值传到服务器,虽然传错误的值不会出现问题,但指不定后面就会封你的号,所有将这两个MD5值也改成正确的。