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

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

2019-11-25 22:10
4610
在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有校验和机制?


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

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

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

详细内容请参考这个帖子:
https://blog.csdn.net/gxd_506/article/details/38843567
游客
登录 | 注册 方可回帖
返回