本帖最后由 liye1320 于 2015-8-13 13:23 编辑
本帖适合新手阅读。
使用工具:ApkIDE(改之理),jd-gui等等
原始apk:http://pan.baidu.com/s/1qWKbXIs
由于这个apk会根据不同的环境而有不同的支付方式,下面仅仅只详细说明,有移动SIM卡的手机,如果你使用虚拟机或者没有卡的手机,那么第一张图的界面都会不一样,但是主要流程还是一样的。
下面流程对于聪明的人说,完全可以凭经验和才智直接定位,如果你是这样的人,请忽略。
破解记录如下:
1.从界面着手
首先点击游戏需要付费的地方,出现下图:
我们看到“手机短信激活游戏”(其他字符串也有相同效果),那么现在用ApkIDE打开游戏原始apk,搜索“手机短信激活游戏”得到
<string name="tip_1">手机短信激活游戏!</string>
我们接着搜索"tip_1",得到:
从第一条中,我们知道这个界面对应paydialog.xml,那么继续搜索paydialog.xml,无果,搜索paydialog,结果太多了,我们试试全字匹配搜索,结果如下
从图中分析,现在我们大概能确定切入点在这里com.zeptolab.ctr.ads.chinese.gamebase\smali\org\ifree\PayManager\PayView\IfreePayDialog.smali
2.利用jd-gui查看对应的代码分析
这里可以看到根据OperatorType不同,会有两种不同的支付界面,这个后面再说。我们此次流程对应的是ClickEvent(),关键代码如下:
这里就很容易明白了,这三个函数对应的就是“失败”“成功”“取消”的响应函数。
3.修改代码,进行破解
我们需要做的事,就是让“失败”或者“取消”,能够响应“成功”的函数,最简单的做法就是:替换函数名!
我们在ApkIDE中搜索onBillingSuccess,可以看到函数定义在smali\org\ifree\PayManager\PayView\IfreePayDialog$5$1.smali中,其他调用的地方可以忽略
点进去看,依次可以找到onBillingSuccess onBillingFail onUserOperCancel。
一般支付失败的可能性较小,为了方便,我们把onBillingSuccess 和 onUserOperCancel名字对换,当用户取消的时候,执行成功的响应函数。
保存代码,编译。
安装后运行apk,到支付的那个界面,点击确认支付20元激活游戏,如下图:
按照上图的红圈操作,先点击关闭,后弹出上图2,再点击不购买,就支付成功了!
到这里,这一种情况的破解就完成了。
4.破解流程中其他的一些路径说明
1)paydialog和otherpay两种支付界面。
对应的点击函数是ClickEvent()和Other_ClickEvent()
我们上面的流程是paydialog界面,因为我是真机测试的。如果没有sim卡或者使用虚拟机,就会使用otherpay,利用支付宝等支付。代码如下:
[Java] 纯文本查看 复制代码 protected void onCreate(Bundle paramBundle)
{
requestWindowFeature(1);
getWindow().setBackgroundDrawable(new BitmapDrawable());
this.context = this;
super.onCreate(paramBundle);
alp_infoicon = createDrawable("alp_infoicon.png");
alp_info = createDrawable("alp_info.png");
this.OperatorType = GetPhoneCardType.getIntance(this).getPhoneOperator();
if ((this.OperatorType != 5) && (this.OperatorType != -1))
setContentView(getResId("paydialog", "layout"));
do
while (true)
{
StringMsg.setOperatorID(this.OperatorType);
if ((this.OperatorType == 5) || (this.OperatorType == -1))
break;
init();
return;
if (this.OperatorType != -1)
continue;
setContentView(getResId("otherpay", "layout"));
}
while (this.OperatorType != -1);
oth_init();
} [Java] 纯文本查看 复制代码 public int getPhoneOperator()
{
int i = -1;
this.tm = ((TelephonyManager)this.context.getSystemService("phone"));
String str = this.tm.getSimOperator();
boolean bool = str.equals("");
System.out.println(bool + "=====>" + str);
StringMsg.setIsNoSim(bool);
if (!bool);
switch (Integer.parseInt(str))
{
case 46004:
case 46005:
case 46006:
default:
i = 5;
return i;
case 46000:
case 46002:
case 46007:
return 1;
case 46003:
return 2;
case 46001:
}
return 6;
}
}
这里为了统一,可以让所有返回值都为1,让apk把当前环境当作有移动SIM卡的环境。没有SIM卡的手机中,如果这样做了的话,按照上述方法破解后,会出现好友代付的界面,有兴趣的朋友可以自己继续破解。
|