首页
社区
课程
招聘
[求助]so文件新加了一个section段后无法运行
发表于: 2017-11-1 17:38 5735

[求助]so文件新加了一个section段后无法运行

2017-11-1 17:38
5735
so文件新加入section后,把so放到Android代码里面执行报错,错误如下:
Process: com.jack.elftype, PID: 2893
 java.lang.UnsatisfiedLinkError: dlopen failed: invalid ELF file "/data/app/com.jack.elftype-1/lib/arm/libhello-jnis.so" load segment[1]: p_offset (0x0) + p_filesz (0x53f8) ( = 0x53f8) past end of file (0x53f8)

加入的section字段通过ida工具都可以找到,加入的字段(5000H ~ 53f8H)如下:

期间我也新增了一个section header指向这个section,修改了第一个p_type = PT_LOAD的program header,并把这个program header里面的p_filesz和p_memsz改为了53 f8,而运行时报错也是关于53f8的偏移错误,所有怀疑是这个问题;但是不知道如何修改;请问各位大神,知道是哪个地方出错的吗?
附件有我修改之前和之后的so文件,libhello-jni.so是前  libhello-jnis.so是后


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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 161
活跃值: (231)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
 

错误如下:

  • section [16] '.bss' has type NOBITS but is read from the file in segment of program header entry 1

  • loadable segment [2] is writable but contains no writable sections

修改如下:

Section Headers:
[21] .jiangwei         PROGBITS           00005010 005010 0003e8 00   A  0   0  4 修改节属性为WA

Program Headers:
LOAD           0x002eb8 0x00003eb8 0x00003eb8 0x0014c 0x0014c RW  0x1000

section数据与segment对不上,修改:

LOAD           0x000000 0x00000000 0x00000000 0x053f8 0x053f8 RWE 0x1000

修改这个segment的各项0x00000000数据与新加入的section相一致!

 

因为我没有测试环境,楼主自己修改下试试!

2017-11-1 20:23
0
雪    币: 210
活跃值: (651)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
zhao  si
2017-11-1 21:26
0
雪    币: 19
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
按照你说的方式,我把section header改为这样就可以了;

WA表示是:进程在执行过程中这个segment可写入数据并且可占用空间;改变之前只有一个A属性;加了W就可以了;但是我想不通为什么错误是这个地方,报的错误是past end of file 0x53f8;为什么错误确实这里呢?
2017-11-2 10:46
0
雪    币: 19
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
采臣·宁 错误如下: * section [16] '.bss' has type NOBITS but is read from the file in segment of program header ...
看上一楼
2017-11-2 10:47
0
雪    币: 161
活跃值: (231)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6



jackzhous

按照你说的方式,我把section header改为这样就可以了;WA表示是:进程在执行过程中这个segment可写入数据并且可占用空间;改变之前只有一个A属性;加了W就可以了;但是我想不通为什么错误 ...
在linux上面,section的信息在运行时并不需要,我没研究过android系统的加载器,不知道android的elf加载是否需要section信息。但我觉得你增加的segment地址有问题,不够完美,看上面我说的第二项修改。错误为什么会出现,只有看android的源代码了
2017-11-2 10:58
0
雪    币: 19
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
采臣·宁 jackzhous 按照你说的方式,我把section header改为这样就可以了;WA表示是:进程在执行过程中这个segment可写入数据并且可占用空间; ...
再请教你一个问题呢,像这种给so文件添加新的section段,应该添加到哪里呢?我觉得添加到原so文件末尾并且添加点事0x1000的整数倍就行,并且这个section的长度也应该事0x1000的整数倍才行,但是我自己尝试啦一把发现这种想法行不通;想了许久不知道添加在哪里
2017-11-2 21:40
0
雪    币: 19
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
采臣·宁 jackzhous 按照你说的方式,我把section header改为这样就可以了;WA表示是:进程在执行过程中这个segment可写入数据并且可占用空间; ...
我知道要根据program header的type为LOAD的header操作,用vaddr+memsiz和align这三个属性运算;两种情况:1. 前者大于后者就求余在加一个数,最后这个计算结果就行 2. 前者小于后者的情况我不知道怎么处理;我这个so文件比较特殊不知道应该把section加到哪里

但是我的整个so文件大小是这么长
2017-11-2 23:00
0
雪    币: 185
活跃值: (486)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我按你4楼的方法修改了还是报一楼的错误,求指教!
2018-2-7 12:13
0
雪    币: 3581
活跃值: (719)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
今天遇见了和楼主相同的问题,看了一下源码:
最后加载的类型为PT_LOAD的segment端的结束地址大于等于文件的大小就出发该错误(invalid ELF file),所以我就取了巧,解决方案是增大文件加一些无用字节,就不会在提示错误了。网上说这是6.0的一个漏洞,后续的版本已经修复了。
2019-10-25 12:06
0
游客
登录 | 注册 方可回帖
返回
//