如何获取当前进程在内存中的起始地址?

发布于 2022-10-15 07:29:40 字数 83 浏览 23 评论 0

各位,如何获取当前进程在内存中的起始地址?我在看ELF格式,想试着修改一下当前进程的一些信息,但是需要知道当前进程的虚拟起始地址,找了一下没有找到相关的资料。。。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

懵少女 2022-10-22 07:29:40

时隔几年  我也有这个需求了 楼主你解决了吗?

属性 2022-10-22 07:29:40

回复 2# socay2
我一般是这样找的:
readelf -h file能看到type。
当type为EXEC时,
readelf -l file能看到程序头,用第一段的虚拟地址减去Program Headers的偏移应当就是加载地址。

   

晨光如昨 2022-10-22 07:29:40

回复 3# 井蛙夏虫

readelf 这个命令好
得好好研究下它查询出来的一些信息,不是很理解

  1. readelf -h a.out
  2. ELF Header:
  3.   Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  4.   Class:                             ELF32
  5.   Data:                              2's complement, little endian
  6.   Version:                           1 (current)
  7.   OS/ABI:                            UNIX - System V
  8.   ABI Version:                       0
  9.   Type:                              EXEC (Executable file)
  10.   Machine:                           Intel 80386
  11.   Version:                           0x1
  12.   Entry point address:               0x8048650
  13.   Start of program headers:          52 (bytes into file)
  14.   Start of section headers:          4476 (bytes into file)
  15.   Flags:                             0x0
  16.   Size of this header:               52 (bytes)
  17.   Size of program headers:           32 (bytes)
  18.   Number of program headers:         9
  19.   Size of section headers:           40 (bytes)
  20.   Number of section headers:         30
  21.   Section header string table index: 27

复制代码

  1. readelf -l a.out
  2. Elf file type is EXEC (Executable file)
  3. Entry point 0x8048650
  4. There are 9 program headers, starting at offset 52
  5. Program Headers:
  6.   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  7.   PHDR           0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4
  8.   INTERP         0x000154 0x08048154 0x08048154 0x00013 0x00013 R   0x1
  9.       [Requesting program interpreter: /lib/ld-linux.so.2]
  10.   LOAD           0x000000 0x08048000 0x08048000 0x00be4 0x00be4 R E 0x1000
  11.   LOAD           0x000f14 0x08049f14 0x08049f14 0x00140 0x0014c RW  0x1000
  12.   DYNAMIC        0x000f28 0x08049f28 0x08049f28 0x000c8 0x000c8 RW  0x4
  13.   NOTE           0x000168 0x08048168 0x08048168 0x00044 0x00044 R   0x4
  14.   GNU_EH_FRAME   0x000ac4 0x08048ac4 0x08048ac4 0x0003c 0x0003c R   0x4
  15.   GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4
  16.   GNU_RELRO      0x000f14 0x08049f14 0x08049f14 0x000ec 0x000ec R   0x1
  17. Section to Segment mapping:
  18.   Segment Sections...
  19.    00     
  20.    01     .interp
  21.    02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
  22.    03     .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
  23.    04     .dynamic
  24.    05     .note.ABI-tag .note.gnu.build-id
  25.    06     .eh_frame_hdr
  26.    07     
  27.    08     .ctors .dtors .jcr .dynamic .got

复制代码

桃扇骨 2022-10-22 07:29:40

回复 4# socay2

  1. Type:                              EXEC (Executable file)
  2. Elf file type is EXEC (Executable file)

复制代码上面两句都可以看出这个文件是可执行文件

  1. There are 9 program headers, starting at offset 52

复制代码可以看出偏移为52字节

  1. Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  2.   PHDR           0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4

复制代码可以看出该段的虚拟地址为0x08048034。
两种相减就得到程序加载地址为0x08048000

   

椒妓 2022-10-22 07:29:40

socay2 发表于 2013-12-13 17:39:43
时隔几年  我也有这个需求了 楼主你解决了吗?

提供一个自己用过的方案。
用命令 objdump xxx.doc a.out把编译的东西拿出来直接就能看。具体命令格式你可以搜一搜。

旧话新听 2022-10-22 07:29:40

继续学习  谢谢楼上的两位兄台

殤城〤 2022-10-22 07:29:40

socay2 发表于 2013-12-15 00:15:29
继续学习  谢谢楼上的两位兄台

做csapp拆弹实验时候用过。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文