—-Creaked by B.S. 6/24/2017 16:17:58 PM
无聊练手,当作学习Android优秀源码的笔记
仅供学习研究,请勿用作商业用途,如若喜欢请支持正版!
原程序:(v4.3.1.0)
移动下载v4.3.1.0(D)
百度下载v4.3.1.0(D)百度版
B.S.内购破解版:
百度下载 v4.3.1.0(E)
也可以去各大安卓市场搜索下载最新版本:(推荐支付接口比较熟悉的移动,咪咕游戏,爱游戏)
中国移动应用商城: http://mm.10086.cn/android
腾讯应用宝: http://android.myapp.com/
360手机助手: http://zhushou.360.cn/
有图有真相,动画演示:
1. 内购破解:
搜索logcat定位字符串,
支付 测试:
g+:
unity购买失败
unity购买成功
还可以通过查找\res\values\strings.xml有没有支付相关字符串可以用,
解析支付协议失败
ourpalm_tip_prasecharginfoerror
找到在下面这个函数里,
.class public Lourpalm/android/pay/Ourpalm_Entry;
.super Ljava/lang/Object;
.source “Ourpalm_Entry.java”
1 | .method private Ourpalm_Pay_FormSdk(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lourpalm/android/callback/Ourpalm_PaymentCallBack;Ljava/lang/String;Ljava/lang/String;)V |
1 | .line 718 |
在Ourpalm_Pay_FormSdk方法函数里,想要跳过支付窗口,不弹窗框的,要跳到cond_4去.
1 | .line 714 |
改失败为直接成功然后,goto返回
1 | .line 723 |
另外一种破解方法(第2种改法),也可以搜索字符
Ourpalm_PaymentFail
支付失败
ourpalm_tip_gw_chargfail
看哪里调用引用了这个方法函数
.class public Lcom/fgol/OurpalmIAPListener;
.super Lourpalm/android/callback/Ourpalm_PaymentCallBack;
.source “OurpalmIAPListener.java”
用成功的代码替换掉失败方法里的代码
1 | .method public Ourpalm_PaymentSuccess(ILjava/lang/String;Ljava/lang/String;)V |
1 | .method public Ourpalm_PaymentFail(ILjava/lang/String;Ljava/lang/String;)V |
这里只需要修改一句调用的函数,修改如下:
1 | .method public Ourpalm_PaymentFail(ILjava/lang/String;Ljava/lang/String;)V |
来看一下java源码,就知道改那个语句了:
1 | public void Ourpalm_PaymentFail(int i, String str, String str2) { |
或者进入purchaseFailed函数方法里面去改(这是第3种改法了):
1 | .line 246 |
源码如下:
1 | public void purchaseFailed(String str) { |
2. 去so签名验证:
android killer修改内购破解后直接回编译后安装游戏,进游戏闪退,是有签名验证的.
搜索定位字符串
signatures
没有什么实用价值的代码
再搜索
内购接口初始化
ShareSDKUtils.prepare
向上回溯,哪里引用到了,定位到.method protected onCreate(Landroid/os/Bundle;)V
在下面的内购界面的类里,先看看源码,关键在public void init()函数里:
1 | protected void onCreate(Bundle bundle) { |
经验:所以在没有找着有用信息是,去onCreate瞧一瞧,也许会有惊奇的发现
.class public Lcom/fgol/IAPInterface;
.super Lcom/unity3d/player/UnityPlayerActivity;
.source “IAPInterface.java”
跟进,查看Ourpalm_Init函数方法
1 | public void Ourpalm_Init(String str, String str2, String str3, Ourpalm_CallBackListener ourpalm_CallBackListener) { |
his.ourpalm_jni = new ourpalm_android_SdkJni();
this.ourpalm_jni.RunSign(Ourpalm_Entry_Model.mActivity.getApplicationContext());
Ourpalm_Statics.Ourpalm_kkey = this.ourpalm_jni.getPublicKey();
Ourpalm_Statics.UpdateSecretKey();
1 | public native String RunSign(Context paramContext); |
下次维护,定位可以搜索
RunSign
UpdateSecretKey
getSimType
native函数,去初始化里,看看ourpalm_jni.RunSign是在哪里导入的,这里可以用IDEA调试smali代码在初始化下段然后单步跟踪,确定出这里是退出前的地方.
1 | public ourpalm_android_SdkJni ourpalm_jni; |
在lib文件夹里,找到libourpalm_sdk_a.so文件
\lib\armeabi-v7a\libourpalm_sdk_a.so
IDA载入,在导出函数表里Alt-T或者Ctrl-F搜索RunSign
EXPORT Java_ourpalm_android_sdkjni_ourpalm_1android_1SdkJni_RunSign
.text:000244B4 Java_ourpalm_android_sdkjni_ourpalm_1android_1SdkJni_RunSign
1 | .text:000244C4 FF F7 3E FF BL checksign |
用16进制工具C32Asm去掉,这两个函数call调用的地方
改为”悙悙” 即是,填充为0或者90
或者改为 00 00 A0 E1 是move r0,r0 相当于ARM汇编的NOP
又或者改为 00 F0 20 E3 是ARM汇编的NOP;
1 | .text:000244C4 90 90 90 90 aRrrr_0 DCB "悙悙" |
\lib\x86\libourpalm_sdk_a.so
x86的也顺便一起处理了
1 | .text:000302DA 90 90 90 90 90 |
3. 添加版权自定义提示等信息
自己定义版权提示Unicode字符串:
\u65e0\u9650\u5185\u8d2dB.S.\u7834\u89e3\u7248\n www.appleos.xyz \n \u7231\u6deb\u8361 \n — by B.S.
通常在启动页面或者闪屏页面的onCreate里插入log和弹出消息,又或者是利用程序自己的封装的消息机制.
比如,内购破解改法1里的:
1 | .line 722 |
4. 统一支付接口
只需要让getMobileType返回你想要伪装的类型值就行了,返回值为3是电信,1是移动,2是联通.
1 | public static int getMobileType(Context context) { |
要修改的类
.class public Lcom/fgol/IAPInterface;
.super Lcom/unity3d/player/UnityPlayerActivity;
.source “IAPInterface.java”
下面函数修改地方:
.method public static getMobileType(Landroid/content/Context;)I
1 | .line 130 |