吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7009|回复: 80
收起左侧

[Android 原创] 全民捕鱼—内购分析

  [复制链接]
Nattevak 发表于 2022-4-20 16:09
本帖最后由 Nattevak 于 2022-4-20 16:10 编辑

全民捕鱼内购分析

1.1

1.1

字符串分析法

  搜索“购买失败”字符串

1.2

1.2
  使用工具查看当前java代码

1.3

1.3

  寻找发消息的函数,搜索10005,需将其转为16进制

1.4

1.4

  购买失败、取消购买发送10005,购买成功-buyOk则发送10010

1.5

1.5

  向上分析,可知IAPListener$1是反编译时生成的匿名内部类

1.6

1.6

日志分析法

  选择捕鱼进程

2.1

2.1
  进行购买操作,购买失败获取对应的日志,自下而上分析

2.2

2.2

  搜索支付码

2.3

2.3

  查看java代码,可以发现就是我们刚刚通过字符串分析找到的位置
  对比支付成功与支付失败的代码差异,分析修改方法,可以发现主要就是OderFinish函数的区别,我们只需要修改OderFinish函数的参数即可更改支付操作。

2.4

2.4

  修改参数或替换整体代码,然后编译并重新安装程序

2.5

2.5

  仅修改参数则同样显示购买失败字样,但实际支付成功

2.6

2.6

  也可修改消息码为10010(0x271a)同样可显示购买成功且实际支付成功

2.7

2.7

  替换整体代码显示购买成功且实际支付成功

2.8

2.8

去除支付弹窗

  虽然这里已经可以完成购买操作了,但是每次购买时都会弹出支付框,严重影响我们充值的效率

2.9

2.9

方法一

  我们已知关键函数OderFinish的调用可以获取金币,那我们就在调用弹出对话框的代码之前调用OderFinish函数,绕过支付弹窗。
  根据日志分析,可以找一些比较靠前的日志输出,一般这个时候还没有弹出对话框。
  因为需要找到弹窗之前的位置,所以这里需要自上而下的分析,尝试搜索GameJni order payCode字符串,此处日志位置基本属于顶端,应该是还没有弹支付框的。

3.0

3.0
  搜索字符串,查看java代码

3.1.1

3.1.1

3.1.2

3.1.2

  想让支付操作在弹窗之前,则需要将OderFinish函数在GameJni order payCode之前被调用

3.1.3

3.1.3

  在GameJni.class中搜索OderFinish

3.1.4

3.1.4

  对应Android代码

3.1.5

3.1.5

  注释掉order中的两条语句,替换为OderFinish中的nativeOderFinish语句,此修改方法需要注意参数是否匹配

3.1.6

3.1.6

  点击购买后无支付弹窗,直接显示购买成功

3.1.7

3.1.7

方法二

  分析order函数部分

3.2.1

3.2.1
  进入GamePay,存在LIstener,即进入IAPListener类中进行分析

3.2.2

3.2.2

  可以看到,IAPListener类的order函数中也有OderFinish

3.2.3

3.2.3

  对应Android中的代码

3.2.4

3.2.4

修改方法:
  修改const/4 v0,0x0 为 const/4 v0,0x1

3.2.5

3.2.5

  在函数开头添加 goto :cond_2 语句

3.2.6

3.2.6

  修改成功后保存并重新编译,安装APK,运行游戏进行测试,成功

3.2.7

3.2.7

添加自己的购买反馈信息

  在我们刚添加goto语句的位置上方有const/16 v3, 0x2714语句,可知为消息码10004,将其更改为10005->const/16 v3, 0x2715便于我们添加自己的信息(修改为0x271a也可以)
  由于我们需要让他发消息,所以暂时剪切goto :cond_2语句,向下分析,找到if语句,将其注释掉,让他不进行判断,直接发消息

4.1

4.1
  等调用了sendMessage发送了消息后,添加goto :cond_2语句,直接跳转

4.2

4.2

  将10005消息码对应的购买失败字样更改为我们想要他显示的内容

4.3

4.3

  成功添加自定义的显示内容

4.4

4.4

增加游戏启动的提示信息

  在入口类LogoActivity中的onCreate函数的末尾,插入Toast调用代码即可。
  使用AndroidKiller中的模板

5.1

5.1
  在const-string v0, "you message"处,将you message修改为自己添加的启动信息即可

5.2

5.2

动态调试smali代码

  导入AndroidKiller下的Project目录“..\AndroidKiller_v1.3.1\projects\fkby\Project”

6.1

6.1

列举设备
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"

6.2

6.2

6.3

6.3

  修改调试配置中的连接端口为8700

6.4

6.4

  Debug运行,连接成功,程序断下

6.5

6.5

动态调试操作顺序:
  ① 使用Androidstudio导入smali代码,创建项目
  ② 打开进程管理器,结束adb.exe
  ③ 打开模拟器
  ④ 以调试方式启动apk
  ⑤ 转发端口
  ⑥ Debug运行程序



免费评分

参与人数 27威望 +1 吾爱币 +44 热心值 +21 收起 理由
云的彼岸918 + 1 + 1 能不能提供一个原版的app,下载下来练练手
走街串巷 + 1 + 1 热心回复!
Zz4794zZ + 1 + 1 谢谢@Thanks!
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Jamesblank + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qcyt + 1 + 1 谢谢@Thanks!
liuhuo666 + 1 + 1 我很赞同!
LIMUYUN + 1 鼓励转贴优秀软件安全工具和文档!
清蒸 + 1 + 1 图文并茂,爱了!
wapj258 + 1 + 1 用心讨论,共获提升!
xb0wxh + 1 + 1 谢谢@Thanks!
poi79 + 1 + 1 我很赞同!
Godkowns + 1 谢谢@Thanks!
chinawolf2000 + 1 + 1 热心回复!
生如上善若水 + 1 + 1 谢谢@Thanks!
笙若 + 1 + 1 谢谢@Thanks!
weixu + 1 + 1 热心回复!
windows12 + 1 热心回复!
SmallRadar + 1 以前读书就喜欢玩这个!哈哈
大脑组织残缺 + 1 用心讨论,共获提升!
茫侠 + 1 + 1 用心讨论,共获提升!
叫我大鸟 + 1 + 1 用心讨论,共获提升!
XINJIAN9 + 1 谢谢@Thanks!
夜步城 + 1 + 1 鼓励原创教程
ameiya888 + 1 + 1 谢谢@Thanks!
zhenkx345 + 1 我很赞同!
一抹深蓝 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ehcapa 发表于 2022-4-20 16:47

成品是论坛中不建议发布的,但是思路和方法是允许的
lyflj 发表于 2022-5-24 20:51
各位大佬  能不能帮帮小弟  我更改了捕鱼的支付宝支付的环节但是还是不行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
一抹深蓝 发表于 2022-4-20 16:15
豪气冲天 发表于 2022-4-20 16:18
条理清晰,分析透彻,感谢分享。
JAKE2021 发表于 2022-4-20 16:25

优秀 支持一下
士喂知己者屎 发表于 2022-4-20 16:27
感谢分享
qingchunbuxiu 发表于 2022-4-20 16:31
666666665
mjxiao 发表于 2022-4-20 16:34
分析得很好
李杨 发表于 2022-4-20 16:34
没有成品
aslance 发表于 2022-4-20 17:04
学习学习,玩点小游戏充钱太贵了,哈哈
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表