段落引用 本文思路和主要代码来源,感谢大佬们提供的NB思路,关于seccomp等不再赘述,直接传送至各位前辈大佬的文章即可: [原创]基于seccomp+sigaction的Android通用svc hook方案 [原创]SVC的TraceHook沙箱的实现&无痕Hook实现思路 [原创]分享一个Android通用svc跟踪以及hook方案——Frida-Seccomp
段落引用 本文思路和主要代码来源,感谢大佬们提供的NB思路,关于seccomp等不再赘述,直接传送至各位前辈大佬的文章即可:
[原创]基于seccomp+sigaction的Android通用svc hook方案 [原创]SVC的TraceHook沙箱的实现&无痕Hook实现思路 [原创]分享一个Android通用svc跟踪以及hook方案——Frida-Seccomp
一切都因WMCTF2023一道Android 游戏题BabyAnti-2而起,预期解为拦截mincore调用(int mincore(void *start, size_t length, unsigned char *vec);监测指定大小的页面是否处于物理内存中。一般用于内存扫描的检查,一旦扫描行为发生,有些并不在物理内存的页面被调入。vec 是一个字节数组,用于存储结果。每个字节对应 addr 和 length 指定的内存区域中的一个页面。如果相应的页面驻留在内存中,那么相应的字节的最低位会被设置为 1,否则会被设置为 0。),当时非预期了题目,即直接CheatEngine附加游戏题,扫描内存时游戏虽然会监测到并弹窗,但是游戏正常运行,直接能修改分数并且拿到flag。后来想着除了通过内存搜索mincore的svc调用指令外还有什么其他别的办法快速的拦截svc调用,就看到了看雪上面的三篇文章
经过实验发现,
Ptrace-seccomp方案原理简单,因为要fork子进程来监控父进程,实操较为复杂且容易出现各种问题。本人手太拙,在用这种方案对小demo是成功的,但是对游戏父进程进行ptrace时会出现问题。
Frida-seccomp方案,上手十分迅速,但是由于异常处理是Frida来做的,而且利用Frida的Process.setExceptionHandler来自己设置异常回调。这就会导致在进行大量系统调用的APP上使用该方案时产生极大的时间损耗,游戏运行极慢,但是可以成功拦截mincore调用并修改参数。
Sigaction-seccomp方案中作者给出了主要思路,即通过sigaction注册信号处理handler,这个注册过程和信号处理是发生在APP内部而不是Frida,所以会快很多。一开始采用自己编译so注入到APP,成功拦截mincore调用并修改参数。为了更方便一点,参考Frida-seccomp方案的思路,直接使用Frida的CModule,无需自己编译so并注入,经实验可以成功拦截mincore调用并修改参数。
关于后两种方案速度的差异可以看,左侧为Frida-seccomp,右侧Sigaction-seccomphttps://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2F09e51fd2-5c64-40c6-acb4-23206baa069f%2F202401242129.gif?table=block&id=9bd9e09b-835d-4054-9d85-4be562ebb3a3&t=9bd9e09b-835d-4054-9d85-4be562ebb3a3
https://github.com/LLeavesG/Frida-Sigaction-Seccomp
直接将js注入即可实现对openat的监控,需要在logcat过滤native查看结果
在实战时根据自己需求修改CModule中的define,其中target_nr 是目标系统调用号。
define
target_nr
在拦截到系统调用后会再次进行系统调用,防止再次被拦截,就需要一个寄存器来放一个标识符SECMAGIC ,避免循环拦截系统调用从而crash。SECMAGIC_POS 即为对应系统调用所不需要的第一个寄存器,比如openat需要三个参数,那么SECMAGIC_POS 填3即可,因为寄存器从x0开始,args[3]即为第四个寄存器。
SECMAGIC
crash
SECMAGIC_POS
openat
x0
args[3]
然后就是在sig_handler 中写劫持逻辑。如果想拦截更多的系统调用,就需要重写seccomp filter 。
sig_handler
seccomp filter
除此之外调用栈等信息,可以参考[原创]分享一个Android通用svc跟踪以及hook方案——Frida-Seccomp 阿碧大佬的思路自己添加。
同理也可以实现对mincore的拦截
再次感谢上述大佬提供的代码和思路,本文意在抛砖引玉,如有侵权联系本人删除。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课