1、工具准备
饥饿鲨进化.apk (从豌豆荚下载的, 2016.5.31号更新)
android killer
IDA pro 6.8
android studio
2、破解步骤
2.1 apk反编译,不做任何修改,再编译成apk包,安装到手机,发现开启后闪退。说明有签名验证。
2.2 分析签名验证时本地验证还是网络验证,把网络关闭,再次安装运行,发现仍然闪退,猜测是进行本地验证
2.3 搜索关键字signatures,发现结果如下
其他三方的包暂时不关心,只关心smali/ourpalm/android/c/Ourpalm_CrashInfo.smali,进到该文件,看java代码如下
getsign函数获取签名验证,再看下getsign是被谁调用的,追踪到被Ourpalm_CrashHandler.class调用,如下
这明明是把一些信息封装json发送给服务器,难不成和火柴人联盟一样是根据服务器返回的状态确定是不是被重新打包了。根据上一步步骤应该是本地验证的,手头工具有限,抓包不方便,先放弃。
2.4 游戏刚进入就闪退,推测检测代码运行的还是比较早的,看看入口函数有没有什么收获,查看com.flog.IAPInterface.class的onCreate方法,如下
[Java] 纯文本查看 复制代码
protected void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
this.mContext = this;
init();
UMGameAgent.setDebugMode(true);
UMGameAgent.init(this.mContext);
ShareSDKUtils.prepare(getApplicationContext());
}
好简单的代码,好悲伤的心情,代码越简略,我们找关键信息越麻烦,没办法,用最笨的办法,给每个步骤增加点log输入,最后确定问题出现在init()函数里,跟进如下
[Java] 纯文本查看 复制代码
public void init()
{
Log.d("HSE", "��������������");
FlurryHelper.init(this.mContext);
getMobileType(this.mContext);
Log.d("HSE", this.mContext.getPackageName() + "++" + this.mContext.toString());
this.mIAPIdentifier = new IAPIdentifier();
this.mListener = new OurpalmIAPListener(this);
Ourpalm_Entry.getInstance(this).Ourpalm_Init("2", "1.0", "1.0", this.mListener);
setCanBuy(true);
}
仍然没有明显的代码是检测签名的,再打log就不合适了。直接上动态调试,方法可参考http://www.52pojie.cn/thread-505077-1-1.html,在init()函数下断点,F8跟进,
看游戏是在哪个函数挂掉的,然后重新来,f7进入函数,f8跟进,周而复始。。。
最后跟到了Ourpalm_Entry.smali的Ourpalm_Init函数,当该函数调用runsign函数是挂掉的,smali代码如下
[Java] 纯文本查看 复制代码 invoke-virtual {v5, v6}, Lourpalm/android/sdkjni/ourpalm_android_SdkJni;->RunSign(Landroid/content/Context;)Ljava/lang/String;
跟到Ourpalm_android_SdkJni.smali代码,发现该函数是native函数,在Ourpalm_Entry.smali中查找关键字loadLibrary,如下
[Java] 纯文本查看 复制代码 .line 92
const-string v0, "ourpalm_sdk_a"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
上IDA pro, 把libourpalm_sdk_a.so仍进去,在export栏搜索runsign函数,找到后跳转到对应的汇编代码,如下
看到这里就心情好好的了,有checksign和 checkdexex,分别是检查签名和dex,有兴趣的可以进去看看实现方法,我看了下,checksign会调用java层的各种函数,checkdexex是另起一个线程进行检测,具体内容自行分析吧
简单起见,直接用winhex把两个BL语句置空就OK了,最后效果如下
OK,把改好的so放回android killer工程目录中,重新编译,adb install安装,完美运行
3、内购破解
当内购会判断网络运营商弹出不同的支付框,当找不到sim时弹出豌豆荚提供的三方支付窗口,我测试用的手机没有sim,是弹出支付窗口,和火柴人联盟那个支付窗口一样。
在破解签名验证的时候发现init函数里有 "内购初始化" 字眼的log,没说的,就是它了
其中进入OurpalmIAPListener进行修改就可以了。
4、写在最后
总体来说这个游戏破解比较简单,比较迷惑的地方就是破解签名验证的时候,只是静态分析的话很难找到检查点,所以建议使用动态调试smali来找检查点,虽然校验是写在so中,但是so没有任何保护,修改起来也简单的很。
破解完成后先搜索下有没有相关的帖子,果然,去年就有人搞过了,但是没有说明破解签名验证(可能当时该游戏还没有加签名验证),地址如下http://www.52pojie.cn/thread-399992-1-1.html , 内购部分讲解的很详细
为了避免有抄袭嫌疑,第三部分内购破解仅提供个思路,供和我一样的小白练手用,有什么疑问的话,回帖交流
|