小白的第一次逆向笔记《女X与海》
本帖最后由 zhufengwan 于 2022-11-30 00:08 编辑## 前言
作为刚刚免费注册的小白,无意间看到了[丁宝振](https://www.52pojie.cn/home.php?mod=space&uid=266704)大佬的这篇文章:(https://www.52pojie.cn/thread-1707463-1-1.html),因为手机刚好有MT管理器,就试了一下,原来安卓逆向这么简单(当然说的是签名打包,并不是说思路简单,毕竟如果文中没有关键字,自己不知道找到什么时候了),原来的时候只是知道,反编译改了以后还需要重新签名打包。
然后想着自己就是搞JAVA的如果反编译了看代码不是更爽,结果MT管理器这个功能收费!!所以在论坛找到了[昨夜星辰2012](https://www.52pojie.cn/home.php?mod=space&uid=571540)大佬的PC端工具打造教程:(https://www.52pojie.cn/thread-726176-1-1.html),还是有趁手的工具事半功倍啊,工具打造好了当然要练练手学习学习了,小白的第一篇交流贴,如有不足,希望大佬们指正哈!
## 环境工具
**AndroidKiller V1.3.1.0 内置 jd-gui 反编译工具**
**https://hexed.it/ 16进制编辑器**
**jsc解加密工具-Orange**
## 正文开始
刚好最近媳妇在玩一款微信小游戏,尝试了使用gg修改器直接修改内存,结果一直找不到数据,然后下载了游戏客户端,结果直接提示数据异常,将游戏内金币、蓝钻都重置了,本来已经放弃修改,结果看到了安卓逆向又有了思路,既然强行修改不行,那就按照程序自己的逻辑来修改!
### 目标一:先跳过广告领取奖励吧
这中间各种辛酸,先是自己找,找不到然后搜各种类似的帖子大概范围缩小到下图这个类看着比较像。
但是即使反编译了看,也还是没有找到关键点,最后无奈祭出大杀器InjectLog,操作了一次就找到了关键点如下图,真是查了十万八千里。
反编译看一下,只列一下关键代码逻辑
```java
public void onADClose()
{
Log.i("YouXuanVedio", "onADClose");
if (YouXuanVedio.canGiveReward)
{
YouXuanVedio.sendFunc(YouXuanVedio.LocalMsg_SDK_ChuanShanJiaPlayVedioSuccess, "");
YouXuanVedio.canGiveReward = false;
}
YouXuanVedio.sendFunc(YouXuanVedio.LocalMsg_SDK_ChuanShanJiaPlayVedioClose, "");
}
public static void playVedio()
{
AppActivity localAppActivity = AppActivity.sGameClient;
Log.v("CZXZ", "playVedio---");
AppActivity.sGameClient.runOnUiThread(new Runnable()
{
public void run()
{
if ((YouXuanVedio.mIsLoadSuccess) && (YouXuanVedio.mRewardVideoAD != null) && (YouXuanVedio.mRewardVideoAD.isValid()))
{
YouXuanVedio.mRewardVideoAD.showAD();
return;
}
YouXuanVedio.loadAd();
}
});
}
```
看这两个方法,直接 playVedio 时走 onADClose 不就可以了,说干就干!
因为看过点 JAVA 虚拟机,所以这些虽然跟 JAVA 字节码不一样,但是也比较类似,如图直接改,注释掉多余代码,粘贴需要的代码,目测 .locals 2 应该是局部变量吧,因为变量数没变这块应该不用动。
编译 -> 签名 -> 打包 -> 装机实测(由于单位配的surface laptop go,没装上安卓虚拟机) -> 完美,再也不用看广告了!
### 目标二:当然是刷钻石、金币和体力
因为还是学习为主嘛,先是自己找关键点,思路是购买免付款,在付款失败或者付款取消位置调用付款成功逻辑,找到好多个 onCancel、onComplete、onFail 等函数感觉都不太对,没办法还是上 InjectLog,找到了付款调用逻辑。
```java
public static void Recharge(String paramString)
throws JSONException
{
Object localObject = AppActivity.sGameClient;
Log.d("CZXZ", "domayiSdkPay!!!!!!!!!");
paramString = new JSONObject(paramString);
localObject = new HashMap();
((HashMap)localObject).put("playerId", sdkLoginData.playerId);
((HashMap)localObject).put("mchOrderNo", paramString.getString("orderid"));
((HashMap)localObject).put("pay_product_des", paramString.getString("goodsDes"));
((HashMap)localObject).put("subject", paramString.getString("subject"));
((HashMap)localObject).put("pay_price", "0.01");
((HashMap)localObject).put("attach", paramString.getString("attach"));
((HashMap)localObject).put("playerExtend", paramString.getString("exInfo"));
MSLDSDK.action(AppActivity.sGameClient, "PluginPay/showChargePage", (HashMap)localObject, new MSLDPayCallback()
{
public void onCancel()
{
System.out.println("支付取消");
}
public void onComplete()
{
System.out.println("支付完成");
}
public void onFail(int paramAnonymousInt, String paramAnonymousString)
{
PrintStream localPrintStream = System.out;
StringBuilder localStringBuilder = new StringBuilder();
localStringBuilder.append("支付");
localStringBuilder.append(paramAnonymousString);
localPrintStream.println(localStringBuilder.toString());
}
});
}
```
金额换成 0 ,直接测试,失败,虽然支付时金额是 0,但是并没有后续逻辑,猜测程序有校验金额为 0,直接返回,因为找了好久没有找到支付回调的逻辑,只能退而求其次,支付 0.01 测试,成功!
下面是修改金额的代码,上次忘记贴了
### 进阶,尝试跳过支付
目前怀疑是安卓客户端调用了第三方库,然后又执行了 js 代码继续处理,看页面的表现形式以及传参包含:NativeToJs 字样,又调用了底层 native 方法。
```java
public static void sendFunc(String paramString1, String paramString2)
{
StringBuilder localStringBuilder = new StringBuilder();
localStringBuilder.append("NativeToJs(\"");
localStringBuilder.append(paramString1);
localStringBuilder.append("\", \"");
localStringBuilder.append(paramString2);
localStringBuilder.append("\")");
paramString1 = localStringBuilder.toString();
AppActivity.sGameClient.runOnGLThread(new Runnable()
{
public void run()
{
Cocos2dxJavascriptJavaBridge.evalString(this.val$tempStr);
}
});
paramString2 = System.out;
localStringBuilder = new StringBuilder();
localStringBuilder.append("sendFunc:");
localStringBuilder.append(paramString1);
paramString2.println(localStringBuilder.toString());
System.out.println("sendFunc end");
}
package org.cocos2dx.lib;
public class Cocos2dxJavascriptJavaBridge
{
public static native int evalString(String paramString);
}
```
正发愁无路可走的时候,看到(https://www.52pojie.cn/home.php?mod=space&uid=1939300)大佬的文章[小游戏免广告获得奖励的思路与实现](https://www.52pojie.cn/thread-1687913-1-1.html),这不跟我这游戏很类似么,同样的 cocos2dx 的库,跟着步骤找密钥,解密 js ,还真找到了关键点,如下,将所有支付失败位置修改为成功的逻辑
修改为如下代码,目测没有变量找不到,js 应该不会报错。
但是并没有效果,中间找到了观看广告领奖励次数的位置也进行了修改,也没有效果,不禁怀疑是不是找的文件不对,由于整个流程APP相关弹出信息在代码以及 js 中都搜索不到,并且 js 输出也不知道在什么地方查看,目前也只能到此为止了,有大佬路过能指点一二,感激不尽!不过目前已经不影响刷体力,然后退游了。
## 写在最后
论坛小白还有很多的不懂,文章如有不合适的地方也请大佬们指点,都会虚心接受!
### 疑问
这里说一下自己的几个疑问:
1. 只是逆向破解了APP并发文互相学习交流,会有什么问题么?
2. 如果涉及到里面的收费内容,因为没有找到支付的关键点,通过修改付款金额实现低价购买单机游戏内容会有什么问题么?
**注:若转载请注明来源(本贴地址)与作者信息。**
**注:本文仅供研究学习使用,请勿用于非法用途。如有侵权,请联系管理员删除!** 学习了。 谢谢分享,学习一下,不知道能不能学会? 把样本给出来,让大家玩玩{:1_918:} 本着学习的态度来看帖子 学习学习看看 来看看我这套教程{:301_997:} 学习学习了 感谢分享 先收藏。。。
页:
[1]
2