gpt4 book ai didi

c - 访问 vDSOlinux

转载 作者:太空狗 更新时间:2023-10-29 12:18:45 24 4
gpt4 key购买 nike

正在研究Linux中的vdso机制。为了找到 DSO,我可以解析传递给程序入口点的辅助 vector 。 AT_SYSINFO_EHDR 条目将指向 vDSO。

我的问题是,为什么我不能使用/proc/self/maps 中显示的地址访问 vDSO?结果不应该一样吗?我尝试以多种方式使用这些地址访问 vDSO,但我总是得到错误的内存区域。我使用的是 x86_64 位。

例如,我不明白为什么使用 dd 转储该内存区域在 64 位操作系统上不起作用,而在 32 位操作系统上似乎可以。有什么想法吗?

dd if=/prcc/self/mem of=vDSO.bin count=1 bs=4096 skip=0xffffffffff600000

我知道我不能使用十六进制偏移量,我这样写是因为它更易读。

最佳答案

最近,对于 Android,有人报告了我们的一台设备上针对我们的 vdso 的失败测试用例。奇怪的是,本地内核构建无法重现该问题(其中 vdso.so 是内核构建过程的输出),因此我需要从实时设备上提取它的副本。

为了将 vdso 从正在运行的设备中拉出来,您需要知道它映射到哪里以及它有多大。此信息由 /proc/<pid>/maps 提供来自长时间运行的进程(例如,pid 1,init)。例如:

$ adb root
$ adb shell cat /proc/1/maps | grep vdso
7fa6403000-7fa6405000 r-xp 00000000 00:00 0 [vdso]

所以这告诉我们 vdso 是 8192 字节(0x7fa6405000 - 0x7fa6403000 == 0x2000 == 8192)从 0x7fa6403000 开始。 0x2000 不是 0x7fa6403000 的倍数(0x0.8 的余数 == 0.5),因此我们使用 4096(0x1000)(大小的一半)作为 block 大小,加倍计数,并跳过 block 大小的 133850115 倍数(133850115 * 4096 == 548250071040 == 0x7FA6403000) .

$ adb shell dd if=/proc/1/mem of=/data/local/tmp/vdso.so bs=4096 count=2 skip=133850115
2+0 records in
2+0 records out
8192 bytes (8.0 K) copied, 0.000442 s, 18 M/s
$ adb shell ls -l /data/local/tmp
-rw-rw-rw- 1 root root 8192 2019-02-20 23:51 vdso.so
$ adb pull /data/local/tmp/vdso.so
/data/local/tmp/vdso.so: 1 file pulled. 3.2 MB/s (8192 bytes in 0.002s)
$ file vdso.so
vdso.so: ELF 64-bit LSB shared object ARM aarch64, version 1 (SYSV), dynamically linked, stripped
$ readelf -s vdso.so

Symbol table '.dynsym' contains 8 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000000002e8 0 SECTION LOCAL DEFAULT 6
2: 0000000000000000 0 OBJECT GLOBAL DEFAULT ABS LINUX_2.6.39
3: 00000000000007dc 108 FUNC GLOBAL DEFAULT 7
__kernel_clock_getres@@LINUX_2.6.39
4: 00000000000008c0 8 FUNC GLOBAL DEFAULT 7
__kernel_rt_sigreturn@@LINUX_2.6.39
5: 00000000000006e4 248 FUNC GLOBAL DEFAULT 7
__kernel_gettimeofday@@LINUX_2.6.39
6: 0000000000000848 96 FUNC GLOBAL DEFAULT 7
__kernel_time@@LINUX_2.6.39
7: 0000000000000300 996 FUNC GLOBAL DEFAULT 7
__kernel_clock_gettime@@LINUX_2.6.39

关于c - 访问 vDSOlinux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17157820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com