这篇文章上次修改于 374 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

背景

在dump后模拟执行系列文章中,使用了lldb作为dump工具

自某个时间节点之后就收到反馈说image list命令只有很少的内容,没有其他动态库的信息,libc的都没有

后来还发现执行表达式还会遭遇下面的错误:

error: expression failed to parse:
error: Can't evaluate the expression without a running target due to: Interpreter doesn't handle one of the expression's opcodes

结果

在各种尝试后,仍然没有搞清楚具体原因。。

分析

经过各种测试后,发现找不到动态库的情况发生在adb shell + su + 切换termux环境 + lldb的情况下

但是在termux自己的shell,或者使用ttyd等远程方式下,即termux shell + su + 切换termux环境 + lldb,是可以正常获取到动态库信息的

一些尝试:

1. 修正adb环境变量

通过比较两个环境下的异同,尝试在adb方案下将所有环境变量设置和termux的一致,测试还是找不到动态库信息

2. 修正adb初始用户身份

根据参考文章,执行了如下的命令:

adb shell
su 10239 10239 3003 9997 20239 50239 /data/local/tmp/setcon u:r:untrusted_app_27:s0:c239,c256,c512,c768 sh

然后在该基础上使用termux的环境,包括切换到su等操作,测试依然找不到动态库信息

当然也试过run-as命令,实际测试结果也是不行

3. 切换初始shell

echo $0

通过上面的命令可以知道当前实际使用的shell是什么,adb用的是系统的sh

于是尝试在进入adb shell后先切换到termux的bash(包括su + bash、setcon + bash),再做后续操作,但是依然不行

4. 修改SELinux

将SELinux改为宽容模式,再尝试上述操作,也不行


还有各种组合操作,但是无论如何都没办法让lldb找到动态库信息

这个情况发生在lldb 16版本,因为dump内存与模拟执行(三)——实践dump上下文中使用的是更老一点的版本,当时adb方式肯定能找到动态库信息

网上也查到termux在adb的方式下使用确实有诸多问题,所以对于这种情况建议有:

  1. 使用server + remote方式,当然两个可以都在手机上
  2. 采用ttyd/ssh等远程方法,如果局域网不通可以配合adb forward使用
  3. 使用老版本lldb,或者最最最新版,不过不确定有没有这个问题

其他猜测:还能想到的两种环境下不一致的地方,就是两种方式下最初的用户不是同一个,即adb不管如何操作,最开始的用户都是adb shell

至于真正机理,无心分析了...