我很难用 bash 文件中的变量内容替换 c 程序文件中的字符串。思路是复制Linux内核sys_call_table的地址,然后在我的C程序中使用它来拦截系统调用。我在网上找到了几个例子,但到目前为止,没有一个对我有用。因此,我们将不胜感激任何帮助。
这是我的 bash 文件“bashFile.sh”的内容
TABLE=$(grep sys_call_table /boot/System.map-$(uname -r) |awk '{print $1}')
sed -i "s/myTABLE/{$TABLE}/g" my_LKM.c
当我运行“sudo sh bashFile.sh”命令时,没有任何反应。 C 文件中的字符串 myTable 不会被替换。但是,当我尝试以下变体时:
TABLE=$(grep sys_call_table /boot/System.map-$(uname -r) |awk '{print $1}')
sed -i 's/myTABLE/{$TABLE}/g' my_LKM.c
myTABLE 字符串被替换为 {$TABLE} 而不是变量 TABLE 的内容(sys_call_table 地址)。我尝试使用“echo $TABLE”进行调试以查看 TABLE 内容是否是 sys_call_table 的地址并且它有效。因此,我得出结论,问题可能出在 sed 命令的语法上。但是,我现在不知道如何修复它。预先感谢您的帮助。
附言以下是 myLKM.c 文件的内容:
unsigned long *sys_call_table;
sys_call_table = (unsigned long *)myTABLE;
最佳答案
首先,不要使用 sudo
来运行它。它不会神奇地使事情起作用。如果您需要 root 权限来编辑您正在处理的源代码,那么您的开发设置就会出现严重问题。
如果您希望内容在其中展开,请使用双引号。例如
TABLE=$(awk '/sys_call_table/ {print $1}' /boot/System.map-$(uname -r))
sed -i "s/myTABLE/${TABLE}UL/g" my_LKM.c
正如 karakfa 所建议的,请确保您首先在没有 -i
的情况下尝试此操作。不过,他的另一个建议是在不加引号的上下文中扩展 $TABLE
,而不是在双引号内,这很糟糕。您需要整个字符串成为同一个 sed
arg 的一部分,所以只结束单引号是不好的。
此外,我猜他将 {$TABLE}
误读为 ${TABLE}
,并简化为 $TABLE
。或者实际上,从您的问题的上下文来看,您似乎想要一个普通的数字常量,而不是用大括号括起来。所以你应该使用 $TABLE
。
实际上,您应该使用 ${TABLE}UL
所以它是一个无符号长整数文字。如果没有这些修饰符,不适合 low32 的地址可能会在应用转换为指针类型之前被破坏。
关于linux - 如何使用 "sed"Bash 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663218/