首页
社区
课程
招聘
[原创]小菜花的IO重定向简析
2022-1-4 17:11 12187

[原创]小菜花的IO重定向简析

2022-1-4 17:11
12187

0x0 引言

  • X:svc跟syscall的区别是啥

  • Y:xxxx唧唧哇哇oooo

  • X:怎么bypass 内存搜索还是ptrace

  • Y:va用的内存搜索+inline的(目前所看到的源码),隔壁珍惜大佬用的ptrace的

  • Y:大佬们要不要关注下我公众号,突然灵机一动,想写个openat,syscall,svc,和va io svcbypass处理的文章[皱眉]

    以上纯属是个玩笑。当然了,本文要表述的这部分内容比较基础,大佬级别手下留情,给小菜花留点活路,感激涕零


0x1 系统调用相关概念

 我先去cv一点概念性的东西

    用户态是怎么进入到内核态呢?这着实让人头疼。实际上常见的 kill方法 就会进入到内核态,而沟通内核态的方法就是sys_call方法。


0x2 跟踪openat源码

咱们这里以android8.0 arm64为例: http://androidxref.com/8.0.0_r4

可以看到,open和openat的实现都是__openat,那就去__openat看下

那就看64位吧

svc出现了


0x3 跟踪syscall源码

使用方式:

pid_t pid = syscall(__NR_getpid);

源码:

svc 出现了


0x4 io重定向

va:https://github.com/asLody/VirtualApp

ratel:https://github.com/virjarRatel/ratel-core

io重定向都是上述两个产品的核心功能之一,并且它俩的逻辑差不多哈,因为ratel是新开源的,所以直接拿ratel来看

(ps:io重定向可以干的事很多哈,如va的多开原理,ratel的一机多号原理,bypass文件检测等场景中,io重定向都起到了至关重要的作用)

函数hook

内存扫描 + hook

这部分优雅的写法主要是IORelocator.h中几个宏决定的,大家可以好好读读源码,然后学习和cv一波

frida方式见我的另一篇文章:https://mp.weixin.qq.com/s/TYwmqIE0jZ0BYWpunQ7TZw



0x5 总结

  • int fd = openat(dirfd, "output.log", O_CREAT|O_RDWR|O_TRUNC, 0777);
  • long fd = syscall(__NR_openat, dirfd, "output.log", O_CREAT|O_RDWR|O_TRUNC, 0777);

以 上述日常读文件方式 和 android8.0源码arm模式 为例:

  • 都要由用户态进入内核态

  • 进入内核态的逻辑由汇编实现(准备寄存器参数,然后swi/svc)

  • 32位下是swi指令,64位下是svc指令

  • openat -> __openat -> __openat.S -> 准备系统调用号,然后swi/svc(这里可以理解写死调用号形式的汇编实现)

  • syscall -> syscall.S -> 准备系统调用号,然后swi/svc(这里可以理解为传参形式的汇编实现)


  • io重定向的应用场景很多


  • ratel hook了

    • 以__openat为代表的文件操作相关函数

    • __openat.S为代表的具体的文件操作方式的swi/svc逻辑(写死调用号形式的汇编实现

    • app so自实现的具体的文件操作方式的swi/svc逻辑写死调用号形式的汇编实现(ps:目前hook时机在dlopen后,目标自实现svc汇编写法要和__openat.S中写法类似,才会生效。哈哈,这部分逻辑我提的pr,cv大法好。当然了,hook的时机、汇编特征、更多调用号的适配都可以继续优化

  • ratel 未hook

    • syscall这个函数

    • syscall.S的汇编实现

  • va,ratel,fakexposed....等项目中有很多可以学习和cv的地方,公众号发了个人理解的方案流/算法流技术晋级路线

  • 感谢上述的各位巨巨




[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-1-4 18:32 被huaerxiela编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回