万字长文教你使用安卓内核驱动进行内存读写 | 您所在的位置:网站首页 › 手机内存监测 › 万字长文教你使用安卓内核驱动进行内存读写 |
你是不是经常看到一些游戏辅助声称自己独家内核驱动,支持一切机型,无视游戏检测。本文将带领你,从0开始,编译属于自己的安卓内核驱动。通过本文:你将从一名初级的游戏辅助开发者,摇身一变成为所谓的独家内核作者本文只涉及过检测等内容,不涉及辅助编写。如果对辅助编写感兴趣的,请看我以前的文章。
目录
前置知识何为内核驱动安卓内核boot获取boot.img文件
将你的纯c项目,适配内核过检测技术win端编译纯c一.下载NDK二.环境变量三.检查NDK是否能正确运行四.编译纯c
下载对应版本的内核源码
编译内核驱动模块~环境配置编译源码使用android-image-kitchen解压boot在源码中加点私货下载内核驱动源码开始编译
刷入内核
阅读本文的方法: 请确保你拥有着强大的动手能力,以及对游戏辅助开发强烈的兴趣。 请直接阅读内核编译部分 前置知识部分类似于字典的附录,当你需要时,可以回来查找。正所谓:知其然,知其所以然。 前置知识 何为内核驱动对于一个驱动来说,最重要的就是3个文件: 源代码KconfigMakefile只要按照固定的格式来编写这3个文件,linux内核的编译脚本就可以确保把我们的驱动程序编译进去。 而编译一个内核模块有以下两种方式: 编译进内核;编译为一个独立的驱动模块;首先,我们打开rwProcMem模块中的makefile文件 这段代码的意思是: # 定义模块名 MODULE_NAME := rwProcMem37 # 定义内核对象文件 RESMAN_CORE_OBJS:=sys.o # 定义空的 glue 对象文件 RESMAN_GLUE_OBJS:= # 如果已经在内核构建过程中了 ifneq ($(KERNELRELEASE),) # 指定需要链接的对象文件 $(MODULE_NAME)-objs:=$(RESMAN_GLUE_OBJS) $(RESMAN_CORE_OBJS) # 声明需要编译成模块的源文件 obj-m := rwProcMem37.o else # 如果不在内核构建过程中,则定义内核路径 KDIR := /cepheus-q-oss/out all: # 切换到内核路径并编译模块 make -C $(KDIR) M=$(PWD) ARCH=arm64 SUBARCH=arm64 modules clean: # 清理生成的文件 rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order endif实际上这是一种固定写法。意为此模块的编译方式为:进入rwProcMem37目录,只编译这一个驱动模块。 安卓内核bootAndroid不同于一般的嵌入式Linux系统环境固件的组成方式(booloader+kernel+rootfs),其将kernel、ramdisk(rootfs)、second stage(dtb、kernel.logd等)整体打包成一个boot.img文件 而我们对内核的操作,无疑需要boot.img文件。 下面将介绍,一般机型获取boot.img文件的方法 获取boot.img文件首先,请下载你机型现在版本的完整包。线刷包卡刷包均可。 以小米12pro为例 在右上角,可以看到下载最新完整包的字样。 下载好最新版完整包并传输到电脑上。 接下来我们要用到payload_dumper.exe这个工具解包。 [下载地址][https://shuj.lanzoue.com/i79XB0s5bf0f] 新建一个文件夹,将解包工具放进去 再次新建两个文件夹分别命名为payload_input和payload_output 最终文件夹结构如图 将刚刚下载的最新版完整包用电脑自带的解压工具解压。 找到payload.bin文件,放入payload_input文件夹之中 然后运行解包工具,在payload_output文件夹中可以找到解压出来的boot.img 在rwProcMem33这个项目中,提供了完整的内存读写技术 //驱动_打开进程 uint64_t hProcess = rwDriver.OpenProcess(pid); printf("调用驱动 OpenProcess 返回值:%" PRIu64 "\n", hProcess); if (!hProcess) { printf("调用驱动 OpenProcess 失败\n"); fflush(stdout); return 0; } //驱动_读取进程内存 char readBuf[1024] = { 0 }; size_t real_read = 0; //如果是单线程读内存,还可另选用极速版函数:ReadProcessMemory_Fast BOOL read_res = rwDriver.ReadProcessMemory(hProcess, (uint64_t)pBuf, &readBuf, sizeof(readBuf), &real_read, FALSE); printf("调用驱动 ReadProcessMemory 读取内存地址:%p,返回值:%d,读取到的内容:%s,实际读取大小:%zu\n", pBuf, read_res, readBuf, real_read); //驱动_写入进程内存 memset(readBuf, 0, sizeof(readBuf)); snprintf(readBuf, sizeof(readBuf), "%s", "写入456"); size_t real_write = 0; //如果是单线程写内存,还可另选用极速版函数:WriteProcessMemory_Fast BOOL write_res = rwDriver.WriteProcessMemory(hProcess, (uint64_t)pBuf, &readBuf, sizeof(readBuf), &real_write, FALSE); printf("调用驱动 WriteProcessMemory 写入内存地址:%p,返回值:%d,写入的内容:%s,实际写入大小:%zu\n", pBuf, write_res, readBuf, real_write); printf("当前缓冲区内容 :%s,当前缓冲区的内存地址:%p\n", szBuf, pBuf);替换纯c的内存读写模块即可,其他的部分不用进行改动 之后重新编译纯c win端编译纯c 一.下载NDKNDK下载 下载注意区分32位和64位的 下载完成之后直接解压 如果需要下载最新的NDK版本,可能需要到谷歌官网去下载 想要编译纯c,请不要下载最新版ndk,最新版ndk已经停止了对gcc的支持。请下载android-ndk-r17c版本 二.环境变量环境变量设置:输入NDK的路径 三.检查NDK是否能正确运行如果确认环境变量路径配置没问题,命令行还是无法识别ndk-build的命令,可以尝试重启电脑或者命令行 四.编译纯c在testko目录下,打开cmd命令行 输入 ndk-build在libs目录中可以找到编译成功的纯c文件 下载对应版本的内核源码首先下载adb工具,英文不好的可以下载一个搞机助手电脑版打开adb。然后连接手机。执行 adb shell cat /proc/version查看自己手机的内核版本号 如下图 我的手机内核版本号为 Linux version 4.14.180-perf-g11d81629da33 然后去 https://source.android.com/setup/build/building-kernels 这里查看自己的源码分支 并且下载源码 repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-coral-4.14-android12 repo sync之后的步骤中要用到 编译内核驱动模块~ 环境配置建议使用ubuntu虚拟机或者云主机。 以下命令如果执行报错,请自行解决,不论用什么方法,只要达到了命令前的描述即可。 更换软件源为阿里源 sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup sudo gedit /etc/apt/sources.list # 阿里云源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse sudo apt-get update sudo apt-get upgrade sudo apt-get install build-essential 安装git,curl,python sudo apt-get install git git config --global user.email "[email protected]" git config --global user.name "xxx" ##安装git sudo apt-get install curl mkdir ~/bin PATH=~/bin:$PATH curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo ##安装curl add-apt-repository ppa:deadsnakes/ppa sudo apt install python3.9 sudo ln -s /usr/bin/python3 /usr/bin/python ##安装python 修改交换区大小 sudo swapoff /swapfile sudo rm /swapfile # 设置了32g交换区, 防止编译失败 sudo dd if=/dev/zero of=/swapfile bs=1GB count=32 sudo chmod 600 /swapfile sudo mkswap -f /swapfile sudo swapon /swapfile 编译源码下面开始,是对手机内核进行的操作。请务必一步一步进行,严格按照说明。否则将有变砖风险 使用android-image-kitchen解压boot[下载链接][https://forum.xda-developers.com/attachments/android-image-kitchen-v3-8-win32-zip.5300919/] 将boot.img放到其文件夹下面, 运行unpackimg.bat得到命令行参数 注意:文件夹路径不能有中文 得到命令行参数如下 请不要关闭命令行,得到的参数要用到 还在split_img文件下可以找到一个名为boot.img-ramdisk.cpio.gz的文件。如下图 将这个文件解压到最开始下载好的内核源码中,如果你还不知道如何下载你对应机型的内核源码,请参看前置知识中源码下载部分 在源码中加点私货下载[私货][http://aospxref.com/android-11.0.0_r21/xref/system/tools/mkbootimg/mkbootimg.py] 到源码的根目录下 修改build/build.sh, 在echo " Files copied to ${DIST_DIR}"之前加上 if [ -f "${VENDOR_RAMDISK_BINARY}" ]; then cp ${VENDOR_RAMDISK_BINARY} ${DIST_DIR} fi 下载内核驱动源码市面上大部分内核项目,都是用rwProcMem33的这个源码 将drivers目录下的Makefile文件加一行 obj-m += rwProcMem/修改ver_control.h, 将使用pagemap的宏定义启用 取消掉ver-control.h中第二个宏的注释就行 开始编译其中的参数根据android-image-kitchen解包出的修改替换即可 BUILD_CONFIG=private/msm-google/build.config.floral BUILD_BOOT_IMG=1 MKBOOTIMG_PATH=mkbootimg.py VENDOR_RAMDISK_BINARY=boot.img-ramdisk.cpio KERNEL_BINARY=Image.lz4 BOOT_IMAGE_HEADER_VERSION=2 KERNEL_CMDLINE="console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.enable=1 androidboomcg=1 cgroup.memory=nokmem usbcore.autosuspend=7 androidboot.usbcontroller=a600000.dwc3 swiotlb=2048 androidboot.boot_devices=soc/1d84000.ufshc loop.max_part=7 buildvariant=user" BASE_ADDRESS=0x00000000 PAGE_SIZE=4096 build/build.sh编译完成以后得到文件夹 文件夹中的boot.img即为嵌入内存读写的新内核 刷入内核使用命令 flash boot boot.img即可刷入。配合前置知识中的修改纯c读写方法,即可做到绝大部分游戏裸奔。 看到这里,相信你已经成功编译了属于自己的内核 |
CopyRight 2018-2019 实验室设备网 版权所有 |