发新帖

[Android] 安卓游戏破解之分支跳转(修改分析)

[复制链接]
6649 4
本帖最后由 水波摇曳 于 2014-11-18 13:34 编辑

【安卓smali破解之分支跳转(修改分析)】


终极冒险岛智能版。
存在箱底下很久了。所以。刚刚停电,(手机端)就开始修改。



为什么会存在箱底很久无法破解。下面有原因的。

修改成功了。下面是修改流程。
也就是今天要讲的;分支跳转修改方法。

首先;
测试游戏提示;
游戏卡死在发送中...
所以直接搜;发送中。
看到如下代码;↓
  1. .method public logic_activate()V
  2.     .locals 8

  3.     const/4 v7, 0x2

  4.     const/4 v6, 0x1

  5.     const/high16 v5, 0x800

  6.     const/4 v4, 0x0

  7.     const/16 v3, 0x32

  8.     sget v0, Lcom/FrameWork/Screen_Main;->activate:I

  9.     goto/16 :goto_1

  10.     packed-switch v0, :pswitch_data_0

  11.     :cond_0
  12.     :goto_0
  13.     return-void

  14.     :pswitch_0
  15.     iget-boolean v0, p0, Lcom/FrameWork/Screen_Main;->b:Z

  16.     if-nez v0, :cond_0

  17.     iget v0, p0, Lcom/FrameWork/Screen_Main;->curPage:I

  18.     packed-switch v0, :pswitch_data_1

  19.     goto :goto_0

  20.     :pswitch_1
  21.     invoke-static {v5}, Lcom/FrameWork/GameScreen;->isInputDown(I)Z

  22.     move-result v0

  23.     if-eqz v0, :cond_1

  24.     sget v0, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_X:I

  25.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_WIDTH:I

  26.     add-int/2addr v0, v1

  27.     sub-int/2addr v0, v3

  28.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_Y:I

  29.     sget v2, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_HEIGHT:I

  30.     add-int/2addr v1, v2

  31.     sub-int/2addr v1, v3

  32.     invoke-static {v0, v1, v3, v3}, Lcom/FrameWork/GameScreen;->touchLogic(IIII)Z

  33.     move-result v0

  34.     if-eqz v0, :cond_1

  35.     invoke-static {v7}, Lcom/FrameWork/GameScreen;->changeSubScreen(I)V

  36.     goto :goto_0

  37.     :cond_1
  38.     invoke-static {v5}, Lcom/FrameWork/GameScreen;->isInputDown(I)Z

  39.     move-result v0

  40.     if-eqz v0, :cond_0

  41.     sget v0, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_X:I

  42.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_Y:I

  43.     sget v2, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_HEIGHT:I

  44.     add-int/2addr v1, v2

  45.     sub-int/2addr v1, v3

  46.     invoke-static {v0, v1, v3, v3}, Lcom/FrameWork/GameScreen;->touchLogic(IIII)Z

  47.     move-result v0

  48.     if-eqz v0, :cond_0

  49.     iput v6, p0, Lcom/FrameWork/Screen_Main;->curPage:I

  50.     iget-object v0, p0, Lcom/FrameWork/Screen_Main;->activateBox:LhlLib/HLTextBox;

  51.     const-string v1, "\u662f\u5426\u786e\u8ba4\u8d2d\u4e70\u6b63\u7248\u9a8c\u8bc1\uff1f"

  52.     invoke-virtual {v0, v1}, LhlLib/HLTextBox;->setText(Ljava/lang/String;)V

  53.     goto :goto_0

  54.     :pswitch_2
  55.     invoke-static {v5}, Lcom/FrameWork/GameScreen;->isInputDown(I)Z

  56.     move-result v0

  57.     if-eqz v0, :cond_2

  58.     sget v0, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_X:I

  59.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_WIDTH:I

  60.     add-int/2addr v0, v1

  61.     sub-int/2addr v0, v3

  62.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_Y:I

  63.     sget v2, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_HEIGHT:I

  64.     add-int/2addr v1, v2

  65.     sub-int/2addr v1, v3

  66.     invoke-static {v0, v1, v3, v3}, Lcom/FrameWork/GameScreen;->touchLogic(IIII)Z

  67.     move-result v0

  68.     if-eqz v0, :cond_2

  69.     iput v4, p0, Lcom/FrameWork/Screen_Main;->curPage:I

  70.     iget-object v0, p0, Lcom/FrameWork/Screen_Main;->activateBox:LhlLib/HLTextBox;

  71.     const-string v1, "\u8d2d\u4e70\u6b63\u7248\u9a8c\u8bc1\uff0c\u53ef\u83b7\u5f97\u6e38\u620f\u540e\u7eed\u5173\u5361\uff0c\u4fe1\u606f\u8d395\u5143\uff08\u4e0d\u542b\u901a\u4fe1\u8d39\uff09\uff0c\u901a\u8fc7\u77ed\u4fe1\u4ee3\u6536\uff0c\u662f\u5426\u786e\u8ba4\u8d2d\u4e70\uff1f"

  72.     invoke-virtual {v0, v1}, LhlLib/HLTextBox;->setText(Ljava/lang/String;)V

  73.     goto :goto_0

  74.     :cond_2
  75.     invoke-static {v5}, Lcom/FrameWork/GameScreen;->isInputDown(I)Z

  76.     move-result v0

  77.     if-eqz v0, :cond_0

  78.     sget v0, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_X:I

  79.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_Y:I

  80.     sget v2, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_HEIGHT:I

  81.     add-int/2addr v1, v2

  82.     sub-int/2addr v1, v3

  83.     invoke-static {v0, v1, v3, v3}, Lcom/FrameWork/GameScreen;->touchLogic(IIII)Z

  84.     move-result v0

  85.     if-eqz v0, :cond_0

  86.     invoke-virtual {p0}, Lcom/FrameWork/Screen_Main;->sendMessage()V

  87.     iput-boolean v6, p0, Lcom/FrameWork/Screen_Main;->b:Z

  88.     iget-object v0, p0, Lcom/FrameWork/Screen_Main;->activateBox:LhlLib/HLTextBox;

  89.     const-string v1, "\u53d1\u9001\u4e2d..."

  90.     invoke-virtual {v0, v1}, LhlLib/HLTextBox;->setText(Ljava/lang/String;)V

  91.     goto/16 :goto_0

  92.     :pswitch_3
  93.     sput v4, Lcom/FrameWork/Screen_Main;->activate:I

  94.     goto/16 :goto_0

  95.     :pswitch_4
  96.     invoke-static {v7}, Lcom/FrameWork/GameScreen;->changeSubScreen(I)V

  97.     sput v4, Lcom/FrameWork/Screen_Main;->activate:I

  98.     sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

  99.     new-instance v1, Ljava/lang/StringBuilder;

  100.     const-string v2, "ACTIVATE_CANCEL======"

  101.     invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

  102.     sget v2, Lcom/FrameWork/Screen_Main;->activate:I

  103.     invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

  104.     move-result-object v1

  105.     invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

  106.     move-result-object v1

  107.     invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

  108.     const/4 v0, -0x1

  109.     invoke-static {v4, v0}, Lcom/FrameWork/GameScreen;->setSaveGameInt(II)V

  110.     const/16 v0, 0x8

  111.     sget v1, Lcom/FrameWork/Screen_Main;->activate:I

  112.     invoke-static {v0, v1}, Lcom/FrameWork/GameScreen;->setSaveGameInt(II)V

  113.     invoke-static {v6}, Lcom/FrameWork/GameScreen;->saveSave(I)V

  114.     goto/16 :goto_0

  115.     :goto_1
  116.     :pswitch_5
  117.     iget-object v0, p0, Lcom/FrameWork/Screen_Main;->activateBox:LhlLib/HLTextBox;

  118.     const-string v1, "\u6e38\u620f\u6fc0\u6d3b\u6210\u529f\uff01 720Tsk688\u4fee\u6539\u5206\u4eab "

  119.     invoke-virtual {v0, v1}, LhlLib/HLTextBox;->setText(Ljava/lang/String;)V

  120.     invoke-static {v5}, Lcom/FrameWork/GameScreen;->isInputDown(I)Z

  121.     move-result v0

  122.     if-eqz v0, :cond_0

  123.     sget v0, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_X:I

  124.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_WIDTH:I

  125.     add-int/2addr v0, v1

  126.     sub-int/2addr v0, v3

  127.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_Y:I

  128.     sget v2, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_HEIGHT:I

  129.     add-int/2addr v1, v2

  130.     sub-int/2addr v1, v3

  131.     invoke-static {v0, v1, v3, v3}, Lcom/FrameWork/GameScreen;->touchLogic(IIII)Z

  132.     move-result v0

  133.     if-eqz v0, :cond_0

  134.     sget v0, Lcom/FrameWork/Screen_Main;->curStageNumber:I

  135.     add-int/lit8 v0, v0, 0x1

  136.     invoke-direct {p0, v0}, Lcom/FrameWork/Screen_Main;->changeToSelectStage(I)V

  137.     const/16 v0, 0x8

  138.     sget v1, Lcom/FrameWork/Screen_Main;->activate:I

  139.     invoke-static {v0, v1}, Lcom/FrameWork/GameScreen;->setSaveGameInt(II)V

  140.     invoke-static {v6}, Lcom/FrameWork/GameScreen;->saveSave(I)V

  141.     goto/16 :goto_0

  142.     :pswitch_6
  143.     sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

  144.     const-string v1, "ACTIVATE_ERROR"

  145.     invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

  146.     sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

  147.     new-instance v1, Ljava/lang/StringBuilder;

  148.     const-string v2, "erroCode==="

  149.     invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

  150.     sget v2, Lcom/FrameWork/Screen_Main;->erroCode:I

  151.     invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

  152.     move-result-object v1

  153.     invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

  154.     move-result-object v1

  155.     invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

  156.     sget v0, Lcom/FrameWork/Screen_Main;->erroCode:I

  157.     packed-switch v0, :pswitch_data_2

  158.     :goto_2
  159.     invoke-static {v5}, Lcom/FrameWork/GameScreen;->isInputDown(I)Z

  160.     move-result v0

  161.     if-eqz v0, :cond_0

  162.     sget v0, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_X:I

  163.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_WIDTH:I

  164.     add-int/2addr v0, v1

  165.     sub-int/2addr v0, v3

  166.     sget v1, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_OFFSET_Y:I

  167.     sget v2, Lcom/FrameWork/Screen_Main;->LOGIC_SCREEN_HEIGHT:I

  168.     add-int/2addr v1, v2

  169.     sub-int/2addr v1, v3

  170.     invoke-static {v0, v1, v3, v3}, Lcom/FrameWork/GameScreen;->touchLogic(IIII)Z

  171.     move-result v0

  172.     if-eqz v0, :cond_0

  173.     invoke-static {v7}, Lcom/FrameWork/GameScreen;->changeSubScreen(I)V

  174.     sput v4, Lcom/FrameWork/Screen_Main;->activate:I

  175.     const/4 v0, -0x1

  176.     invoke-static {v4, v0}, Lcom/FrameWork/GameScreen;->setSaveGameInt(II)V

  177.     const/16 v0, 0x8

  178.     sget v1, Lcom/FrameWork/Screen_Main;->activate:I

  179.     invoke-static {v0, v1}, Lcom/FrameWork/GameScreen;->setSaveGameInt(II)V

  180.     invoke-static {v6}, Lcom/FrameWork/GameScreen;->saveSave(I)V

  181.     goto/16 :goto_0

  182.     :pswitch_7
  183.     iget-object v0, p0, Lcom/FrameWork/Screen_Main;->activateBox:LhlLib/HLTextBox;

  184.     const-string v1, "\u53d1\u9001\u77ed\u4fe1\u5931\u8d25\u540e\u672a\u4f7f\u7528\u8054\u7f51\u8ba1\u8d39\u3002"

  185.     invoke-virtual {v0, v1}, LhlLib/HLTextBox;->setText(Ljava/lang/String;)V

  186.     goto :goto_2

  187.     :pswitch_8
  188.     iget-object v0, p0, Lcom/FrameWork/Screen_Main;->activateBox:LhlLib/HLTextBox;

  189.     const-string v1, "\u8054\u7f51\u5931\u8d25\uff0c\u8bf7\u67e5\u770b\u7f51\u7edc\u8bbe\u7f6e\u3002"

  190.     invoke-virtual {v0, v1}, LhlLib/HLTextBox;->setText(Ljava/lang/String;)V

  191.     goto :goto_2

  192.     :pswitch_9
  193.     iget-object v0, p0, Lcom/FrameWork/Screen_Main;->activateBox:LhlLib/HLTextBox;

  194.     const-string v1, "Android\u4f7f\u7528CMWAP\u9519\u8bef\u3002"

  195.     invoke-virtual {v0, v1}, LhlLib/HLTextBox;->setText(Ljava/lang/String;)V

  196.     goto :goto_2

  197.     nop

  198.     :pswitch_data_0
  199.     .packed-switch 0x0
  200.         :pswitch_0
  201.         :pswitch_3
  202.         :pswitch_5
  203.         :pswitch_4
  204.         :pswitch_6
  205.     .end packed-switch

  206.     :pswitch_data_1
  207.     .packed-switch 0x0
  208.         :pswitch_1
  209.         :pswitch_2
  210.     .end packed-switch

  211.     :pswitch_data_2
  212.     .packed-switch 0x6
  213.         :pswitch_7
  214.         :pswitch_8
  215.         :pswitch_9
  216.     .end packed-switch
  217. .end method
复制代码





然后pswitch_data_0,判断;购买成功失败。返回结果如果是成功。
成功会来到 pswitch_5  .

因为它的失败混淆了。没有;失败字样。
所以。我们在判断的前面
加上一个代码。

强制跳向成功。
成功的源头是;pswitch_5

所以在上面的代码;修改;

    goto/16 :goto_1

    packed-switch v0, :pswitch_data_0


goto/16 :goto_1
跳向了;pswitch_5  (成功)
所以。购买→确定→直接成功。

因为我是在手机端修改的。所以这讲解的不是很好。

总结一下吧。

分支判断的游戏(验证系统。)
修改方法;
在它判断的地方。前面加上goto进行强制跳转。跳向成功。

另外要注意;
goto的使用。
假如成功的源头是;switch_99298
因为它后面是5位数。goto/4不够用。所以用goto/16
也就是说改的时候。如果goto对应分支位数不足。那么就会出错。


分支跳转(pswitch)我研究了下。它不能和条件判断跳转(if-eqz)一样。删掉失败跳转。跳向成功。
分支只能强制goto跳转。
分支如果删掉的话。当代码来到这里的时候会卡死。无响应。




这个冒险岛改掉了。先上截图。然后发附件。

游戏个人感觉还不错。这次就把破解版的附件发上来吧。

游戏截图;











说明;点击内购→直接如图中的;激活成功。点击返回。即可。
如果卡住。多点几次返回。SEND.SMS权限已去掉。

附件不是主要。我讲的主要是;分支判断如何去修改。破解。
如果各位有什么问题可以到本贴提问。

刚刚的代码太长。、乱码了。。
不过不影响分析。



下载说明;
这有2个版的冒险岛。1版和2版。都放在压缩包里了。解压即可。

下载地址:


链接: http://pan.baidu.com/s/1hquy8kO

密码: ggkl










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

精彩评论4

默小坑    发表于 2014-11-22 19:38:31 | 显示全部楼层
支持

举报 使用道具

回复
myoldid    发表于 2014-12-15 16:49:54 | 显示全部楼层
意思就是不做比较直接跳向pswitch_5么?

举报 使用道具

回复 支持 反对
737672679    发表于 2014-12-16 14:17:14 | 显示全部楼层
myoldid 发表于 2014-12-15 16:49
意思就是不做比较直接跳向pswitch_5么?

方法。你懂不?

一个方法。如果不展示出来。你懂吗?

人们认为的。,不可能的就不会去尝试。

这个词就叫做:实践

举报 使用道具

回复 支持 反对
lk5261    发表于 2014-12-16 16:58:36 | 显示全部楼层
这个还好破解:)

举报 使用道具

回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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