我是ELF二进制保护的新手。
我想剥离节头表以避免调试。
我试图通过运行readelf -h找到磁盘上的节头表偏移量,并尝试nop它们,但它们都是0。
我怎样才能剥离节头表?
先谢谢你。
首先,你可以用以下方法检查你的elf中存在哪些节。readelf --section-headers
. 你应该看到这样的东西。
$ readelf --section-headers <your-file>
[ #] Name Type Address Offset
Size Size.Ent Flags - - Alignment
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .data PROGBITS 00000000006000b0 000000b0
000000000000003b 0000000000000000 WA 0 0 1
[ 2] .text PROGBITS 0000000000a000f0 000000f0
00000000000003e9 0000000000000000 AX 0 0 1
[ 3] .shstrtab STRTAB 0000000000000000 000004d9
0000000000000027 0000000000000000 0 0 1
[ 4] .symtab SYMTAB 0000000000000000 00000680
0000000000000438 0000000000000018 5 41 8
[ 5] .strtab STRTAB 0000000000000000 00000ab8
0000000000000258 0000000000000000 0 0 1
你应该意识到大部分的部分都是由链接器添加的,因为在你的二进制中你唯一需要的真正的部分是: .text
和 .data
. 如果你手动进行联动,其他大部分信息都可以省略。
如果您使用的是经典的 ld
链接器,我建议你试试以下选项 --strip-all
和 --strip-debug
. 顾名思义,它们从二进制中删除了调试信息和其他符号信息--。此处 你可以看到文档。
$ readelf --section-headers <your-file>
[ #] Name Type Address Offset
Size Size.Ent Flags - - Alignment
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .data PROGBITS 00000000006000b0 000000b0
000000000000003b 0000000000000000 WA 0 0 1
[ 2] .text PROGBITS 0000000000a000f0 000000f0
00000000000003e9 0000000000000000 AX 0 0 1
[ 3] .shstrtab STRTAB 0000000000000000 000004d9
0000000000000017 0000000000000000 0 0 1
但现在你可能应该只有3个部分,而且由于大部分数据已经被省略,你可以在这一点上停止--现在你的 .shstrtab
只包含文本和数据部分的名称--这并不是什么秘密 :)
现在这真的取决于你准备到什么程度。
如果你想继续,我建议你试试另一个工具,叫做 strip
(来自binutils),你可以像这样使用。strip --remove-section=shstrtab <your-file>
- 它基本上可以删除不需要的部分,但它并不是那么容易删除的 .shstrtab
因为我记得使用它。
你甚至可以尝试自己删除它--因为你知道部分的确切偏移量(而且它可能在文件的最后),你可以在它上面放置零,也就是 "重命名 "部分为空:)
根据ELF的规范,shstrtab不是执行所需的,所以即使你手动从文件中删除它(删除这些字节)也应该是OK的--只要保持其他指针、偏移量等有效就可以了
在我的情况下,删除调试信息是确定的,所以我没有走那么远,但你可以 - 我只是希望你运气好:)