Linux 如何从elf移动节条目?

Linux 如何从elf移动节条目?,linux,format,elf,Linux,Format,Elf,ELF格式: 0x00~0x33是文件头 节标题和段标题必须连续 节条目可以存储在任何位置,由偏移量指定 所以我想将一个节条目(.dynsym)移动到另一个位置,并且,仅针对ELF32 实用工具下载链接: 过程: 1.ModifyElf.exe 我编写了一个名为ModifyElf.exe的实用程序,它可以移动elf文件的一个节条目。用法: ModifyElf.exe args: ->src so文件路径 ->dst so文件路径 ->节名,当前仅支持“.dynsym” ->mov2fileen

ELF格式:

  • 0x00~0x33是文件头
  • 节标题和段标题必须连续
  • 节条目可以存储在任何位置,由偏移量指定

    所以我想将一个节条目(.dynsym)移动到另一个位置,并且,仅针对ELF32

    实用工具下载链接:

    过程:
    1.ModifyElf.exe
    我编写了一个名为ModifyElf.exe的实用程序,它可以移动elf文件的一个节条目。用法:
    ModifyElf.exe
    args:
    ->src so文件路径
    ->dst so文件路径
    ->节名,当前仅支持“.dynsym”
    ->mov2fileend:0将节项移动到so文件的未使用零区域,不要增加文件大小
    mov2fileend:1将节项移动到so文件的末尾,将增加文件大小
    ->clearold:0不清除原始节条目
    clearold:1将原始节条目的所有字节设置为0xFF
    例如:
    ModifyElf.exe e:\test\libfoo\u ori.so e:\test\libfoo.so.dynsym mov2fileend:0 clearold:1
    2.libfoo.so和linux_你好
    linux_hello调用dlopen加载libfoo.so,并从libfoo.so调用myfn,myfn只是打印一个字符串
    neil0@vm32:~/share/test$sudo chmod a+x linux\u您好
    neil0@vm32:~/share/test$export LD\u LIBRARY\u PATH=~/share/test:$LD\u LIBRARY\u PATH
    neil0@vm32:~/share/test$。/linux\u您好
    打开好!
    给我打电话。。。!
    3.修改并执行
    运行ModifyElf.exe e:\test\libfoo\u ori.so e:\test\libfoo.so.dynsym mov2fileend:0 clearold:1
    将节项移动到零区域,获取一个新的so文件,在linux中替换它,然后执行linux_您好,没问题!您可以使用文件比较工具查看libfoo.so和libfoo_ori.so之间的差异
    运行ModifyElf.exe e:\test\libfoo\u ori.so e:\test\libfoo.so.dynsym mov2fileend:1 clearold:1
    将节条目移动到文件末尾,获取一个新的so文件,在linux中替换它,然后执行linux\u您好,它说的是“分段错误”
    

    所以你们能告诉我为什么我不能把它移到文件的末尾,如果我想这样做,我该怎么做?谢谢

    你能更具体地说明你想做什么吗?“移到另一个位置”是什么意思?典型的ELF文件是可重新定位的,因此您(通常)无法控制它们在地址空间中的位置。也许你想把它移到文件中的另一个位置?我不明白你为什么把这个工具的文档粘贴在这里,这没有帮助。请解释您的问题,而不是您认为的解决方案。该工具的用途是:自动移动数据。是的,我想将节条目移动到文件中的另一个位置,通过将数据移动到文件的零区域,我成功地做到了这一点,确定了。然而,当我用同样的方法将它移动到文件末尾时,它显示为“分段错误”,我想解决它。这仍然不能解释你的问题是什么。为什么要重新链接ELF文件?为什么是.dynsym部分?什么是“文件的零区域”?我的最终目的是向二进制.so文件添加一个库。因此,需要更改某些节条目数据(添加库字符串等…)和相关偏移量。但是,原始节数据之后没有填充空格,所以我必须将其移动到另一个位置。有两种选择:移动到填充空间(零区域),或移动到文件结尾(增加文件大小)。我用第一种方法成功地做到了(只是移动,没有改变),但第二种方法失败了。除了不同的位置,操作似乎都是一样的。我想知道怎么用第二种方法做,谢谢,我担心是这样的。符号偏移不是唯一的问题。你正在尝试重新链接一个库,这是一个很深的巫毒问题。除此之外,正确的解决方案将取决于体系结构。别这样。
    The Process:
    1. ModifyElf.exe
       I write a utility called ModifyElf.exe, it can move a section entry of elf file. Usage:
       ModifyElf.exe <srcfile> <dstfile> <sectionname> <mov2fileend:0|1> <clearold:0|1>
       args:
       <srcfile>         ->  src so file path
       <dstfile>         ->  dst so file path
       <sectionname>     ->  section name, just support ".dynsym " currently
       <mov2fileend:0|1> ->  mov2fileend:0 move section entry to the unused zero zone of so file, don't increase file size
                             mov2fileend:1 move section entry to the end of so file,will increase file size
       <clearold:0|1>    ->  clearold:0 don't clear the original section entry
                             clearold:1 set all bytes of original section entry to 0xFF
    
       for example:
       ModifyElf.exe e:\test\libfoo_ori.so e:\test\libfoo.so .dynsym mov2fileend:0 clearold:1
    
    2. libfoo.so and linux_hello
       linux_hello call dlopen to load libfoo.so,and call myfn from libfoo.so, myfn just printf a string
    
       neil0@vm32:~/share/test$ sudo chmod a+x linux_hello 
       neil0@vm32:~/share/test$ export LD_LIBRARY_PATH=~/share/test:$LD_LIBRARY_PATH
       neil0@vm32:~/share/test$ ./linux_hello 
       dlopen ok!
       call myfn...!
    
    3. modify and exec
       run ModifyElf.exe e:\test\libfoo_ori.so e:\test\libfoo.so .dynsym mov2fileend:0 clearold:1
       move section entry to zero zone, get a new so file, replace it in linux,and exec linux_hello, it's OK!You can use file compare tool to see diff between libfoo.so and libfoo_ori.so
    
       run ModifyElf.exe e:\test\libfoo_ori.so e:\test\libfoo.so .dynsym mov2fileend:1 clearold:1
       move section entry to file end,get a new so file, replace it in linux,and exec linux_hello, it's said "Segmentation fault"