软件原版链接:http://www.wandoujia.com/apps/com.jianyou.jszzj.wdj
这款游戏是使用了九游的支付单机sdk,通过分析它的sdk支付代码,要想调用支付必须得先调用以下代码:
SDKCore.pay(this._zcActivity, payIntent, this.paylisten);
第一个参数为当前Activity,第二个参数为支付数据,第三个参数为支付结果监听器,
通过分析,我们可以采用两种方式破解它:
第一种:修改第二个参数payIntent,即修改他的支付数据,将金额改成0.01,即可破解!
下面是本游戏的支付参数设置代码:
String productID = (String) mProductionInfo.get("Product_Id");
String productName = (String) mProductionInfo.get("Product_Name");
String price = (String) mProductionInfo.get("Product_Price");
String orderId = (String) mProductionInfo.get("Order_Id");
Intent payIntent = new Intent();
payIntent.putExtra(SDKProtocolKeys.CP_ORDER_ID, orderId);
payIntent.putExtra(SDKProtocolKeys.APP_NAME, "******");
payIntent.putExtra(SDKProtocolKeys.PRODUCT_NAME, productName);
payIntent.putExtra(SDKProtocolKeys.AMOUNT, price);//我们只要修改这个price为"0.01"即可.
if (operator != 0) {
payIntent.putExtra(SDKProtocolKeys.PAY_CODE, getPaycode(productID, operator));
}
try {
SDKCore.pay(this._zcActivity, payIntent, this.paylisten);//调用支付
} catch (Exception ex) {
ex.printStackTrace();
}
虽然这种方法破解简单,但仍需要支付0.01的现金,接下来我们来介绍第二种破解方式。
第二种就是修改他的第三个参数this.paylisten
监听代码如下:
private SDKCallbackListener paylisten = new SDKCallbackListener() {
public void onSuccessful(int status, Response response) {
boolean z = true;
if (2 != status && response.getType() != 100 && response.getType() == 101) {
response.setMessage(Response.OPERATE_SUCCESS_MSG);
if (response.getData() != null) {
try {
String payType = new JSONObject(response.getData()).getString(PayResponse.PAY_TYPE);
if (payType.equals("991") || payType.equals("992") || payType.equals("993")) {
ThreeNetSDKHelper instance = ThreeNetSDKHelper.getInstance();
if (response.getStatus() != 1) {
z = false;
}
instance.purchaseOperatorResult(z);//核心代码,也是我们要破解的
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
通过分析代码知道: instance.purchaseOperatorResult(z);当传入true时,即表明支付成功,我们只要强制传入true就可以破解了,不过它之前有一些判断条件,为了不影响调用,我们需要把这些条件删除,删除后如下:
private SDKCallbackListener paylisten = new SDKCallbackListener() {
public void onSuccessful(int status, Response response) {
ThreeNetSDKHelper instance = ThreeNetSDKHelper.getInstance();
instance.purchaseOperatorResult(true);
}
}
这样就达到破解的目的了。
不过这样破解的并不完美,它仍然会调用9游支付界面,很麻烦!
我们可以直接在调用支付代码时,不让它调用,直接调用 instance.purchaseOperatorResult(true);
这样就能实现只要一点击购买按钮,立马就能支付成功!
1.jadx的函数调用跟踪功能太好用了,