一款日本 游戏,反调试该如何入手。

日本游戏世嘉益智消除遊戲魔法氣泡Quest,
第一次接触日本游戏,感觉日本app好变态,代码混淆的让人迷糊,处理混淆一般用什么方法。感觉这种值对关键位置进行混淆和加密的方法,既提高效率还提高了安全性。
如果使用lldb直接启动游戏,会出卡死或者秒退。
lldb调试会出现以下几种情况

1、lldb 加载app 特定地址下中断(IDA部分中红色) app出现错误提示,出现错误提示后app就卡住了;在其他地方下中断 一切正常。
2、跟着下中断直接跳入Execution was interrupted, reason: EXC_BAD_ACCESS。出现这种情况原因都类似下面这种情况,br x8中,x8地址出现错误,怀疑是其他进程修改了某些全局变量导致跳转x8出现异常
0x100b0c34c <+13896>: add w8, w8, #0x1 ; =0x1
0x100b0c350 <+13900>: subs w8, w8, #0x3 ; =0x3
0x100b0c354 <+13904>: b.lt 0x100b0c028 ; <+13092>
0x100b0c358 <+13908>: b 0x100b0bf3c ; <+12856>
0x100b0c35c <+13912>: mov x8, #0x1
0x100b0c360 <+13916>: adr x9, #0xc ; <+13928>
0x100b0c364 <+13920>: mul x8, x9, x8
0x100b0c368 <+13924>: br x8

现在考虑是不是有其他线程对主线程进行监控用于实时监测第三方调试。

碰到类似的情况,ldrsw x8,[x9],br x8参数一样(x9指向的前4字节是一样的),会产生不同的结果,产生负数,x8 地址就完全不对了。有什么机制,会导致debug 同样一条指令产生不同的结果,特别是断点之后。

是的在之前的命令可以看到全是使用32位寄存器w8做处理,最后用加法或者乘除法确定最终的x8.

0x100b0c35c mov x8, #0x1
0x100b0c360 adr x9, #0xc   ; x9 = 0x100b0c36c
0x100b0c364 mul x8, x9, x8 ; x8 = 0x100b0c36c * 0x1
0x100b0c368 br x8          ; x8 = 0x100b0c36c
0x100b0c36c next_real_addr

这不就一个最简单的花指令方式吗?crash代码应该不在这吧
br x8最后跳转的就它下一条指令,也就是说0x100b0c35c到0x100b0c368的指令可以全部patch成nop

还有其他的地方也是这样使用br x8,如果异常就跳转到0x200xxxx这里地方直接死掉。每次跳转crash的地方都不同,但是都有br x8这一句。

至少不会是你发的这段代码,你把crash的地方贴出来

  • thread #1, queue = ‘com.apple.main-thread’, stop reason = EXC_BAD_ACCESS (code=1, address=0x200a602d8)
    frame #0: 0x0000000200a602d8
    error: memory read failed for 0x200a60200
  • thread #1, queue = ‘com.apple.main-thread’, stop reason = EXC_BAD_ACCESS (code=1, address=0x200a602d8)
    • frame #0: 0x0000000200a602d8
      frame #1: 0x00000001000e7f1c smapquest`___lldb_unnamed_symbol600$$smapquest + 1568

0x1000e7edc <+1504>: tbnz w8, #0x0, 0x1000e7ce4 ; <+1000>
0x1000e7ee0 <+1508>: b 0x1000e7f20 ; <+1572>
0x1000e7ee4 <+1512>: ldr w8, [sp, #0x130]
0x1000e7ee8 <+1516>: adrp x9, 7056
0x1000e7eec <+1520>: add x9, x9, #0x158 ; =0x158
0x1000e7ef0 <+1524>: ldr w8, [x9, x8, lsl #2]
0x1000e7ef4 <+1528>: ldr w9, [sp, #0x12c]
0x1000e7ef8 <+1532>: sub w8, w9, w8
0x1000e7efc <+1536>: str w8, [sp, #0x12c]
0x1000e7f00 <+1540>: b 0x1000e7e58 ; <+1372>
0x1000e7f04 <+1544>: ldr w8, [sp, #0x12c]
0x1000e7f08 <+1548>: adrp x9, 7056
0x1000e7f0c <+1552>: add x9, x9, #0x158 ; =0x158
0x1000e7f10 <+1556>: add x8, x9, x8
0x1000e7f14 <+1560>: str x8, [x21, #0x78]
0x1000e7f18 <+1564>: blr x8

重点关注下X9 也就是 0x101c77158这个变量的变化

请教大神,0x101c77158这个地址怎么来的?
还有就是如何我在游戏运行中使用
watchpoint set expression -w read
或者watchpoint set expression -w write ,也会出现上面说的2种情况。有可能不导致EXC_BAD_ACCESS,但是游戏界面提示 游戏被破坏。