首页
社区
课程
招聘
[原创]将rwProcMem33编译进安卓内核
2023-8-31 17:06 21367

[原创]将rwProcMem33编译进安卓内核

2023-8-31 17:06
21367

为了做出腾讯游戏安全竞赛初赛的这道安卓题,开始学习rwProcMem33 的使用来打硬件断点了

juice4fun师傅做腾讯游戏安全竞赛初赛的安卓题的writeup时,使用了rwProcMem33来对安卓手机打下硬件断点分析反调试,我也对在安卓手机中打硬件断点的工具很感兴趣,所以就学习一下编译和使用的方法啦

要想使用rwProcMem33,编译环境(即AOSP安卓内核源码环境)的搭建过程是必不可少的,因为最终内核模块是运行在安卓手机的linux内核中,而非虚拟机的linux内核中,所以内核源码是有必要下载的

所以这篇文章不仅是硬件断点工具的编译和使用笔记,也是安卓内核的编译笔记,用来记录我在编译内核的过程中遇到的困难,以及如何克服的

为了更快的下载速度,可以选择配置代理,也可以手动切换下载源,只要不出现网络问题导致下载失败就行

docker的使用完全是因为我的虚拟机shell环境崩溃,从而导致无法编译,如果对自己虚拟机的shell环境足够自信,不使用docker也是可以的

编译环境搭建

虚拟机配置

我使用的虚拟机为Ubuntu22.04,虚拟机的参考配置如下

image-20230811162236189

为虚拟机配置代理

查看虚拟机代理地址

打开clash for windows,并打开Allow LAN的开关,随后点击network interfaces

image-20230811175325211

请注意我的虚拟机使用的网络连接方式为NAT模式,所以需要关注VMnet8的地址,所以对于该虚拟机,代理地址为192.168.27.1,端口就是clashPort选项所显示的端口

image-20230811175516413

启用虚拟机代理

依次点击如下选项进入代理配置

image-20230811180538737

输入代理地址保存即可

image-20230811180608202

配置docker ubuntu镜像

本人因为不小心运行了一个命令source _setup_env.sh,导致虚拟机的shell环境整个崩掉了,build.sh也屡屡运行失败,看了眼_setup_env.sh我真是只能苦涩的笑...

image-20230816224032513

所以不得不用docker了,不过用下来发现竟然意外的好用

安装docker

1
sudo apt install docker.io

docker pull代理配置

1
2
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo gedit /etc/systemd/system/docker.service.d/proxy.conf

输入以下代理服务器内容

1
2
3
4
[Service]
Environment="HTTP_PROXY=http://192.168.27.1:7890/"
Environment="HTTPS_PROXY=http://192.168.27.1:7890/"
Environment="NO_PROXY=localhost,127.0.0.1"

刷新配置并重启 docker 服务

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

docker镜像代理配置

1
2
sudo mkdir -p ~/.docker/
sudo gedit ~/.docker/config.json

输入以下内容

1
2
3
4
5
6
7
8
9
10
11
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://192.168.27.1:7890/",
     "httpsProxy": "http://192.168.27.1:7890/",
     "noProxy": "localhost,127.0.0.1"
   }
 }
}

下载Ubuntu镜像

1
docker pull ubuntu

运行Ubuntu镜像

1
docker run -it --net host --name Akernel ubuntu /bin/bash

安装sudo,vim

1
2
3
apt-get update
apt-get install vim
apt-get install sudo

修改apt-get的软件源为阿里源

1
2
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup
sudo vim /etc/apt/sources.list

替换为如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
 
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
 
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
 
# deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
 
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

随后将apt-get更新至最新版本

1
2
3
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential

安装必要的库

1
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig libssl-dev bc kmod cpio git curl

为git配置基本信息

1
2
3
git config --global user.email "xxx@gmail.com"
git config --global user.name "xxx"
git config --global http.proxy 192.168.27.1:7890

安装repo

1
2
3
mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

修改repo的下载源为清华源,并添加repo至全局变量

打开全局变量配置文件

1
sudo vim ~/.bashrc

添加全局变量

在末尾添加这三行并保存

1
2
3
# repo
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
export PATH="~/bin:$PATH"

使配置文件生效

1
source ~/.bashrc

安装python

如果使用python --version有打印python版本的话,那么这一步就不需要了,如果docker中没有安装python,在docker内使用如下命令安装

1
2
3
4
sudo apt-get install software-properties-common
add-apt-repository ppa:deadsnakes/ppa
sudo apt install python3.9
sudo ln -s /usr/bin/python3 /usr/bin/python

修改交换区大小

为了防止编译源码的过程中由于交换区不足而失败,所以我们需要去修改虚拟机的交换区的大小

1
2
3
4
5
6
7
8
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

下载内核源码

查看内核版本号

这里我的pixel3的内核版本为Linux version 4.9.270-g862f51bac900-ab7613625

1
2
adb shell cat /proc/version
Linux version 4.9.270-g862f51bac900-ab7613625 (android-build@abfarm-east4-101) (Android (7284624, based on r416183b) clang version 12.0.5 (https://android.googlesource.com/toolchain/llvm-project c935d99d7cf2016289302412d708641d52d2f7ee)) #0 SMP PREEMPT Thu Aug 5 07:04:42 UTC 2021

查看内核源码分支

进入building-kernels中查看自己的源码分支,如图我的手机型号为pixel3,并且内核版本为4.9,于是就知道内核源码的代号是android-msm-crosshatch-4.9

image-20230811172340268

之后进入安卓内核源码列表中,搜索内核源码代号android-msm-crosshatch-4.9

image-20230811232551456

我的手机是安卓12,所以我下载的内核版本为android-msm-crosshatch-4.9-android12

这里的qpr1qpr2,我们先看一下QPR的定义,简单来说就是QPR后面跟的数字越高,内核版本就越新

QPR, of course, is short for the Quarterly Platform Release, which Google first introduced with Android 12. These are not full system updates, but they bring a few select changes to the Pixels and other great high-end phones that opt to receive them.

注意一点就是例如你想要下载android-msm-crosshatch-4.9-android10,请先进入你想要下载的AOSP的地址,看看仓库中的default.xml文件,重点关注<project path="build" name="kernel/build" ,如果revision的值为main,请千万不要下载,否则你就会发现下载下来之后根本无法build!!,这是由于build仓库和内核源码仓库不同步导致的

image-20230812144108245

当然你也可以选择进入kernel/build中找到适合你的build file,不过我还是建议能一键编译就一键编译,比如我下载的android-msm-crosshatch-4.9-android12,buildkernel source code就是同步的(惨痛的教训,头铁想要用安卓9的内核源码编译,结果根本无法build...最后还是妥协把手机刷成安卓12了)

下载内核源码

1
2
3
mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-crosshatch-4.9-android12
repo sync -j4

切换git分支

我的手机的Linux内核版本为Linux version 4.9.270-g862f51bac900-ab7613625,g后面跟的是git分支,所以切换的分支为862f51bac900

1
2
cd private/msm-google
git checkout 862f51bac900

编译内核源码

解包boot.img

首先下载android-image-kitchen

然后将boot.img放在工具的根目录下,这里的boot.img就是网上下载的刷机包解压之后其中的boot.img

image-20230811184714849

然后运行unpackimg.bat,运行之后的窗口请不要关闭,因为输出中有需要后续使用到的参数,当然也可以将输出的内容复制下来到txt中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Android Image Kitchen - UnpackImg Script
by osm0sis @ xda-developers
 
Supplied image: boot.img
 
Removing old work folders and files . . .
 
Setting up work folders . . .
 
Image type: AOSP
 
Signature with "AVBv2" type detected.
 
Splitting image to "split_img/" . . .
 
ANDROID! magic found at: 0
BOARD_KERNEL_CMDLINE console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.enable=1 cgroup.memory=nokmem lpm_levels.sleep_disabled=1 usbcore.autosuspend=7 loop.max_part=7 androidboot.boot_devices=soc/1d84000.ufshc androidboot.super_partition=system buildvariant=user
BOARD_KERNEL_BASE 0x00000000
BOARD_NAME
BOARD_PAGE_SIZE 4096
BOARD_HASH_TYPE sha1
BOARD_KERNEL_OFFSET 0x00008000
BOARD_RAMDISK_OFFSET 0x01000000
BOARD_SECOND_OFFSET 0x00000000
BOARD_TAGS_OFFSET 0x00000100
BOARD_OS_VERSION 12.0.0
BOARD_OS_PATCH_LEVEL 2021-10
BOARD_HEADER_VERSION 2
BOARD_HEADER_SIZE 1660
BOARD_DTB_SIZE 863100
BOARD_DTB_OFFSET 0x01f00000
 
Unpacking ramdisk to "ramdisk/" . . .
 
Compression used: gzip
56773 blocks
 
Done!
 
请按任意键继续. . .

unpackimg.bat运行完毕后,我们进入split_img/,然后解压其中的boot.img-ramdisk.cpio.gz,并将解压后的boot.img-ramdisk.cpio文件复制到内核源码根目录中

1
root@oacia-virtual-machine:/home/oacia/Desktop/# docker cp boot.img-ramdisk.cpio Akernel:/android-kernel/

下载mkbootimg.py

我们还需要下载mkbootimg.py,并将其复制到放到内核源码根目录

1
docker cp mkbootimg.py Akernel:/android-kernel/

修改build.sh

在内核源码根目录,进入build/build.sh,找到下方代码的位置

1
2
echo "========================================================"
echo " Files copied to ${DIST_DIR}"

并在这两行代码之前加上下列命令

1
2
3
if [ -f "${VENDOR_RAMDISK_BINARY}" ]; then
cp ${VENDOR_RAMDISK_BINARY} ${DIST_DIR}
fi

image-20230811192125650

下载rwProcMem33

下载地址

1
https://github.com/abcz316/rwProcMem33

然后将解压后的文件夹复制到docker中内核源码目录下的private/msm-google/drivers/

1
docker cp rwProcMem33 Akernel:/android-kernel/private/msm-google/drivers/

修改rwProcMem33

ver_control.h

MY_LINUX_VERSION_CODE切换到对应的安卓内核版本,我们在下载内核源码阶段已经通过cat /proc/version知道了内核的版本号为Linux version 4.9.270-g862f51bac900-ab7613625,所以在private/msm-google/drivers/rwProcMem33/ver_control.hprivate/msm-google/drivers/rwProcMem33/hwBreakpointProcModule/hwBreakpointProc/ver_control.h中我们也将内核切换到对应的4.9版本,选择MY_LINUX_VERSION_CODE的原则选这里出现的版本号中越接近自己手机内核版本的版本号

image-20230813120617329


Linux 4.11前,Linux内核把页表分为4级

  • 页全局目录(Page Global Directory,PGD)
  • 页上层目录(Page Upper Directory,PUD)
  • 页中间目录(Page Middle Directory,PMD)
  • 直接页表(Page Table,PT)

所以对于Linux version 4.11以下的内核版本,并不支持五级页表,选择启用读取pagemap文件来计算物理内存的地址,同时注释掉启用页表计算物理内存的地址如图所示
图片描述
Linux version 4.11版本把页表扩展到五级,在页全局目录和页上层目录之间增加了页四级目录(Page 4th Directory,P4D)

所以对于Linux version 4.11及以上的内核版本,选择启用页表计算物理内存的地址,同时注释掉启用读取pagemap文件来计算物理内存的地址如图所示
图片描述

linux_kernel_api文件夹

rwProcMem33/linux_kernel_api文件夹中新建一个头文件linux_kernel_api.h
图片描述
并写入如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef LINUX_KERNEL_API_H_
#define LINUX_KERNEL_API_H_
#include "../ver_control.h"
#if MY_LINUX_VERSION_CODE < KERNEL_VERSION(5,8,0)
 
long probe_kernel_read(void* dst, const void* src, size_t size);
 
MY_STATIC long x_probe_kernel_read(void* bounce, const char* ptr, size_t sz) {
    return probe_kernel_read(bounce, ptr, sz);
}
 
#endif
 
#if MY_LINUX_VERSION_CODE >= KERNEL_VERSION(5,8,0)
 
long copy_from_kernel_nofault(void* dst, const void* src, size_t size);
 
MY_STATIC long x_probe_kernel_read(void* bounce, const char* ptr, size_t sz) {
    return copy_from_kernel_nofault(bounce, ptr, sz);
}
 
#endif
#endif /* LINUX_KERNEL_API_H_ */

api_proxy.h

为了包含linux_kernel_api.h头文件,我们在api_proxy.h的前几行中加入#include "linux_kernel_api/linux_kernel_api.h"如图

图片描述

修改drivers的Makefile

private/msm-google/drivers/Makefile的开头加入下列命令

1
2
obj-y += rwProcMem33/hwBreakpointProcModule/hwBreakpointProc/
obj-y += rwProcMem33/

修改msm-google的Makefile

在编译rwProcMem33内核模块时,由于内核编译时会将警告视为错误导致编译内核停止,所以我们要修改Makefile来忽视warning

private/msm-google/Makefile找到如下位置,在-Wno-format-security后加上一个-w参数

image-20230816235239736

开始编译

在安卓内核源码的根目录打开终端使用如下命令开始编译

命令的参数为使用android-image-kitchen解包boot.img之后,控制台所打印的参数请务必替换为相对应的参数!!!

参数对应关系为

android-image-kitchen解包参数名称 编译命令参数名称
BOARD_KERNEL_CMDLINE console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.enable=1 cgroup.memory=nokmem lpm_levels.sleep_disabled=1 usbcore.autosuspend=7 loop.max_part=7 androidboot.boot_devices=soc/1d84000.ufshc androidboot.super_partition=system buildvariant=user KERNEL_CMDLINE
BOARD_KERNEL_BASE 0x00000000 BASE_ADDRESS
BOARD_PAGE_SIZE 4096 PAGE_SIZE
BOARD_HEADER_VERSION 2 BOOT_IMAGE_HEADER_VERSION

编译命令中的BUILD_CONFIG为AOSP源码根目录的build.config的软连接所指向的配置文件

image-20230812145430979

所以最终的编译命令为

1
BUILD_CONFIG=private/msm-google/build.config.bluecross 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 cgroup.memory=nokmem lpm_levels.sleep_disabled=1 usbcore.autosuspend=7 loop.max_part=7 androidboot.boot_devices=soc/1d84000.ufshc androidboot.super_partition=system buildvariant=user" BASE_ADDRESS=0x00000000 PAGE_SIZE=4096 build/build.sh

经过一段时间的等待,编译成功!

image-20230813121805073

生成的boot.img的路径为/android-kernel/out/android-msm-pixel-4.9/dist/boot.img

使用Magisk修补boot.img实现root

安装Magisk 下载地址

1
adb install "D:\TOOLS\pixel3\Magisk-v26.1.apk"

将由内核源码编译出来的boot.img上传到手机上

1
adb push boot.img /sdcard/

然后在手机上打开Magisk,依次点击安装->选择并修补一个文件->/sdcard/boot.img->开始

待修补完成后,将修补后的boot.img传到电脑上

1
adb pull /storage/emulated/0/Download/magisk_patched-xxxxx_xxxxx.img

刷入内核

1
2
3
adb reboot bootloader
fastboot flash magisk_patched-xxxxx_xxxxx.img
fastboot reboot

编译HwBpClient客户端

进入rwProcMem33\hwBreakpointProcModule\testHwBpClient文件夹,双击testHwBpClient.vcxprojvisual studio中打开

编译的程序位数应为64位

对于Windows平台编译的HwBpClient,并且需要在testHwBpClientDlg.cpp的这个位置进行修改,将这个位置的llX改为I64X,%zu改成I64d,否则将无法正确输入内容

图片描述

原因在于C/C++输出64位数在window下和linux下是不一样的

linux

1
2
3
printf("%lld/n",a);
printf("%llu/n",a);
printf("%llx/n",a);

windows

1
2
3
printf("%I64d/n",a);
printf("%I64u/n",a);
printf("%I64x/n",a);

修改完成后如图所示

图片描述

接下来按下ctrl+B生成即可

image-20230816194207598

编译HwBpServer服务端

编译HwBpServer服务端需要NDK,并将NDK引入环境变量中

NDK可以在android studio中进行安装,依次点击File->Project Structure->SDK Location,找到Android NDK location,点击Download即可开始安装,我这里使用的ndk的版本为ndk25.2.9519653

如果没有安装Android studio,NDK的安装方法可以在谷歌上找到

NDK安装完成后,进入到rwProcMem33\hwBreakpointProcModule\testHwBpServer\jni,打开cmd运行命令

1
ndk-build

即可完成编译,编译后的文件在rwProcMem33\hwBreakpointProcModule\testHwBpServer\libs中,选择对应手机架构的ELF,push到手机中运行即可

获取手机的IPv4地址

将电脑和我们的测试手机连接同一个手机热点,然后在测试手机中打开设置->WLAN点击我们连接的热点的高级选项,来查看手机的IP地址

运行HwBpServer服务端

将编译出来的程序复制到手机中并运行

1
2
3
4
5
6
adb push rwProcMem33\hwBreakpointProcModule\testHwBpServer\libs\arm64-v8a\testHwBpServer.out /data/local/tmp
adb shell
su
cd /data/local/tmp
chmod 777 testHwBpServer.out
./testHwBpServer.out

查看打印出来的端口号3170

image-20230816221255328

运行HwBpClient客户端

在电脑中运行编译完成的HwBpClient客户端,填入手机的IP地址以及由testHwBpServer.out打印出来的端口号

image-20230816221420002

点击连接即可开始打硬件断点

image-20230816221529230

查询进程PID

1
ps -A

查询目标so的基址

可以使用命令来查询

1
cat /proc/[app的PID]/maps

也可以使用下面的frida脚本查询so的基址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function dump_so(so_name) {
    Java.perform(function () {
        var currentApplication = Java.use("android.app.ActivityThread").currentApplication();
        var dir = currentApplication.getApplicationContext().getFilesDir().getPath();
        var libso = Process.getModuleByName(so_name);
        console.log("[name]:", libso.name);
        console.log("[base]:", libso.base);
        console.log("[size]:", ptr(libso.size));
        console.log("[path]:", libso.path);
        }
    });
}
 
rpc.exports = {
    dump_so: dump_so
};

接下来就可以愉快的打硬件断点啦~

参考资料


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2024-3-3 19:29 被oacia编辑 ,原因: 移除了下载内核源码中的--depth=1参数
收藏
点赞25
打赏
分享
最新回复 (64)
雪    币: 62
活跃值: (561)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-8-31 19:46
2
1
当初要有这篇雄文 也不至于摸索一周才编译出来
雪    币: 337
活跃值: (432)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mb_kbkqyusp 2023-8-31 19:59
3
1
又涨见识了,太吊了这个
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_mndqtppt 2023-8-31 21:13
4
1
QQ附近人大佬有把
雪    币: 2659
活跃值: (3772)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
值得怀疑 2023-8-31 22:03
5
1
你好,我大概看了下是要在docker下编译吗,还是不在docker 下也可以,你虚拟机下装docker 这性能可以吗?
雪    币: 3514
活跃值: (4011)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
oacia 2 2023-8-31 22:37
6
1
值得怀疑 你好,我大概看了下是要在docker下编译吗,还是不在docker 下也可以,你虚拟机下装docker 这性能可以吗?
不在docker下编译也是可以的;
docker的性能由虚拟机的配置决定,docker 仅仅虚拟了用户空间,和虚拟机共用的是同一个内核,所以我文中提到的<修改交换区大小>修改的也是虚拟机的交换区大小
雪    币: 19410
活跃值: (29069)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-9-1 09:09
7
2
感谢分享
雪    币: 8040
活跃值: (5240)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mudebug 2023-9-1 10:01
8
1
感谢分享
雪    币: 185
活跃值: (506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kkte 2023-9-1 11:46
9
1
这个思路很好啊,
雪    币: 78
活跃值: (1413)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Archar 2023-9-1 17:20
10
1
感谢分享
雪    币: 12500
活跃值: (3043)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
白菜大哥 2023-9-1 21:54
11
1
啥型号的手机,方便分享个ROM吗?
雪    币: 3514
活跃值: (4011)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
oacia 2 2023-9-1 22:22
12
1
白菜大哥 啥型号的手机,方便分享个ROM吗?
我的手机是pixel3,pixel或者nexus系列手机的刷机包可以直接在https://developers.google.com/android/images?hl=zh-cn下载,其他型号的手机去网上找找有没有相关的刷机包吧,想起来之前有刷过一次三星手机SM-P200,当时那个刷机包还是我在网上买来的
雪    币: 519
活跃值: (3752)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
龙飞雪 2023-9-1 22:50
13
1
不错,感谢分享
雪    币: 4744
活跃值: (6254)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
霸气压萝莉 2023-9-1 22:55
14
1
学到了
雪    币: 12500
活跃值: (3043)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
白菜大哥 2023-9-2 18:23
15
1
oacia 我的手机是pixel3,pixel或者nexus系列手机的刷机包可以直接在https://developers.google.com/android/images?hl=zh-cn下载,其他型号的手机 ...
感谢,我看看有没有便宜的,我是想直接白嫖一下你改好的ROM
雪    币: 1734
活跃值: (2467)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NPC2000 2023-9-3 20:24
16
1

大佬,加-w会还是显示这种报错,pixel3 android12 内核

雪    币: 3514
活跃值: (4011)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
oacia 2 2023-9-3 20:56
17
1
NPC2000 大佬,加-w会还是显示这种报错,pixel3 android12 内核

看了下这个报错是没声明p4d,我记得在linux4.11才能用五级页表来着,看来文章还是有写的不太严谨的地方,我刚刚改了一下文章中修改ver_control.h这儿的内容,你可以重新编译试试看

最后于 2023-9-3 20:59 被oacia编辑 ,原因:
雪    币: 1734
活跃值: (2467)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NPC2000 2023-9-4 12:10
18
1
oacia NPC2000 大佬,加-w会还是显示这种报错,pixel3 android12 内核 看了下这个报错是没声明p4d,我记得在linux4.11 ...
感谢大佬,这次成功了
雪    币: 318
活跃值: (213402)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
shinratensei 1 2023-9-4 13:39
19
1
tql
雪    币: 1174
活跃值: (1177)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cmputer 2023-9-4 15:27
20
1
感谢分享
雪    币: 1744
活跃值: (8728)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你瞒我瞒 2023-9-5 09:28
21
1
在刷入内核的步骤遇到问题了:然后再手机上打开Magisk,依次点击安装->选择并修补一个文件->/sdcard/boot.img->开始

待修补完成后,将修补后的boot.img传到电脑上adb pull /storage/emulated/0/Download/magisk_patched-xxxxx_xxxxx.img,这里是拿到了修补的boot,这个boot,我记得是需要刷到设备上面才能实现root。下面刷入的boot是在内核编译完成的?那么上面面具修补的boot好像没用到?
雪    币: 3514
活跃值: (4011)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
oacia 2 2023-9-5 11:33
22
1
哦哦抱歉关于修补boot.img实现root这一部分的内容,我是直接从以前我做的笔记这里复制过来的,这里相关的内容还没有进行修改,所以造成了误导
这里使用Magisk修补的boot.img,应该是由内核源码编译出来的boot.img,而不是从刷机包中解包出来的boot.img,文章内的相关内容已经进行修正,感谢指出
雪    币: 483
活跃值: (735)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Yuusha 2023-9-5 11:37
23
1

'

最后于 2023-9-8 15:07 被Yuusha编辑 ,原因:
雪    币: 3514
活跃值: (4011)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
oacia 2 2023-9-5 11:42
24
1
Yuusha 刷了后卡android&nbsp;log,但adb能用,猜测是模块加载验证之类的问题,根据这篇文章关闭验证后https://bbs.kanxue.com/thread-264295.htm,启 ...
因为不是使用insmod的方式安装内核模块而是直接把内核模块编译进内核,这应该是不需要模块验证的,你用lsmod看看有没有硬件断点相关的内核模块
雪    币: 483
活跃值: (735)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Yuusha 2023-9-5 15:49
25
1
oacia 因为不是使用insmod的方式安装内核模块而是直接把内核模块编译进内核,这应该是不需要模块验证的,你用lsmod看看有没有硬件断点相关的内核模块

'

最后于 2023-9-8 15:07 被Yuusha编辑 ,原因:
游客
登录 | 注册 方可回帖
返回