Releases: SeeFlowerX/stackplz
stackplz_v3.0.3
- 硬件断点改为
-p/--pid
指定进程pid,除非你知道--brk-pid
的用途,否则不要使用该选项;frida联动脚本中brk_pid
也改为默认-1
- 默认屏蔽掉aarch32的系统调用,后续针对aarch32将单独启用一个分支
- 修复
--dumphex
不生效的情况 - 修复
%read
错误的情况 - 添加
--full-tname
选项,启用该选项时,stackplz解除默认屏蔽的部分线程,具体请查看DefaultThreadBlacklist
- 启动时会对处于运行状态中的进程保存一份maps文件
- 添加了
addr
过滤规则,本质上仍然是bx/bufhex过滤,示例请参考这两个配置文件- config_syscall_connect_filter.json 过滤特定ip的connect调用
- config_syscall_connect_filter2.json 过滤仅保留ipv4和ipv6的connect调用
- 命令提示:
-c tests/config_syscall_connect_filter2.json -s connect
stackplz_v3.0.2
- 修复了命令行中uprobe到syscall的类型解析
- 命令行支持了更多内置类型
- uprobe支持了退出时读取,示例命令如下,即在最后加上RET指令偏移即可
./stackplz -n com.termux -w gettimeofday[timeval,timezone]0x4B320
./stackplz -n com.termux -w 0x9D150[int,buf:x2,int]0x9D164 --dumphex --color
当前版本未经过详细测试,如果有预期外的表现,请issue反馈
新春快乐~~~
stackplz_v3.0.1
- 去除了
--prepare
选项,自动处理动态库释放 - 添加了
bx/bufhex
选项,输入内容为十六进制形式,可用于buf类型参数的过滤- 例如下面这样写,表示hook memmove,当第二个参数内容以
73ea68
对应的二进制数据开头,记录之,并打印堆栈 ./stackplz -n com.test.example -w memmove[ptr,buf.f0:x2,int] -f bx:73ea68 --stack
- 例如下面这样写,表示hook memmove,当第二个参数内容以
- hexdump与CyberChef保持一致,即
--dumphex
选项 - 添加了%send %recv %read %write等四个分组
stackplz_v3.0.0
使用此版本必须执行一次./stackplz --prepare
新版本带来了许多新东西:
- 加入了
-c/--config
选项,即配置文件,请参考tests
目录下的内容 - 硬件断点功能提供了rpc模式,与frida联动请参考frida_hw_brk.js,这样可以免去手动操作的繁琐;注:内核开启CONFIG_HAVE_HW_BREAKPOINT即可使用硬件断点,不一定需要5.10+内核
--json
选项加入了更多数据的解析,目前还不完整- 加入了
--showpc
选项,打印堆栈的时候会显示完整pc值 - 对split apk的库加入了uprobe hook支持,不过堆栈显示还是会显示为apk的偏移,也许可以改进
- 支持了std字符串读取
- 支持了数字数组,数字指针的读取
- 修复了某些云手机上数据读取异常的情况
- 支持按c回车自动恢复进程运行,搭配
--kill SIGSTOP
使用 - 加入了
--auto
选项,搭配--kill SIGSTOP
使用,可以减少堆栈回溯不到的情况 - 加入了
--dump/--parse
选项,可以大幅度减少数据丢失,目前还没完成 - 过滤支持了
eq
,即相等比较,还有lt/gt
,但是不知道为什么有bug,后面排查 - 修正了一些flags解析问题
- 重新支持了arm架构的syscall追踪,字符串参数问题不大,但有一些结构体解析存在问题,请等待更新
--reg
选择支持多寄存器偏移获取,用逗号分隔即可- 还有其他各种变更,不过用法上基本变化不大
注:目前若要尝鲜追踪arm syscall,请使用--arch aarch32
指定架构,并搭配测试配置文件使用
距上一个稳定版本v2.1.4过去了三个月了,后面陆续做了一些小修小补
eBPF程序在内核的虚拟机中运行时有各种严格的检查,还有循环限制(虽然有bpf_loop,但是5.10用不上),当时感觉就这样了
直到有一天反应过来可以用vm的思路,即维护一个操作列表,到时候在虚拟机中执行这个操作列表就行了(在有限的循环中vm)
这样的好处是可以自由定制各种操作了,一些循环操作,复杂数据读取一并得到了解决,最终实现了配置化获取数据
本版本测试不完整,有问题请issue反馈
stackplz v3.0.0 与你相见
stackplz_v2.1.4
- 修复端口解析错误的情况
- 修复某些情况下buf数据长度为0引起的崩溃
- 对一些信息支持输出json
- 其他优化
stackplz_v2.1.3
该版本未经过详细测试,出现异常请反馈至issue
本次更新有如下改动:
- 加入了
--dumpret
选项,可以输出含有给定符号关键词的RET指令偏移,符号本身偏移信息,拿到这些偏移信息后,可以对函数返回值进行快速追踪 - 修复
--reg
选项未按预期工作的情况,该选项可用于计算给定寄存器的偏移情况 - 修复hexdump含有
%
时出现格式化异常的情况 - 修正了指针类型参数的读取,现在可以通过指示
*int
对特定位置进行读取 - 添加了
%dup
和%epoll
两组快速追踪 - 支持IOVEC类型数据详细解析,即可以详细输出
readv/writev/preadv/pwritev/process_vm_readv/process_vm_writev
的内容了
功能演示:
./stackplz -n com.xingin.xhs -l libart.so -w GetStringUTFChars --dumpret
./stackplz -n com.xingin.xhs -l libart.so -w 0x4a4910[str] --getoff
./stackplz -n com.xingin.xhs -l libart.so -w 0x4B8A74[str:x22,str:x8] --tname com.xingin.xhs --reg x28
./stackplz -n icu.nullptr.nativetest -l libc.so -w 0x5B950[*int:x20,*int:x20+4]
./stackplz -n icu.nullptr.nativetest -s readv,writev,preadv,pwritev -o tmp.log
process_vm_readv
详细使用请关注stackplz的使用技巧收集,文章会持续更新
stackplz_v2.1.2
- 添加了
--showtime
选项 - 详细解析pipe2参数,输出执行后的fd信息
- 代码简化
stackplz_v2.1.1
- 添加了
--showuid
选项,使用此选项时,第一列为uid
,后面依次为pid
、tid
和线程名
- 修复无法通过pid追踪shell进程的情况
案例:检查谁在访问sdcard
情景:sdcard下总是会被创建一些.
开头的文件夹,总所周知这些内容通常用于追踪用户,找出它们!
准备工作:
adb push stackplz /data/local/tmp
adb shell chmod +x /data/local/tmp/stackplz
adb shell
su
cd /data/local/tmp
观察sdcard下.
开头相关的路径访问情况,下面三个路径都是等效的,最后一个用的不多,所以我们观察前面两个
- /sdcard
- /storage/emulated/0
- /storage/self/primary
一般这样就够了:
./stackplz -n app --showuid -s openat:f0.f1 -f w:/sdcard/. -f w:/storage/emulated/0/. -o tmp.log
根据测试,系统自带的com.google.android.providers.media.module
也会频繁访问sdcard下的信息
为了减少不必要的日志,可以使用--no-uid
排除它
首先用ps -ef -o name,pid,uid | grep providers
命令获取到uid信息:
oriole:/ $ ps -ef -o name,pid,uid | grep providers
com.google.android.providers.media.module 2607 10210
以及记录对应的堆栈,使用--stack
选项即可
./stackplz -n app --no-uid 10210 --showuid -s openat:f0.f1 -f w:/sdcard/. -f w:/storage/emulated/0/. -o tmp.log --stack
完整详细的使用规则请阅读基于eBPF的安卓逆向辅助工具——stackplz
stackplz_v2.1.0
stackplz迎来大版本更新,整体功能已趋于稳定,此次更新日志:
- 添加了
--mstack
选项,如果堆栈全是unknown,则推荐使用该选项进行追踪 - 修复多进程下字符串比较失败的情况
- 增加了库默认搜索路径,并改进了搜索方案
使用讲解文章:
stackplz_v2.0.8
- 硬件断点解析进程信息与事件地址,并自动计数
- 实现字符串过滤,一个参数下支持多个过滤规则
黑白名单:
./stackplz -n com.starbucks.cn -s openat:f0.f1.f2 -f w:/system -f w:/dev -f b:/system/lib64 -o tmp.log
替换规则(下面的测试命令开两个shell执行):
./stackplz -n com.starbucks.cn,iso -s execve,openat:f0 -f r:/system/bin/su:::/system/bin/zz -o tmp_s.log
./stackplz -n com.starbucks.cn,iso -w popen[str.f0.f1] -f r:mount:::mounx -f "r:which su:::which zz" -o tmp_w.log
ebpf中bpf_probe_write_user
需要预先指定写入数据大小,本项目暂且覆盖256字节,可能有潜在的问题
替换功能仅做演示,用于展示ebpf操作数据的能力,如果要改为较为灵活的方式,会涉及常量编辑等功能,暂不实现