我正在尝试对一些软件进行逆向工程,以更好地了解操作系统的较低级别工作原理。我想用 objdump -t 中的相应值替换 objdump -d 中的原始地址转储,即使是 -Dslx 选项似乎也错过了。
objdump -t 的输出如下所示:
00000000 l d .bss 00000000 .bss
00000000 g .text 00000000 fred
并且我能够在索引 1 和 NF 中使用 awk 提取所需的信息(我使用的实际代码在另一台计算机上)。对于每条记录,我将字段放入一个数组中:
fields[$1] = $NF
从这里我有点迷茫。我想使用这些条目将所有出现的"位置"替换为
fields[location]
此时,我只是打印出接下来要使用的 sed 命令,然后手动复制并粘贴该命令并执行它。 它看起来像
objdump -d test.o | sed -e 's/<loc1>/<name1>/g'
-e 's/<loc2>/<name2>/g'
. . .
-e 's/<locN>/<nameN>/g'
我真的不喜欢这个,我想完全自动化这个。我对一些 Bash 技巧相对缺乏经验,所以很可能有一个我从未听说过的简单解决方案。
示例:(此时我无法访问实际输入,但这足以实现我的目标)
00000000 g O .bbs 00000010 size
00000012 g O .bbs 00000004 count
00000200 l F .bbs 00000020 anotherVar
+
0x0000030 <main>:
0x00000034 xx xx mov 0x00000000, %eax
0x00000038 xx push 0x00000012
0x0000004c xx xx xx subl 0x00000200, %ebx
=
0x0000030 <main>:
0x00000034 xx xx mov size, %eax
0x00000038 xx push count
0x0000004c xx xx xx subl anotherVar, %ebx
对于您的问题,可能有一个比这里给出的更复杂的答案(例如,使用单个awk,python或perl程序完成整个过程),但是在该答案出现之前,您可以使用eval
自动化当前过程,如下所示。
您说您正在"打印出接下来要使用的 sed 命令,然后手动复制并粘贴命令并执行它"。 假设 XYZ 是生成和打印 sed 命令的管道。 不要使用 XYZ 打印/复制/粘贴,而是使用它来创建要执行的 sed 命令,然后使用eval
执行命令:
SEDCOM=$(XYZ)
eval $SEDCOM
举个例子:如果我们说t="echo do do do; echo da da da"
$t
则结果输出是do do do; echo da da da
但如果我们说eval $t
输出是do do do
da da da