我有一个可以读写内核内存的程序,我想获取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 .