Android破解APP之路 —— 想你APP

从应用宝下载app

对APK执行反编译,得到资源文件和smali文件


解压apk,取出dex文件,我们可以看到又两个dex文件,刚好对应上图中的两个smali文件


接下来我们反边两个dex文件,得到两个jar包,我们用gui工具打开


不出我们所料,java代码是经过混淆,接下来,我们用fiddler进行网络拦截


从拦截中可以看到,APK的host为http://http.server.minius.com.cn,每一条数据请求全部经过加密,但是我们发现每一条请求的参数名都为argument,可想而知argument这个参数必然会在java代码的网络请求中出现,我们去gui中全局搜索argument


不出我们所料,两个dex生成的jar当中都出现了argument字段,有雨dex2jar当中只出现了一次,所以我们去看dex2jar中的HttpConnection类,我们在类中搜索argument字段


看上图中的混淆方法g(),重点标注的那一行,明显是网络请求在最后发出的最后一步封装,也就是可以理解为,这个"str1",就是fiddler网络拦截出来的数据,所以,这个str1成了重中之重,我们接着往下捋,看看这个str1到底是怎么来的


我们看到,str1是从MyEncrypt类的encrypt()方法生成而来,我们找到这个方法


根据方法名我们推测,这个方法返回的应该是以传哈希数列,而到底是把什么转化成哈希数列呢,我们不去纠结toHex方法,重点在混淆方法a(),我们找到啊a()方法去看


一眼看去,不论是SecretKeySpec类名还是 AES三个大字母,都真真切切的代表了这个方法的含义,这是一个针对数据加密方法,想要破解拦截到的加密数据,这个加密方法多重要不言而喻。

我们现在可以理解为应用是通过这个方法加密后转化为哈希数列,最后和argument字段封装成网络请求分发出去。

通过上图,我们甚至可以推测出a方法下面的b方法是解密方法,而且我们再回过头看看调用a方法和b方法的两个地方


一切都是这么的巧合,然而巧合加巧合再加巧合,那就是必然,加密解密算法皆在于次!

那我们下一步该做什么,算法有了,差的就是传进来的值了,根据AES加密一般需要一个key,所以我们推测encrypt方法传进来的两个值一个是key,一个是需要加密的原始data,再结合a方法中的代码,我们判断出,第一个参数为key,第二个参数为原始data,请看下图


我们回过头往前看,找到调用encrypt方法的混淆g方法


我们已经确定encrypt方法的第一个参数为key,而且通过g方法的代码,我们也能大概看出str2这个参数更倾向于原始data,接下来为了更确定我们分别分析下这两个参数


str2是w.toString来的,而这个w我们在最上面找到了它的类型JSONObject,至此,两个参数的身份一目了然,接下来我们去看我们认为的是key的那个参数


第一个参数为MyEncrypt.name,我们从上图追踪到,再去追踪b.getInstance().getA()


b.getInstance().getA() 追踪到最后,就是 getMyName()方法,由此可见,最后的key需要从.so库中获取,而这个getMyName()方法有没有传参数,我们推测这个key应该是一个定值。


接下来我们再看应用中所有的so库,第二个是做热更新的,第三个是游戏引擎,第三四个是高德地图,第五个是个推,第六个是支付宝,排除到最后就只剩下第一个和最后一个,我们用IDA打开,发现最后一个是空的,那么就只剩下第一个了


好了,加密钥匙已经找到,之前的加密方法我们也分析出来,可以说该软件我们已经基本破解成功。

你可能感兴趣的:(Android破解APP之路 —— 想你APP)