goto大法 && switch大法 && 替换函数名大法实例一则。

欢乐切水果大作战

Pay:咪咕支付

Smali:smali/com/mydefinemmpay/tool/MymmPay.smali

思路:

游戏支付显示咪咕支付,同时反编译后发现MiguSdkxxx.smali【也可以直接搜索dobilling函数来快速认证】,确定;

同样是支付取消或者支付失败没有提示,直接搜关键词的unicode码,发现MymmPay.smali;

感觉调用的支付SDK很简单也很粗暴,MymmPay.smali存在payResultCancel、payResultFalse、payResultSuccess三个特征函数;

①、直接将函数内容替换掉完全可以,和昨晚例子一样,这里可以修改两处,即【函数内容】或【调用此函数的函数内容】,分别在:

smali/com/mydefinemmpay/tool/MymmPay.smali

smali/com/mydefinemmpay/tool/MiGuSdkPay.smali

②、goto大法 && switch大法 && 替换函数名大法;

三种方法其实都是依据:查找到的调用payResultCancel 、payResultFalse函数位置;

全局搜索payResultFalse,发现有几处地方:

smali/com/mydefinemmpay/tool/MiGuSdkPay$1.smali【主】

smali/com/mydefinemmpay/tool/MiGuSdkPay$7.smali

smali/com/mydefinemmpay/tool/MiGuSdkPay$8.smali

1、goto大法

.line 57
:pswitch_0
:goto_8
iget-object v0, p0, Lcom/mydefinemmpay/tool/MiGuSdkPay$1;->this$0:Lcom/mydefinemmpay/tool/MiGuSdkPay;
invoke-virtual {v0}, Lcom/mydefinemmpay/tool/MiGuSdkPay;->payResultSuccess()V
goto :goto_0

见第三行,这是为调用payResultSuccess函数赋给一个标签:goto_8;

在前后payResultCancel、payResultFalse调用前直接加一个goto :goto_8,使其执行前先强制跳转去执行payResultSuccess;

如payResultCancel:

.line 65
goto :goto_8
iget-object v0, p0, Lcom/mydefinemmpay/tool/MiGuSdkPay$1;->this$0:Lcom/mydefinemmpay/tool/MiGuSdkPay;
invoke-virtual {v0}, Lcom/mydefinemmpay/tool/MiGuSdkPay;->payResultCancel()V

2、switch大法

:pswitch_0
iget-object v0, p0, Lcom/mydefinemmpay/tool/MiGuSdkPay$1;->this$0:Lcom/mydefinemmpay/tool/MiGuSdkPay;
invoke-virtual {v0}, Lcom/mydefinemmpay/tool/MiGuSdkPay;->payResultSuccess()V
...
:pswitch_data_0
.packed-switch 0x1
    :pswitch_0
    :pswitch_1
.end packed-switch

:pswitch_0为调用payResultSuccess函数,直接将失败1改为0;

:pswitch_data_0
.packed-switch 0x1
    :pswitch_0
    :pswitch_0
.end packed-switch

3、替换函数名大法

由于payResultCancelpayResultFalsepayResultSuccess三个函数所需参数一样,直接将敏感位置【SDK】的payResultCancel、payResultFalse替换为payResultSuccess;

成果

破解了时间…

1119557840

注意

一般这种内购破解,逆向后首先将敏感权限去掉:

AndroidManifest.xml里去除可能会产生费用的危险权限:
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>

总结

简单apk的静态分析大致流程:

玩游戏看特征 -> 反编译 -> 敏感权限删除 -> smali关键词定位 -> goto&switch&if&替换&删除.... -> 回编译并签名

看52pojie上好多人都说这种没有壳没有混淆的太简单,直接找对应支付SDK,有针对性的去修改smali就完事了;

也有许多师傅们总结了各种支付平台内购关键词,很有针对性;

如:

咪咕、和游戏搜索方法名
onResult,onchinabilling,resulton,Paycenter,Callback

联通游戏搜索方法名
OnPayResult,PyaResulton,Activity,result,callback

电信爱游戏搜索方法名
paySuccess成功,payCancel取消,payFailed失败

移动mm搜索方法名
onBillingFinish,Billing,CallBack

支付宝和银行卡方法名
handle,message

支付宝搜索字符:9000
360支付
onfinishedon,Activityresult
发送短信上限:android.permission.SEND_SMS
发送短信锁定支付式关建字符串

对付安卓游戏逆向可以去各大安卓市场搜索下载最新版本:(推荐支付接口比较熟悉的移动,咪咕游戏,爱游戏…)

爱游戏: http://www.play.cn
咪咕游戏: http://g.10086.cn
中国移动应用商城: http://mm.10086.cn/android 
腾讯应用宝: http://android.myapp.com
360手机助手: http://zhushou.360.cn
百度旗下安卓市场: http://apk.hiapk.com
安智市场: http://www.anzhi.com
应用汇安卓市场: http://www.appchina.com
魅族应用商店: http://app.flyme.cn
小米游戏中心: http://game.xiaomi.com/index.php 
华为应用市场: http://appstore.huawei.com