从 ELF 二进制文件中删除部分的脚本
Posted
技术标签:
【中文标题】从 ELF 二进制文件中删除部分的脚本【英文标题】:Script to strip sections from ELF binaries 【发布时间】:2016-04-28 23:44:30 【问题描述】:我需要对目录中的每个文件运行以下两个命令:
A) 第一个命令:
readelf -aW A_FILE | grep Machine
其中A_FILE
是特定文件的名称。
第一个命令的输出如下所示:
Machine: <unknown>: 0xXXX
0xXXX
是一些十六进制数字。
B) 第二条命令
objcopy -I elf64-x86-64 -O elf64-x86-64 -R .source -R .llvmir -R .amdil --alt-machine-code=<Machine> A_FILE A_FILE.STRIPPED
其中<Machine>
是来自第一个命令的十六进制数字,A_FILE.STRIPPED
是来自objcopy
的输出文件的名称。 (STRIPPED
是任意的,可以是任何一段文字)
【问题讨论】:
应该将0x
包含在第二个命令中,还是只包含后面的十六进制数字?
...我还尝试将问题标题更新为少一点“为我写这个!”并表示脚本实际上做了什么,因为它所做的事情是与开发工具相关的,因此是主题性的。 :)
非常感谢,查尔斯。是的,0x
应该包含在第二个命令中。
好交易;包括0x
是它已经做的。顺便说一句——如果你对我建议的脚本有任何问题,你能把通过bash -x scriptname
运行它的输出粘贴到没有广告的地方吗? gist.github.com、ix.io 或类似的都可以。
当然。现在正在调试。 m_line 似乎是空的。
【参考方案1】:
#!/bin/bash
# ^^^^- important, not /bin/sh
# define a regex, in ERE form, to extract the content you want in a match group
re='machine.*(0x[[:xdigit:]]2,) '
# iterate over files, putting each in $f
for f in *; do
# don't operate on files we previously generated
[[ $f = *.stripped ]] && continue
# actually run readelf, taking first matching line
m_line=$(readelf -aW "$f" | egrep -m 1 "$re")
[[ $m_line =~ $re ]] || continue # check whether we match the regex
# if we get here, the regex matched; copy the first match group into a variable
code=$BASH_REMATCH[1]
# ...and use that variable in calling objcopy
objcopy -I elf64-x86-64 -O elf64-x86-64 -R .source -R .llvmir -R .amdil \
--alt-machine-code="$code" \
"$f" "$f.stripped"
done
【讨论】:
完美!再次感谢。以上是关于从 ELF 二进制文件中删除部分的脚本的主要内容,如果未能解决你的问题,请参考以下文章