我在使用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命令的语法。但是,我现在还不知道如何修复它。提前感谢您的帮助。
P.S。以下是myLKM.c文件的内容:
unsigned long *sys_call_table;
sys_call_table = (unsigned long *)myTABLE;
答案 0 :(得分:1)
首先,不要使用sudo
来运行它。它并没有神奇地使事情发挥作用。如果您需要root权限来编辑正在处理的源代码,那么您的开发设置就会出现严重问题。
如果您希望在其中展开内容,请使用双引号。 e.g。
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的地址可能会被破坏。
答案 1 :(得分:0)
你必须逃避引号
sed -i 's/myTABLE/'$TABLE'/g' my_LKM.c
显然首先尝试不到位(删除-i
)