最近看了很多很好的贴子啊
SVC的TraceHook沙箱的实现&无痕Hook实现思路https://bbs.pediy.com/thread-273160.htm
Android通用svc跟踪以及hook方案——Frida-Seccomp
https://bbs.pediy.com/thread-271815.htm
又菜又想搞svc,就只能做最简单无脑的了
简单的来说呢就是libc.so里面的一些系统函数比如read(),write()最简单的读写函数,这些函数实际上底层都是由syscall()交给linux内核去实现的


他的第一个参数是系统调用号,后面的参数是根据调用的函数来写的
现在用android studio开发的话使用系统调用和使用正常的函数一样也不需要去
记这些系统调用号都有一个常量表可以很方便的去实现功能


在调用syscall时通过会从用户态切换到内核态

正常使用hook框架很难去hook到内核态下的代码 常规手段可以通过找到svc指令地址 在他调用svc之前去inlinehook他效率以及一些别的问题 导致局限性非常大
1.去谷歌的官方文档查看自己机型的内核源码的目录
6c6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2Q4x3X3g2S2L8X3c8J5L8$3W2V1i4K6u0W2j5$3!0E0i4K6u0r3M7$3g2@1N6i4m8Q4x3V1k6T1N6h3W2D9k6r3W2F1k6#2)9J5k6r3E0W2M7X3&6W2L8s2x3`.
我的是Pixel 3a XL (bonito) 也就是 bonito-kernel
这里在谷歌官方下载的话太慢了我选择去中科大下载
命令 :

检出了那么一大堆 随意挑选一个中意的去检出即可

下载完毕

接下来就是编译一下内核看看有没有问题了
因为编译内核有一大堆命令就搞个sh脚本来
写好sh脚本后 改一下给个777权限 运行就好了
接下来就是修改内核源码了

可以看到这些函数实际上真正底层是在内核实现的

这里只搞一个做演示哈 这里是oepn内核的源码 我们可以在这里动一些手脚
修改完毕后直接使用之前写的sh脚本在msm编译内核即可
大佬的Linux kernel 笔记
f70K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6F1j5h3&6^5K9h3q4G2i4K6u0W2L8h3g2Q4x3V1k6U0j5i4c8W2k6$3!0J5P5g2)9J5c8W2)9J5y4h3f1$3i4K6t1#2z5r3q4Q4x3U0f1^5x3q4)9J5y4h3f1$3i4K6t1#2z5h3y4Q4x3U0g2S2k6W2)9J5c8X3I4A6L8Y4g2^5i4K6u0V1K9$3g2J5L8X3g2D9i4K6u0V1i4K6t1#2k6e0N6Q4x3U0g2S2j5#2)9J5y4e0V1@1i4K6t1#2k6e0S2Q4x3U0g2S2k6g2)9J5y4h3t1H3i4K6u0r3
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
/
/
获取到我们需要的版本号
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
/
/
获取到我们需要的版本号
git checkout
-
b android
-
msm
-
bonito
-
4.9
-
android10 origin
/
android
-
msm
-
bonito
-
4.9
-
android10
git checkout
-
b android
-
msm
-
bonito
-
4.9
-
android10 origin
/
android
-
msm
-
bonito
-
4.9
-
android10
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
/
;
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
/
;
chmod
777
tutu.sh
.
/
tutu.sh
/
/
然后直接在aops目录 编译完成后刷机即可
make
-
j16
chmod
777
tutu.sh
.
/
tutu.sh
/
/
然后直接在aops目录 编译完成后刷机即可
make
-
j16
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;
}
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);
[培训]科锐逆向工程师培训第53期2025年7月8日开班!