-
-
[原创]内核改机[一]:目标判断
-
发表于:
2022-6-18 11:00
10124
-
改机作为一种攻击手段,存在着一劳永逸的优势,只要改的足够深,就极难应对。
接下来打算花时间慢慢把过去自己琢磨着玩的一些东西讲出来,都是一些没人讲过的东西,比较主流的东西就不出来丢人现眼了
这一篇先讲讲在内核里怎样进行目标判断
非侵入式
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 | bool isTargetByTask(struct task_struct * p)
{
int time = 0 ;
while (strcmp(p - >comm, "init" ) ! = 0 )
{
if (strstr(p - >comm, "xxx" ) ! = 0 )
{
return true;
}
if (time > 10 )
{
return false;
}
time + + ;
if (p - >pid ! = p - >tgid)
{
p = p - >group_leader;
}
else
{
p = p - >parent;
}
}
return false;
}
bool isTargetByPid( int pid)
{
struct task_struct * p;
p = pid_task(find_get_pid(pid),PIDTYPE_PID);
return isTargetByTask(p);
}
bool isTarget(void)
{
return isTargetByTask(pid_task(find_vpid(task_tgid_vnr(current)),PIDTYPE_PID));
}
|
厂商可以故意制造孤儿进程,孤儿进程的ppid变成init,所以不能用ppid判断目标进程,而应使用tgid
缺点
内核内进程名最多15个字节,性能消耗相对高。
内核给进程生成动态资源时(比如/proc/xxx/maps)还没有给进程改名。
侵入式
- include/linux/sched.h中找到struct task_strcut,在末尾添加一个标志位,用于标识是否是目标进程
- kernel/fork.c中,复制一份自己的_do_fork(),在其执行完copy_process()后,把子进程的目标标志位置1
- 复制一份与fork一样的syscall,新增的syscall用于调用my_do_fork
- 在bionic依法复制clone和fork
- 在framework层里的zygote复制,在forkAndSpecialize里判断如果niceName是目标APP包名则使用定制的fork
缺点
理论上有可能会影响系统稳定性,这个取决于内核代码规范性,不规范就容易GG(我用了很久都没事)
非内核
c、c++代码和framework层就直接用syscall进内核判断就完事了。
service层的话mContext.getPackageManager().getNameForUid(Binder.getCallingUid())即可获取包名,即可根据包名判断是否为目标进程
未完成目录:
文件权限、读取、隐藏、存在、重定向
文件属性
基于真实内存伪造maps
修改网卡mac等相关信息
修改已启动时间
使用hash管理读入的需要使用的信息
rsa验证信息
暂时能想到的就这么多,其他的别人讲的少的东西都挺零零散散的,或者解决起来很简单一两句话搞定,到时候一篇文章搞定
有兴趣的欢迎探讨
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-6-19 12:38
被又一个小菜鸟编辑
,原因: