简单的逆向破解过程

0x0 定位dex脱壳

反编译之后,可以很明显的发现源码的Dex已经壳文件代替,主代码被加密隐藏了起来。分析壳的代码,DexClassLoader加载的形式:
简单的逆向破解过程_第1张图片

那应该说明Dex是被整体加密或者隐藏了。通过分析本地文件,压缩格式打开Assets文件夹下的he.jar包含了原来的Dex文件:

简单的逆向破解过程_第2张图片


那么,只需将he.jar中的classes.dex拖出来,替换到原来的apk中,再反编译即可得到全部的源码。
可能有些童靴比较草率,拿到Dex反编译得到全部Smail以后,就直接删除掉了清单文件中Application的android:name属性,以至于回编、安装测试的时候,程序闪退报错:


额,致命错误,无法查找原因..其实,一般情况下会报Unable加载某个类的错误。原因是没有考虑到源代码中会有Application类的情况。修复方法是在Smali代码中搜索“.super Landroid/app/Application;”,将其所在的类名替换掉原来的壳的类名。<开心消消乐>修改之后也就变成了:

所谓的脱壳至此完成..


0x1 去签名校验

其实有一段时间,<开心消消乐>免费的破解版本都是比较少的,一方面它的签名校验放在加密的lua脚本里,破解技术要求比较高;更大一方面,很多会lua脚本解密的大牛都不动国内游戏的,就Z大出手了一次。我这次磨出来的去验证方法就对技术的要求低了哈哈~~高的我也不会o(╯□╰)o~~去校验主要用了两个关键点:


1.Hook本身的签名信息

这个就很简单啊,使用的是飘云阁大神空道的Hook本身签名的现成手法。不过需要注意的是添加的类要足够多,我用这个方法的时候就是在尽量多的类里面添加引用Hook的so,比较重要的有:Application、主Acitivity、主Activity继承的所有类、getActivity方法所在的类、getContext方法所在类等等。<开心消消乐>需要添加的类有:
Lcom/happyelements/AndroidAnimal/MainApplication;、Lcom/happyelements/hellolua/MainActivity;
Lcom/happyelements/android/BaseActivity;
Lorg/cocos2dx/lib/Cocos2dxActivity;等等,

宜多不宜少啊..当然这是比较笨、无脑、怕出错的做法咯..


2.验证包路径转向

通过测试发现,只单纯的使用空道的手段,游戏仍然会提示“不是合法版本”。其实我也纠结了很久,最后才蒙出来绕过的方法。
见:http://blog.csdn.net/zihao2012/article/details/39891547
在Smali代码中搜索sourceDir 和 getPackageCode,在可能会影响校验结果的地方,将路径指向正版包的SD卡路径即可。

简单的逆向破解过程_第3张图片


0x2 破除QQ和新浪的登录接口限制

一般来说,一个程序要想支持QQ和新浪微博的接口登录,都必须事先将自己签名的MD5放到接口的后台官网来申请登录SDK,如果签名不一致则拒接登录,所以要解除它们的登录限制就在反编译的SDK的Smali文件中,让它读取正版包的签名信息。具体的怎么做用一张图片来简单的说明一下吧:

简单的逆向破解过程_第4张图片


0x3 内购破解

我实现的方式是将IMSI转向电信接口,然后就无支付窗口直接成功了。详见:

http://blog.csdn.net/zihao2012/article/details/39693333


0x4 消费限额的去除

当时我记得好像是通过LogCat信息看出来每日消费的限额是在加密的lua脚本中写的,一开始还觉得无能为力,当我看了它的本地储存文件时,看到了希望:

 简单的逆向破解过程_第5张图片简单的逆向破解过程_第6张图片


6050860..什么的,很明显是我随机过的咯 没随机之前貌似是IMSI之类的东西。所以出现“每日限额“的提示时,重新打开游戏就好了。


0x5 验证包的处理

验证包就是路径指向的正版包,上面在sourceDir 和 破除接口登录限制的时候,都提到了将路径指向SD卡中的正版包。对于追求完美的人来说,破解还要再附带一个脓肿的正版包一定是很不爽的。有一个参考的方案就是:


1.删减文件,优化验证包大小。

比如如果验证包的作用只是获取正版的签名信息,那就只保留META-INF和

AndroidMainfest.xml文件,其他的删除;如果验证包的作用是验证classes.dex的有效性,那就只保留其中的classes.dex和AndroidMainfest.xml文件等等。


2.将验证包放到Assets。

将已经删减的验证包放在Assets文件下,在程序主Activity的onCreate()方法中添加一段将其复制到指定的目录下,验证时直接指向该目录即可。



你可能感兴趣的:(技术杂烩)