首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从具有内核读写能力的ARM64程序中获取swapper_pg_dir地址?

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

Stack Overflow用户
提问于 2019-11-23 15:03:10
回答 3查看 622关注 0票数 0

我有一个可以读写内核内存的程序,我想得到swapper_pg_dir的地址。问题中的设备运行的是ARM64架构的安卓系统,并启用了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导出或可以计算)中读取,但我还没有找到这样的结构。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-01 12:07:50

结构init_mm包含swapper_pg_dir地址。

代码语言:javascript
运行
复制
struct mm_struct init_mm = {
[...]
  .pgd = swapper_pg_dir,
[...]
};

在我的例子中,它位于init_mm地址后面64个字节的地址。

票数 0
EN

Stack Overflow用户

发布于 2019-11-29 14:18:05

你的最终目标是什么?

根据head.S

代码语言:javascript
运行
复制
/*
 * 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是

代码语言:javascript
运行
复制
#define KERNEL_RAM_VADDR    (PAGE_OFFSET + TEXT_OFFSET)

可以从proc查询page_size。

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

票数 0
EN

Stack Overflow用户

发布于 2021-09-04 13:47:56

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

代码语言:javascript
运行
复制
cat /sys/kernel/debug/kernel_page_tables | grep swapper_pg_dir .
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59005349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档