Android逆向之破解某僵尸游戏

软件原版链接: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的函数调用跟踪功能太好用了,

你可能感兴趣的:(Android逆向)