我的编程空间,编程开发者的网络收藏夹
学习永远不晚

万字长文教你使用安卓内核驱动进行内存读写

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

万字长文教你使用安卓内核驱动进行内存读写

阅读本文的方法:

请确保你拥有着强大的动手能力,以及对游戏辅助开发强烈的兴趣。

请直接阅读内核编译部分

前置知识部分类似于字典的附录,当你需要时,可以回来查找。正所谓:知其然,知其所以然。

前置知识

何为内核驱动

对于一个驱动来说,最重要的就是3个文件:

  1. 源代码
  2. Kconfig
  3. Makefile

只要按照固定的格式来编写这3个文件,linux内核的编译脚本就可以确保把我们的驱动程序编译进去。

而编译一个内核模块有以下两种方式:

  1. 编译进内核;
  2. 编译为一个独立的驱动模块;

首先,我们打开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.oelse    # 如果不在内核构建过程中,则定义内核路径    KDIR := /cepheus-q-oss/outall:    # 切换到内核路径并编译模块    make -C $(KDIR) M=$(PWD) ARCH=arm64 SUBARCH=arm64 modulesclean:    # 清理生成的文件    rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.orderendif

实际上这是一种固定写法。意为此模块的编译方式为:进入rwProcMem37目录,只编译这一个驱动模块。

安卓内核boot

Android不同于一般的嵌入式Linux系统环境固件的组成方式(booloader+kernel+rootfs),其将kernel、ramdisk(rootfs)、second stage(dtb、kernel.logd等)整体打包成一个boot.img文件

而我们对内核的操作,无疑需要boot.img文件。

下面将介绍,一般机型获取boot.img文件的方法

获取boot.img文件

首先,请下载你机型现在版本的完整包。线刷包卡刷包均可。

以小米12pro为例

11

在右上角,可以看到下载最新完整包的字样。

下载好最新版完整包并传输到电脑上。

接下来我们要用到payload_dumper.exe这个工具解包。

[下载地址][https://shuj.lanzoue.com/i79XB0s5bf0f]

新建一个文件夹,将解包工具放进去

再次新建两个文件夹分别命名为payload_inputpayload_output

最终文件夹结构如图
在这里插入图片描述

将刚刚下载的最新版完整包电脑自带的解压工具解压。

找到payload.bin文件,放入payload_input文件夹之中

在这里插入图片描述

然后运行解包工具,在payload_output文件夹中可以找到解压出来的boot.img

1112

将你的纯c项目,适配内核过检测技术

在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_FastBOOL 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_FastBOOL 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

一.下载NDK

NDK下载

  • 下载注意区分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 -bandroid-msm-coral-4.14-android12repo sync

之后的步骤中要用到

编译内核驱动模块~

环境配置

建议使用ubuntu虚拟机或者云主机。

以下命令如果执行报错,请自行解决,不论用什么方法,只要达到了命令前的描述即可。

  • 更换软件源为阿里源
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backupsudo gedit /etc/apt/sources.list# 阿里云源deb http://mirrors.aliyun.com/ubuntu/ bionic main restricteduniverse multiversedeb http://mirrors.aliyun.com/ubuntu/ bionic-security mainrestricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ bionic-updates mainrestricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ bionic-backports mainrestricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ bionic-proposed mainrestricted universe multiversedeb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ bionic main restricteduniverse multiversedeb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ bionic-security mainrestricted universe multiversedeb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ bionic-updates mainrestricted universe multiversedeb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ bionic-backports mainrestricted universe multiversedeb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed mainrestricted universe multiversesudo apt-get updatesudo apt-get upgradesudo apt-get install build-essential
  • 安装git,curl,python
sudo apt-get install gitgit config --global user.email "xxx@gmail.com"git config --global user.name "xxx"##安装gitsudo apt-get install curlmkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo >~/bin/repochmod a+x ~/bin/repo##安装curladd-apt-repository ppa:deadsnakes/ppasudo apt install python3.9sudo ln -s /usr/bin/python3 /usr/bin/python##安装python
  • 修改交换区大小
sudo swapoff /swapfilesudo rm /swapfile# 设置了32g交换区, 防止编译失败sudo dd if=/dev/zero of=/swapfile bs=1GB count=32sudo chmod 600 /swapfilesudo mkswap -f /swapfilesudo 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}" ]; thencp ${VENDOR_RAMDISK_BINARY} ${DIST_DIR}fi

下载内核驱动源码

市面上大部分内核项目,都是用rwProcMem33的这个源码

在这里插入图片描述

obj-m += rwProcMem.o

将drivers目录下的Makefile文件加一行

obj-m += rwProcMem/

修改ver_control.h, 将使用pagemap的宏定义启用

取消掉ver-control.h中第二个宏的注释就行

开始编译

其中的参数根据android-image-kitchen解包出的修改替换即可

BUILD_CONFIG=private/msm-google/build.config.floralBUILD_BOOT_IMG=1 MKBOOTIMG_PATH=mkbootimg.pyVENDOR_RAMDISK_BINARY=boot.img-ramdisk.cpio KERNEL_BINARY=Image.lz4BOOT_IMAGE_HEADER_VERSION=2KERNEL_CMDLINE="console=ttyMSM0,115200n8androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237ehci-hcd.park=3 service_locator.enable=1 androidboot.memcg=1cgroup.memory=nokmem usbcore.autosuspend=7androidboot.usbcontroller=a600000.dwc3 swiotlb=2048androidboot.boot_devices=soc/1d84000.ufshc loop.max_part=7buildvariant=user" BASE_ADDRESS=0x00000000 PAGE_SIZE=4096build/build.sh

编译完成以后得到文件夹

文件夹中的boot.img即为嵌入内存读写的新内核

刷入内核

使用命令

flash boot boot.img

即可刷入。配合前置知识中的修改纯c读写方法,即可做到绝大部分游戏裸奔。

看到这里,相信你已经成功编译了属于自己的内核

来源地址:https://blog.csdn.net/qq_46832407/article/details/129971512

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

万字长文教你使用安卓内核驱动进行内存读写

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录