如何从具有内核读/写功能的ARM64程序中获取swapper_pg_dir地址?



我有一个可以读写内核内存的程序,我想获取swapper_pg_dir的地址。有问题的设备运行的是带有ARM64架构的Android,并且启用了kASLR。

swapper_pg_dir没有打印到/proc/kallsyms,我试图做的是从 System.map 获取swapper_pg_dir地址(通过编译内核源代码获得(并使用/proc/kallsyms 计算偏移量,并使用它来计算当前的swapper_pg_dir地址。但是生成的地址似乎是错误的,因为程序无法从中读取内存(从此地址读取内存返回一些字符串,这些字符串大多是"u:object_r:#####_prop:s0"格式,这通常在内存未映射时发生(

此外,烧录修改后的内核或加载内核模块不是一种选择,因为引导加载程序在此设备中被锁定(并且不允许解锁(。

那么,获取swapper_pg_dir地址的可能方法是什么?可以从将其作为变量的结构(其地址以 kallsyms 导出或可以计算(中读取,但我还没有找到这样的结构。

你的最终目标是什么?

唰��S

/*
* swapper_pg_dir is the virtual address of the initial page table. We place
* the page tables 3 * PAGE_SIZE below KERNEL_RAM_VADDR. The idmap_pg_dir has
* 2 pages and is placed below swapper_pg_dir.
*/

KERNEL_RAM_VADDR是

#define KERNEL_RAM_VADDR    (PAGE_OFFSET + TEXT_OFFSET)

page_size可以从 proc 查询。

这些地址将为您提供swapper_pg_dir地址。

结构init_mm包含swapper_pg_dir地址。

struct mm_struct init_mm = {
[...]
.pgd = swapper_pg_dir,
[...]
};

在我的情况下,它位于init_mm地址之后 64 字节的地址。

使用以下命令。请注意,您必须配置内核。

cat /sys/kernel/debug/kernel_page_tables | grep swapper_pg_dir .

最新更新