全民捕鱼—内购分析
本帖最后由 Nattevak 于 2022-4-20 16:10 编辑# 全民捕鱼内购分析
## 字符串分析法
搜索“购买失败”字符串
使用工具查看当前java代码
寻找发消息的函数,搜索10005,需将其转为16进制
购买失败、取消购买发送10005,购买成功-buyOk则发送10010
向上分析,可知IAPListener$1是反编译时生成的匿名内部类
## 日志分析法
选择捕鱼进程
进行购买操作,购买失败获取对应的日志,自下而上分析
搜索支付码
查看java代码,可以发现就是我们刚刚通过字符串分析找到的位置
对比支付成功与支付失败的代码差异,分析修改方法,可以发现主要就是OderFinish函数的区别,我们只需要修改OderFinish函数的参数即可更改支付操作。
修改参数或替换整体代码,然后编译并重新安装程序
仅修改参数则同样显示购买失败字样,但实际支付成功
也可修改消息码为10010(0x271a)同样可显示购买成功且实际支付成功
替换整体代码显示购买成功且实际支付成功
## 去除支付弹窗
虽然这里已经可以完成购买操作了,但是每次购买时都会弹出支付框,严重影响我们充值的效率
### 方法一
我们已知关键函数OderFinish的调用可以获取金币,那我们就在调用弹出对话框的代码之前调用OderFinish函数,绕过支付弹窗。
根据日志分析,可以找一些比较靠前的日志输出,一般这个时候还没有弹出对话框。
因为需要找到弹窗之前的位置,所以这里需要自上而下的分析,尝试搜索GameJni order payCode字符串,此处日志位置基本属于顶端,应该是还没有弹支付框的。
搜索字符串,查看java代码
想让支付操作在弹窗之前,则需要将OderFinish函数在GameJni order payCode之前被调用
在GameJni.class中搜索OderFinish
对应Android代码
注释掉order中的两条语句,替换为OderFinish中的nativeOderFinish语句,此修改方法需要注意参数是否匹配
点击购买后无支付弹窗,直接显示购买成功
### 方法二
分析order函数部分
进入GamePay,存在LIstener,即进入IAPListener类中进行分析
可以看到,IAPListener类的order函数中也有OderFinish
对应Android中的代码
**修改方法:**
修改const/4 v0,0x0 为 const/4 v0,0x1
在函数开头添加 goto :cond_2 语句
修改成功后保存并重新编译,安装APK,运行游戏进行测试,成功
## 添加自己的购买反馈信息
在我们刚添加goto语句的位置上方有const/16 v3, 0x2714语句,可知为消息码10004,将其更改为10005->const/16 v3, 0x2715便于我们添加自己的信息(修改为0x271a也可以)
由于我们需要让他发消息,所以暂时剪切goto :cond_2语句,向下分析,找到if语句,将其注释掉,让他不进行判断,直接发消息
等调用了sendMessage发送了消息后,添加goto :cond_2语句,直接跳转
将10005消息码对应的购买失败字样更改为我们想要他显示的内容
成功添加自定义的显示内容
## 增加游戏启动的提示信息
在入口类LogoActivity中的onCreate函数的末尾,插入Toast调用代码即可。
使用AndroidKiller中的模板
在const-string v0, "you message"处,将you message修改为自己添加的启动信息即可
## 动态调试smali代码
导入AndroidKiller下的Project目录“..\AndroidKiller_v1.3.1\projects\fkby\Project”
```
列举设备
adb devices
安装apk
Adb install fkby.apk
以调试方式启动apk
adb shell am start -D -n com.bufish.org/.LogoActivity
查看进程端口
adb shell "ps | grep bufish"
转发端口
adb forward tcp:8700 jdwp:1235
查找 8700 端口占用程序 PID
netstat -nao | findstr "8700"
```
修改调试配置中的连接端口为8700
Debug运行,连接成功,程序断下
**动态调试操作顺序:**
① 使用Androidstudio导入smali代码,创建项目
② 打开进程管理器,结束adb.exe
③ 打开模拟器
④ 以调试方式启动apk
⑤ 转发端口
⑥ Debug运行程序
李杨 发表于 2022-4-20 16:34
没有成品
成品是论坛中不建议发布的,但是思路和方法是允许的 各位大佬能不能帮帮小弟我更改了捕鱼的支付宝支付的环节但是还是不行iget v0 v5 Landroid/os/Message;->what:I
const/4 v1 1
if-eq v0 v1 :label_112
const/4 v1 3
if-eq v0 v1 :label_95
const/4 v1 4
if-eq v0 v1 :label_42
const/4 v1 6
if-eq v0 v1 :label_36
const/4 v1 7
if-eq v0 v1 :label_19
goto/16 :label_198
label_19:
iget-object v5 v5 Landroid/os/Message;->obj:Ljava/lang/Object;
check-cast v5 Ljava/lang/String;
sput-object v5 Lorg/cocos2dx/lua/AppActivity;->WxCode:Ljava/lang/String;
sget-object v5 Lorg/cocos2dx/lua/AppActivity;->WxCode:Ljava/lang/String;
const-string v0 "wx5e06512bc1d29b65"
const-string v1 ""
invoke-static {v5,v0,v1} Lorg/cocos2dx/lua/GameHelper;->setWxToken(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
goto/16 :label_198
label_36:
iget-object v5 v5 Landroid/os/Message;->obj:Ljava/lang/Object;
check-cast v5 Ljava/lang/String;
goto/16 :label_198
label_42:
iget-object v5 v5 Landroid/os/Message;->obj:Ljava/lang/Object;
check-cast v5 Lorg/cocos2dx/lua/DialogMessage;
new-instance v0 Landroid/app/AlertDialog$Builder;
sget-object v1 Lorg/cocos2dx/lua/AppActivity;->mContext:Landroid/content/Context;
invoke-direct {v0,v1} Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V
iget-object v1 v5 Lorg/cocos2dx/lua/DialogMessage;->msg:Ljava/lang/String;
invoke-virtual {v0,v1} Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;
move-result-object v0
iget-object v5 v5 Lorg/cocos2dx/lua/DialogMessage;->title:Ljava/lang/String;
invoke-virtual {v0,v5} Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;
move-result-object v5
new-instance v0 Lorg/cocos2dx/lua/AppActivity$4$2;
invoke-direct {v0,v4} Lorg/cocos2dx/lua/AppActivity$4$2;-><init>(Lorg/cocos2dx/lua/AppActivity$4;)V
const-string v1 "确定"
invoke-virtual {v5,v1,v0} Landroid/app/AlertDialog$Builder;->setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
move-result-object v5
new-instance v0 Lorg/cocos2dx/lua/AppActivity$4$1;
invoke-direct {v0,v4} Lorg/cocos2dx/lua/AppActivity$4$1;-><init>(Lorg/cocos2dx/lua/AppActivity$4;)V
const-string v1 "取消"
invoke-virtual {v5,v1,v0} Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;
move-result-object v5
invoke-virtual {v5} Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;
move-result-object v5
invoke-virtual {v5} Landroid/app/AlertDialog;->show()V
goto :label_198
label_95:
new-instance v0 Lorg/cocos2dx/lua/GameUpdate;
iget-object v1 v4 Lorg/cocos2dx/lua/AppActivity$4;->this$0:Lorg/cocos2dx/lua/AppActivity;
invoke-direct {v0,v1} Lorg/cocos2dx/lua/GameUpdate;-><init>(Landroid/content/Context;)V
iget-object v5 v5 Landroid/os/Message;->obj:Ljava/lang/Object;
check-cast v5 Ljava/lang/String;
iput-object v5 v0 Lorg/cocos2dx/lua/GameUpdate;->urlString:Ljava/lang/String;
invoke-virtual {v0} Lorg/cocos2dx/lua/GameUpdate;->downloadApk()V
goto :label_198
label_112:
const/4 v0 0
label_113:
iget-object v1 v5 Landroid/os/Message;->obj:Ljava/lang/Object;
check-cast v1 Lorg/cocos2dx/lua/AlipayMessage;
iget-object v5 v5 Landroid/os/Message;->obj:Ljava/lang/Object;
check-cast v5 Lorg/cocos2dx/lua/AlipayMessage;
new-instance v1 Lorg/cocos2dx/lua/Result;
iget-object v2 v5 Lorg/cocos2dx/lua/AlipayMessage;->result:Ljava/lang/String;
invoke-direct {v1,v2} Lorg/cocos2dx/lua/Result;-><init>(Ljava/lang/String;)V
iget v2 v5 Lorg/cocos2dx/lua/AlipayMessage;->amount:I
iget v5 v5 Lorg/cocos2dx/lua/AlipayMessage;->getgold:I
iget-object v1 v1 Lorg/cocos2dx/lua/Result;->resultStatus:Ljava/lang/String;
const-string v3 "9000"
invoke-static {v1,v3} Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
move-result v3
#if-eqz v3 :label_157
iget-object v1 v4 Lorg/cocos2dx/lua/AppActivity$4;->this$0:Lorg/cocos2dx/lua/AppActivity;
const-string v3 "充值成功"
invoke-static {v1,v3,v0} Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v1
invoke-virtual {v1} Landroid/widget/Toast;->show()V
invoke-static {v2,v5} Lorg/cocos2dx/lua/GameHelper;->payReturn(II)V
goto :label_198
label_157:
const-string v5 "8000"
invoke-static {v1,v5} Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
move-result v5
label_163:
const-string v1 "充值失败"
#if-eqz v5 :label_177
label_167:
iget-object v5 v4 Lorg/cocos2dx/lua/AppActivity$4;->this$0:Lorg/cocos2dx/lua/AppActivity;
invoke-static {v5,v1,v0} Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v5
invoke-virtual {v5} Landroid/widget/Toast;->show()V
goto :label_198
label_177:
iget-object v5 v4 Lorg/cocos2dx/lua/AppActivity$4;->this$0:Lorg/cocos2dx/lua/AppActivity;
invoke-static {v5,v1,v0} Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v5
invoke-virtual {v5} Landroid/widget/Toast;->show()V
label_186:
goto :label_198
label_187:
iget-object v5 v4 Lorg/cocos2dx/lua/AppActivity$4;->this$0:Lorg/cocos2dx/lua/AppActivity;
const-string v1 "充值异常"
invoke-static {v5,v1,v0} Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v5
invoke-virtual {v5} Landroid/widget/Toast;->show()V
label_198:
return-void
#Handler Exceptions
.catch Ljava/lang/Exception;
start : label_113
end : label_163
handler : label_187
.end catch
.catch Ljava/lang/Exception;
start : label_167
end : label_186
handler : label_187
.end catch
blob:https://www.21zui.com/d77397f4-40d0-4fd6-9616-546cbc4ca94c 优秀 支持一下{:1_921:} 条理清晰,分析透彻,感谢分享。
优秀 支持一下 感谢分享 666666665 分析得很好 没有成品 学习学习,玩点小游戏充钱太贵了,哈哈