decomp2dbg插件不怎么稳定,经常出问题,但是IDA的动态调试又不支持pwndbg这么多功能,缺乏稳定好用的调试器一直让我浑身难受。
继续逆向。
对json的处理部分做了逆向,它维护了一个缓冲区,从fd里读字符,然后按照json格式循环解析,解析出一段完整的json就交给ot_agent_recv_handler_one使用。这里它的反编译结果不太友好,好几个while循环都被拆成了goto语句,耽误了一些时间。


然后沿着调用链一路往下追,找到了did not int字符串的引用点,但仔细比对后发现并不完全相同:

原来是交叉引用没展开:

跳转过去:

这里它根据sub_433DB4函数的返回值判断是否打印日志,但是sub_433DB4还涉及到一条更深入的函数调用链,所以这里直接上动态调试,只看函数参数,不探究来路和去向,在bl su_433DB4和它的下一条指令下断点,观察其参数和返回值:


X0存放第一个参数,可以看到是指向json指针的指针,X2未知,X3也是指针,最终指向“did”字符串;返回值是0xFFFFFFF7,所以进一步,进入sub_433DB4查看具体是哪段逻辑返回了这个返回值:

三条支路全部返回了0XFFFFFFF7,这意味着它们会返回相同的错误码。面对这种情况,选择单步跟踪进入sub_433DB4,发现第一个if就已经跳转到ret准备退出了(在AARCH64汇编里,ret等价于B x30),返回值为0,这种情况就继续沿着sub_433BBC函数追踪,,看它哪里返回了0。