-
-
[原创记录一次编译内核,修改内核源码监控系统调用
-
2022-6-10 11:19
9232
-
记录一次编译内核修改内核源码监控系统调用
最近看了很多很好的贴子啊
SVC的TraceHook沙箱的实现&无痕Hook实现思路https://bbs.pediy.com/thread-273160.htm
Android通用svc跟踪以及hook方案——Frida-Seccomp
https://bbs.pediy.com/thread-271815.htm
又菜又想搞svc,就只能做最简单无脑的了
一, 给小白介绍一下什么是系统调用(syscall)
简单的来说呢就是libc.so里面的一些系统函数比如read(),write()最简单的读写函数,这些函数实际上底层都是由syscall()交给linux内核去实现的
他的第一个参数是系统调用号,后面的参数是根据调用的函数来写的
现在用android studio开发的话使用系统调用和使用正常的函数一样也不需要去
记这些系统调用号都有一个常量表可以很方便的去实现功能
在调用syscall时通过会从用户态切换到内核态
正常使用hook框架很难去hook到内核态下的代码 常规手段可以通过找到svc指令地址 在他调用svc之前去inlinehook他效率以及一些别的问题 导致局限性非常大
二, 编译内核步骤
1.去谷歌的官方文档查看自己机型的内核源码的目录
https://source.android.com/setup/building-kernels
我的是Pixel 3a XL (bonito) 也就是 bonito-kernel
这里在谷歌官方下载的话太慢了我选择去中科大下载
命令 :
1 2 3 4 5 6 7 | git clone http: / / mirrors.ustc.edu.cn / aosp / kernel / msm.git
/ / 下载完成后cd 到sms 目录 在链接手机在终端输入
cat / proc / version
Linux version 4.9 . 165 - g583404d31612 - ab5723792
/ / 这一串 583404d31612 这个是我们需要的
git branch - r - - contains 583404d31612
/ / 获取到我们需要的版本号
|
检出了那么一大堆 随意挑选一个中意的去检出即可
1 | git checkout - b android - msm - bonito - 4.9 - android10 origin / android - msm - bonito - 4.9 - android10
|
下载完毕
接下来就是编译一下内核看看有没有问题了
因为编译内核有一大堆命令就搞个sh脚本来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | make clean
export ARCH = arm64
export SUBARCH = arm64
export PATH = / home / 用户名 / bin / aosp1000r2 / prebuilts / gcc / linux - x86 / aarch64 / aarch64 - linux - android - 4.9 / bin :$PATH
export PATH = / home / 用户名 / bin / aosp1000r2 / prebuilts / gcc / linux - x86 / arm / arm - linux - androideabi - 4.9 / bin :$PATH
export CROSS_COMPILE = aarch64 - linux - android -
export CROSS_COMPILE_ARM32 = arm - linux - androideabi -
make O = out marlin_defconfig
make - j18 O = out ARCH = arm64
cp - f out / arch / arm64 / boot / Image.lz4 - dtb .. / device / google / marlin - kernel / ;
|
写好sh脚本后 改一下给个777权限 运行就好了
1 2 3 4 | chmod 777 tutu.sh
. / tutu.sh
/ / 然后直接在aops目录 编译完成后刷机即可
make - j16
|
接下来就是修改内核源码了
可以看到这些函数实际上真正底层是在内核实现的
这里只搞一个做演示哈 这里是oepn内核的源码 我们可以在这里动一些手脚
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | long do_sys_open( int dfd, const char __user * filename, int flags, umode_t mode)
{
struct open_flags op;
int fd = build_open_flags(flags, mode, &op);
struct filename * tmp;
/ / add
const struct cred * cred = current_cred();
kuid_t isuid = cred - >uid;
int pid = current - >pid;
int isuid = uid.val;
/ / 过滤系统app
if (isuid > 10000 ) {
char bufname[ 256 ] = { 0 };
strncpy_from_user(bufname, filename, 255 );
/ * bufname 就是监控到的一些调用syscall的一些读文件操作当然也可以做io重定向去判断某些特定的值写一个系统app去监听这里过滤替换的一些操作这里为了简单学习实现先这样了 * /
printk( "do_sys_open : %s uid:%d pid:%d\n" ,
bufname, isuid, pid);
}
/ / add end
if (fd)
return fd;
tmp = getname(filename);
if (IS_ERR(tmp))
return PTR_ERR(tmp);
/ / 得到一个文件描述符
fd = get_unused_fd_flags(flags);
if (fd > = 0 ) {
/ / 得到一个struct file 结构
struct file * f = do_filp_open(dfd, tmp, &op);
if (IS_ERR(f)) {
put_unused_fd(fd);
fd = PTR_ERR(f);
} else {
fsnotify_open(f);
/ / 把文件描述符和struct file 结构关联起来
fd_install(fd, f);
}
}
putname(tmp);
return fd;
}
|
修改完毕后直接使用之前写的sh脚本在msm编译内核即可
大佬的Linux kernel 笔记
https://nanxiao.me/category/%e6%8a%80%e6%9c%af/linux-kernel-%e7%ac%94%e8%ae%b0/
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。