我有一个可以读写内核内存的程序,我想获取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导出或可以计算得出)中读取,但我尚未找到这种结构。
您的最终目标是什么?
根据head.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可以从过程中查询。
这些地址将为您提供swapper_pg_dir的地址。