动态链接后ELF中的Section Name

背景

在So动态链接后,读取ELF文件,发现无法读取Section Header中的名称列表。即,无法在EShdr中根据e_shstrndx找到Section对应的名字。

可是在readelf -a lib.so中,可以根据Section Header读取到Section对应的名称。

Section Header String Table Index

而读取出来的结果如下:


Section Header

其中,shstrtabstrtab的类型都是STRTAB,但是shstrtab仅仅只保存Section Name的字符串表,而strtab则包括其他的变量名、符号名等的字符串表。

问题

  • 为什么在运行时无法通过Section Header中的sh_name来找到对应的名称?

    Section Header的

  • 为什么要分为strtabshstrtab两个字符串表?

原因

从运行时的日志来看

  • 根据ELF头中的e_shoff找到ELF_SHDR
    • libart.so加载后的位置在753042b000-7530a14000
    • 加载后的基址为:753042b000PHDR的地址为:753042b040
    • 计算得到的SHDR的地址为7530b55520

运行日志:

libs line :753042b000-7530a14000 r-xp 00000000 fd:00 3439 /system/lib64/libart.so
base_addr:753042b000   PHDR :753042b040   shdr_offset:72a520
SHDR :7530b55520  shstr:7530b55ba0

运行时日志是通过/proc/self/maps中获取libart.so得到的基址,与上面通过readelf读取的ELF文件并不是同一个!该日志的基址和偏移量与上面的图无关。

运行后的结果可知:
通过e_shoff所计算的出来的SHDR的地址已经超出So加载的地址了。

SHDR- libart.so的页结束地址 = 7530b55520 - 7530a14000 = 141520

而在运行时候的动态链接是根据Segment来加载So中的文件,原因是希望尽可能小的使用内存页面,并且提升加载速度。

ELF链接与执行时视图

于是查看程序头部分,发现LOAD类型的段中,仅仅只有.dynstr这个字符串表会被加载到内存中。

程序头

也就是说:

在So动态链接到内存中时,.shstrtab.strtab这两个Table是并没有加载到内存中的。ld仅仅只会加载.dynstr这个Table就够用了。

并且从执行视图来看,ELF也不一定会有Section Header Table。

而且单个Section可能属于多个Segment

  • 例如got这个Section就属于LOAD以及GNU_RELRO这两个Segment

从IDA Pro打开的角度来看

从Section Headers中可以看到:

  • strtaboffset395ac,大小为170c
  • shstrtaboffset3acb8,并且大小为194

可以看到strtab之后紧接着就是shstrtab
395ac+170c = 3acb8

打开IDA Pro可以看到在文件的395ac处就是strtab的字符串表:

strtab

而在文件的3acb8处,可以看到是Section Header Name的字符串:

shstrtab

结论

shstrtabstrtab这两个表仅仅只是链接后保存在So文件中的,而在链接之后的执行视图层面,这两个字符串表不会被加载到内存中。

readelf这个程序中,会在文件中根据shstrtab表的偏移量来查找Section对应的名称,然后输出文案。

并且,在执行视图中,可能没有SHDR,所以在链接完的文件中可以根据SHDR中的偏移量来找到对应的名字,而在加载到内存之后的执行视图中,不能按照SHDR来查找Section的名字了。

后记

Android GOT Hook该文中,则是通过对GOT表进行Hook,而查找GOT表的方式则是通过Section Header以及shstr来找到对应的Got表的偏移地址。

而在本人测试的过程中发现这方案在Runtime时并不可行,在动态链接后,Section Header有可能不会加载,因为Section Header的加载可有可无,可能有些ROM会加载,有些ROM不会加载。

ELF中可以被修改又不影响执行的区域该文中,本人比较认同。因为Program Header已经将需要加载的Section都决定了,Section Header只是为了readelf这种方便读取ELF文件而存在。减少加载也可以减少内存以及文件映射所带来的损耗。

所以对于Got表的偏移量可以在静态的时候,通过readelf来读取Got表的偏移量,在Runtime的时候,通过基址加偏移量来获取Got表的地址。Android下的GOT表Hook实现这篇文章描述了3中Got表Hook的方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容