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

这篇具有很好参考价值的文章主要介绍了万字长文教你使用安卓内核驱动进行内存读写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 你是不是经常看到一些游戏辅助声称自己独家内核驱动支持一切机型无视游戏检测
  • 本文将带领你,从0开始,编译属于自己的安卓内核驱动
  • 通过本文:你将从一名初级的游戏辅助开发者,摇身一变成为所谓的独家内核作者
  • 本文只涉及过检测等内容,不涉及辅助编写。如果对辅助编写感兴趣的,请看我以前的文章。

阅读本文的方法:

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

请直接阅读内核编译部分

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

前置知识

何为内核驱动

对于一个驱动来说,最重要的就是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.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目录,只编译这一个驱动模块。

安卓内核boot

Android不同于一般的嵌入式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_inputpayload_output

最终文件夹结构如图
万字长文教你使用安卓内核驱动进行内存读写

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

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

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

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

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

将你的纯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_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

一.下载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 -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 "xxx@gmail.com"
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的这个源码

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

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.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 androidboot.memcg=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读写方法,即可做到绝大部分游戏裸奔。

看到这里,相信你已经成功编译了属于自己的内核文章来源地址https://www.toymoban.com/news/detail-439164.html

到了这里,关于万字长文教你使用安卓内核驱动进行内存读写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 驱动开发:内核物理内存寻址读写

    在某些时候我们需要读写的进程可能存在虚拟内存保护机制,在该机制下用户的 CR3 以及 MDL 读写将直接失效,从而导致无法读取到正确的数据,本章我们将继续研究如何实现物理级别的寻址读写。 首先,驱动中的物理页读写是指在驱动中直接读写物理内存页(而不是虚拟内

    2024年02月11日
    浏览(41)
  • 驱动开发:内核读写内存浮点数

    如前所述,在前几章内容中笔者简单介绍了 内存读写 的基本实现方式,这其中包括了 CR3切换 读写, MDL映射 读写, 内存拷贝 读写,本章将在如前所述的读写函数进一步封装,并以此来实现驱动读写内存浮点数的目的。内存 浮点数 的读写依赖于 读写内存字节 的实现,因为

    2024年02月06日
    浏览(52)
  • 驱动开发:内核读写内存多级偏移

    让我们继续在 《内核读写内存浮点数》 的基础之上做一个简单的延申,如何实现多级偏移读写,其实很简单,读写函数无需改变,只是在读写之前提前做好计算工作,以此来得到一个内存偏移值,并通过调用内存写入原函数实现写出数据的目的。 以读取偏移内存为例,如下

    2024年02月11日
    浏览(36)
  • 驱动开发:内核解析内存四级页表

    当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了 9-9-9-9-12 的分页模式, 9-9-9-9-12 分页表示物理地址拥有四级页表,微软将这四级依次命名为PXE、PPE、PDE、PTE这四项。 关于内存管理和分页模式,不同的操

    2024年02月06日
    浏览(53)
  • 安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动

    今天我们一起学习一下如何实现对一款有驱动代码的传感器适配安卓系统 开发板:某AR眼镜公司的开发板RK3399 1. 什么是设备树(.dts) DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。 其主要目的是定义MCU各个引脚的接线功能,通过

    2024年02月04日
    浏览(53)
  • 字符设备驱动(内核态用户态内存交互)

    内核驱动:运行在内核态的动态模块,遵循内核模块框架接口,更倾向于插件。 应用程序:运行在用户态的进程。 应用程序与内核驱动交互通过既定接口,内核态和用户态访问依然遵循内核既定接口。 系统:openEuler-20.03-LTS-SP3 char_module.c Makefile 驱动构建 驱动信息确认 应用程

    2024年02月11日
    浏览(42)
  • 【嵌入式环境下linux内核及驱动学习笔记-(10-内核内存管理)】

    对于包含MMU(内存管理单元)的处理器而言,linux系统以虚拟内存的方式为每个进程分配最大4GB的内存。这真的4GB的内存空间被分为两个部分–用户空间 与 内核空间。用户空间地地址分布为0~3GB,剩下的3 ~ 4GB 为内核空间。如下图。 用户进程通常只能访问用户空间的虚拟地址

    2024年02月11日
    浏览(56)
  • 安卓手机内存满了,4个方法教你释放空间

    很多人使用的都是安卓手机,但是你总会碰到这种难题, 安卓手机内存满了怎么办? 手机卡到不行,想下载新软件也下载不了,又不知道该怎么清理内存。别担心,接下来小编用 4个方法 来教会你清理手机的垃圾文件,赶快来看看吧! 一.文件管理 手机内存满了,其实大部

    2024年02月10日
    浏览(41)
  • 万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求

    业务场景 :在日常开发中,经常需要调用第三方接口,例如调用物流接口,此时需要利用urlConnection或者restTemplate模拟postman发送请求,请求支持加header ,设置content-type支持传递json;请求方式get,post,也可以需要传递文件,或者传递文件流; 下面这个例子就包含日常开发中大

    2024年02月05日
    浏览(65)
  • 【AI绘画】万字长文——(超详细)ControlNet的详细介绍&使用Stable Diffusion的艺术二维码完全生成攻略

    详细介绍ControlNet的各个部分,相关案例,以及使用二维码作为ControlNet模型的输入的Stable Diffusion生成的图像,使二维码转变为艺术图像 Stable Diffusion :是StabilityAI于2022年8月22日发布的文本到图像模型。它类似于OpenAI的DALL·E 2和Midjourney等其他图像生成模型,但有一个很大的不同

    2024年02月05日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包