Skip to content

Releases: SeeFlowerX/stackplz

stackplz_v3.0.3

04 Mar 14:23
Compare
Choose a tag to compare
  • 硬件断点改为-p/--pid指定进程pid,除非你知道--brk-pid的用途,否则不要使用该选项;frida联动脚本中brk_pid也改为默认-1
  • 默认屏蔽掉aarch32的系统调用,后续针对aarch32将单独启用一个分支
  • 修复--dumphex不生效的情况
  • 修复%read错误的情况
  • 添加--full-tname选项,启用该选项时,stackplz解除默认屏蔽的部分线程,具体请查看DefaultThreadBlacklist
  • 启动时会对处于运行状态中的进程保存一份maps文件
  • 添加了addr过滤规则,本质上仍然是bx/bufhex过滤,示例请参考这两个配置文件

stackplz_v3.0.2

07 Feb 03:40
Compare
Choose a tag to compare
  • 修复了命令行中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

04 Feb 05:33
Compare
Choose a tag to compare
  • 去除了--prepare选项,自动处理动态库释放
  • 添加了bx/bufhex选项,输入内容为十六进制形式,可用于buf类型参数的过滤
    • 例如下面这样写,表示hook memmove,当第二个参数内容以73ea68对应的二进制数据开头,记录之,并打印堆栈
    • ./stackplz -n com.test.example -w memmove[ptr,buf.f0:x2,int] -f bx:73ea68 --stack
  • hexdump与CyberChef保持一致,即--dumphex选项
  • 添加了%send %recv %read %write等四个分组

stackplz_v3.0.0

29 Jan 15:51
Compare
Choose a tag to compare

使用此版本必须执行一次./stackplz --prepare


新版本带来了许多新东西:

  1. 加入了-c/--config选项,即配置文件,请参考tests目录下的内容
  2. 硬件断点功能提供了rpc模式,与frida联动请参考frida_hw_brk.js,这样可以免去手动操作的繁琐;注:内核开启CONFIG_HAVE_HW_BREAKPOINT即可使用硬件断点,不一定需要5.10+内核
  3. --json选项加入了更多数据的解析,目前还不完整
  4. 加入了--showpc选项,打印堆栈的时候会显示完整pc值
  5. 对split apk的库加入了uprobe hook支持,不过堆栈显示还是会显示为apk的偏移,也许可以改进
  6. 支持了std字符串读取
  7. 支持了数字数组,数字指针的读取
  8. 修复了某些云手机上数据读取异常的情况
  9. 支持按c回车自动恢复进程运行,搭配--kill SIGSTOP使用
  10. 加入了--auto选项,搭配--kill SIGSTOP使用,可以减少堆栈回溯不到的情况
  11. 加入了--dump/--parse选项,可以大幅度减少数据丢失,目前还没完成
  12. 过滤支持了eq,即相等比较,还有lt/gt,但是不知道为什么有bug,后面排查
  13. 修正了一些flags解析问题
  14. 重新支持了arm架构的syscall追踪,字符串参数问题不大,但有一些结构体解析存在问题,请等待更新
  15. --reg 选择支持多寄存器偏移获取,用逗号分隔即可
  16. 还有其他各种变更,不过用法上基本变化不大

注:目前若要尝鲜追踪arm syscall,请使用--arch aarch32指定架构,并搭配测试配置文件使用

image


距上一个稳定版本v2.1.4过去了三个月了,后面陆续做了一些小修小补

eBPF程序在内核的虚拟机中运行时有各种严格的检查,还有循环限制(虽然有bpf_loop,但是5.10用不上),当时感觉就这样了

直到有一天反应过来可以用vm的思路,即维护一个操作列表,到时候在虚拟机中执行这个操作列表就行了(在有限的循环中vm)

这样的好处是可以自由定制各种操作了,一些循环操作,复杂数据读取一并得到了解决,最终实现了配置化获取数据

本版本测试不完整,有问题请issue反馈

stackplz v3.0.0 与你相见

stackplz_v2.1.4

23 Oct 12:38
Compare
Choose a tag to compare
  • 修复端口解析错误的情况
  • 修复某些情况下buf数据长度为0引起的崩溃
  • 对一些信息支持输出json
  • 其他优化

stackplz_v2.1.3

16 Sep 11:38
Compare
Choose a tag to compare

该版本未经过详细测试,出现异常请反馈至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

image

./stackplz -n com.xingin.xhs -l libart.so -w 0x4a4910[str] --getoff

image

./stackplz -n com.xingin.xhs -l libart.so -w 0x4B8A74[str:x22,str:x8] --tname com.xingin.xhs --reg x28

image

./stackplz -n icu.nullptr.nativetest -l libc.so -w 0x5B950[*int:x20,*int:x20+4]

image

./stackplz -n icu.nullptr.nativetest -s readv,writev,preadv,pwritev -o tmp.log

image

process_vm_readv

image

详细使用请关注stackplz的使用技巧收集,文章会持续更新

QRCODE

stackplz_v2.1.2

14 Sep 08:26
Compare
Choose a tag to compare
  • 添加了--showtime选项
  • 详细解析pipe2参数,输出执行后的fd信息
  • 代码简化

stackplz_v2.1.1

11 Sep 06:35
Compare
Choose a tag to compare
  • 添加了--showuid选项,使用此选项时,第一列为uid,后面依次为pidtid线程名
  • 修复无法通过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

image

根据测试,系统自带的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

image

完整详细的使用规则请阅读基于eBPF的安卓逆向辅助工具——stackplz

stackplz_v2.1.0

08 Sep 13:32
Compare
Choose a tag to compare

stackplz迎来大版本更新,整体功能已趋于稳定,此次更新日志:

  • 添加了--mstack选项,如果堆栈全是unknown,则推荐使用该选项进行追踪
  • 修复多进程下字符串比较失败的情况
  • 增加了库默认搜索路径,并改进了搜索方案

使用讲解文章:

QRCODE

stackplz_v2.0.8

04 Sep 09:35
Compare
Choose a tag to compare
  1. 硬件断点解析进程信息与事件地址,并自动计数
  2. 实现字符串过滤,一个参数下支持多个过滤规则

黑白名单:

./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操作数据的能力,如果要改为较为灵活的方式,会涉及常量编辑等功能,暂不实现

QRCODE