目录

充电学习中...

标签: 安卓 (5)

安卓内核定制开发笔记(三)系统调用Hook 有更新!

安卓内核定制开发笔记(三)系统调用Hook 在上一篇文章中,我们已经探讨了对系统调用的简单Hook,但是在实际应用中,只是监控系统调用的出入参是无法满足需求的,我们预期得到一个类似于inline hook的功能,也就是在hook到调用的同时,可以对出入参进行修改。这一功能在用户态非常容易实现,与正向开发无异,但是内核态由于各种保护机制,无法直接修改用户态的内存,导致这一实现有些麻烦,可以参考看雪文章[原创]内核层偷天换日之hook openat进行文件重定向-Android安全-看雪-安全社区|安全招聘|kanxue.com 我们可以看到内核代码中对openat调用号的声明 int openat(int dirfd, const char __user *pathname, int flags, umode_t modex) 可以看到,关键的路径入参被const和__user修饰,这代表这是一个用户态的常量,而内核模块工作在内核态,与用户态是隔离的,内核策略也限制了内核态和用户态内存的互相访问,所以内核模块是无法直接修改这个参数的。 解决方案 为了解决这一问题,我们需要使用内核提供的....

安卓内核定制开发笔记(二)系统调用拦截 有更新!

安卓内核定制开发笔记(二)系统拦截 在第一篇文章中,我们已经已一加3T为例,尝试编译和刷入了官方内核,并且解决的一些驱动问题,接下来我们将在此基础上去实现对系统调用的Hook,以openat为例 Hook原理 系统调用是内核开放给用户态的"接口",而各个系统调用的地址被保存在系统调用表(sys_call_table)中,所以只需要修改对应调用号(例如openat)在系统调用表中的地址就可以实现对系统调用的hook了 开发流程 1.获取sys_call_table地址 方法一: 在内核编译页面,找到System.map,里面保存了编译后的符号地址,可以在内核编译输出目录直接执行以下命令 cat System.map |grep "sys_call_table" 方法二: 动态获取,内核版本4.4以下可以用 // 内核4.4以下可以用 static void getsyscall_table(void) { unsigned long *syscall_table; unsigned long int i; for (i = (unsigned long int)sys_close; i....

安卓内核定制开发笔记(一)内核源码编译 有更新!

安卓内核定制开发笔记(一)内核源码编译 注意:本文默认读者知晓刷机风险,并且熟练进行刷机操作 测试设备:一加3T 安卓P 测试系统:Ubuntu 20.04 先放上前后对比图,如下图内核版本名称从3.18.120-perf+变为了3.18.120-perf+cube 刷内核前: 刷内核后: 一、环境准备 1.安装依赖 apt install git gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev libgl1-mesa-dev libxml2-utils xsltproc unzip bc gcc-aarch64-linux-gnu 2.安装交叉编译工具链 git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 根据需要迁出分支 git checkout -B an....

拆解QtScrcpy的熄屏控制功能 有更新!

QtScrcpy 是一款优秀的安卓投屏开源软件,其投屏效果接近于直接在PC上使用模拟器,但是本文的关注点在于其一个相对冷门的功能----关闭屏幕 不同于下面的电源键按钮,关闭屏幕只会熄灭手机屏幕而不会真的锁屏,众所周知手机的屏幕几乎是耗电最高的硬件,那么当设备需要长时间运行时,熄灭屏幕可以延长设备寿命、减少设备散热(更重要的是,屏幕内容将无法被直接看到)。 那么,这是如何实现的呢?起初我以为这是adb原本就支持的功能,但是翻遍了adb的手册也只能找到模拟电源键,即只能实现真锁屏。那就只能去查阅QtScrcpy源码了,顺便也去了解了一下QtScrcpy的工作原理。 QtScrcpy熄屏实现 QtScrcpy实现代码如下 本质上是调用了安卓android.view.SurfaceControl类的setDisplayPowerMode方法来实现,而调用这个方法,需要ACCESS_SURFACE_FLINGER权限,但权限又只有系统app才能申请,那么QtScrcpy是如何解决的呢?答案就是利用adb权限,QtScrcpy会先将scrcpy-server(在源码中是个安卓项目,有main....

安卓开机自启动方案 有更新!

安卓开机自启动方案----基于Magisk 一、需求描述 本文的开机自启动应用场景并非普通的安卓APP启动,主要的目标是在设备启动时执行shell脚本,并使用frida-inject进行frida脚本注入动作。在通常的情况下,开机启动某个app可以通过安卓的广播功能来进行,但是此方式并不能确保成功启动,在锁屏情况下也可能导致失败,并且对于有些国内深度定制的安卓系统是完全无效的。 二、Init.d尝试 起初,由于我们的场景是拥有root权限的,笔者打算通过激活安卓的Init.d来实现需求。大致的流程如下: 安装环境(busybox)-激活init.d-复制shell脚本到指定目录 这套方案在经过一番尝试后被我放弃了,原因如下: 部署繁琐,需要安装busybox并激活init.d,这一步骤实现完全自动话有些麻烦,当大规模批量部署时,耗时会大大增加 不能够适配所有安卓设备或系统,比如我用的测试机器红米Note3 MIUI9就失败了 三、使用Magisk实现 刷入Magisk,刷入方法可以见此文章,如果不需要xposed功能可以不刷EdXposed,本文中我们只将Magisk用于自启动,所....