c - 寻找进程的集合点(struct r_debug)结构?
问题描述
我正在尝试访问“集合结构”(struct r_debug *)以查找进程的链接映射。但是我一直遇到无效的地址,我真的不知道发生了什么。
这是我继续尝试找到它的方法:
1. Get the AT_PHDR value from the auxiliary vector
2. Go through the program headers until I find the PT_DYNAMIC segment
3. Try to access the vaddr of that segment (PT_DYNAMIC) to get the dynamic tags
4. Iterate through the dynamic tags until I find DT_DEBUG. If I get here I should be done
问题是我无法通过第 3 步,因为 PT_DYNAMIC 段的 vaddr 始终指向无效地址。
我究竟做错了什么 ?我需要找到 vaddr 的搬迁吗?我查看了 LLDB 来源,但我无法弄清楚他们是如何获得地址的。
更新:@EmployedRussian 是对的,我正在查看与位置无关的可执行文件。他计算搬迁的解决方案非常有效。
解决方案
我究竟做错了什么 ?
您很可能正在查看与位置无关的可执行文件。如果你readelf -Wl a.out
看起来像这样:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000040 0x0000000000000040 0x0000000000000040 0x0001f8 0x0001f8 R 0x8
INTERP 0x000238 0x0000000000000238 0x0000000000000238 0x00001c 0x00001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x016d28 0x016d28 R E 0x200000
LOAD 0x017250 0x0000000000217250 0x0000000000217250 0x0010d0 0x001290 RW 0x200000
DYNAMIC 0x017df8 0x0000000000217df8 0x0000000000217df8 0x0001e0 0x0001e0 RW 0x8
然后你需要Phdr_pt_dynamic.p_vaddr
通过可执行重定位地址来调整(关键是第一个Phdr_pt_load.p_vaddr == 0
)。
您可以将此重定位地址作为AT_PHDR
辅助向量中的值与Phdr_pt_phdr.p_vaddr
.
(上面我Phdr_xxx
用作Phdr[j]
with的简写.p_type == xxx
)。
您还以比您必须做的更复杂的方式进行操作:动态数组的地址可以作为_DYNAMIC[]
. 看到这个答案。
推荐阅读
- java - How to convert a number to its ordinal word in java
- javascript - How can i locate my login at center of the page, if my HTML body does not take whole space. Angular 8
- python - Detect specific return type of C# function python.net
- javascript - Can you have complete coverage when using the pure component pattern to test Gatsby's static queries?
- python - Königsberg Bridges using Networkx
- algorithm - How do I sign a curve25519 key in golang?
- javascript - 基本 JavaScript - 斐波那契数列生成器不工作
- php - After php artisan route:cache my routes stopped working because I have Closure based routes
- mysql - MySQL many to many table convention
- c# - 如何使用 C# 任务库下载和处理一系列数据