首页
社区
课程
招聘
[讨论]Linux下修改so动态库二进制中的函数名问题
发表于: 2019-11-25 22:10 5705

[讨论]Linux下修改so动态库二进制中的函数名问题

2019-11-25 22:10
5705
在X86平台的linux系统下,使用vi或sed强行编辑libxxx.so库的二进制文件,修改函数名(保持前后名称长度一致),如:
函数:method_abc   修改为:method_123
查找替换所有位置(一般是2个地方),保存so。

同时,修改该so的调用者test可执行程序,查找替换所有method_abc 为 method_123,保存test。

执行测试 ./test
结果系统报错:test: symbol lookup error: test: undefined symbol: method_123

此时使用 nm 或 readelf 查看 libxxx.so,都可以看到符号 method_123 显示正常。
我的问题是:为什么test无法调用lib中的rename后的方法?难道so有校验和机制?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 5141
活跃值: (12103)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
不太清楚,但试了一下确实是这样,可能nm只是遍历符号表,而动态ld为了提高查找速度,要先经过hash表缩小一下范围,所以可能要相应改一下hash节区,或者用一个跟method_abc可以算出相同hash值的名字吧
2019-11-25 23:21
0
雪    币: 91
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
xinpoo 不太清楚,但试了一下确实是这样,可能nm只是遍历符号表,而动态ld为了提高查找速度,要先经过hash表缩小一下范围,所以可能要相应改一下hash节区,或者用一个跟method_abc可以算出相同has ...
多谢。是的,so确实是有校验和的机制啊。
2019-11-26 20:13
0
雪    币: 91
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
xinpoo 不太清楚,但试了一下确实是这样,可能nm只是遍历符号表,而动态ld为了提高查找速度,要先经过hash表缩小一下范围,所以可能要相应改一下hash节区,或者用一个跟method_abc可以算出相同has ...
ELF格式可执行文件,更改符号名称要注意,由于linker加载的时候是根据elfhash查找的名字,所以还要改hash段。
首先找到符号表段,然后根据符号表的name找到名字。然后更改。
但是这还没完,由于linker加载的时候是根据elfhash查找的名字,所以还要改hash段。

更改方法:
首先根据字符串节的偏移,对比符号表,找到这个符号在符号表中的偏移。每个符号表是0x10个字节,这个要注意。
然后用如下函数算出你更改名字后的hash。

详细内容请参考这个帖子:
cb1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8X3N6^5k6q4)9#2k6U0f1H3y4W2)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3V1k6V1k6i4c8S2K9h3I4K6i4K6u0r3x3K6R3^5y4o6x3#2y4U0M7`.
2019-11-26 20:15
0
游客
登录 | 注册 方可回帖
返回