一步一步走进Linux HOOK API(五)
这一讲中,我们不在继续进入研究动态符号表的获取了,今天咱们来点实战的话题,对于前面我们研究的那么多知识,做一次总结.来看看这些节表之间是怎么联系起来的.最后我们将经过一个简单的拦截printf函数,修改它的参数,来输出我指定的字符串,这样就达到简单的hook api的目的.好了废话不多说.先看看main.c里面的代码.
#include <stdio.h>
#include <fcntl.h>
int main()
{
while(1)
{
getchar();
printf("hello");
fflush(stdout);
}
return 0;
}
这段代码很简单,敲一个回车就输出一个hello,我们的目的就是实现,敲一个hello让他输出我们指定的字符串.
首先先运行这个main程序.在另一个终端里面输入ps -a 查看main 的进程ID.一会我们用GDB手动修改的时候要attach 连接他的进程 ID.
$ ps -a
PID TTY TIME CMD
2068 pts/0 00:00:00 sudo
2069 pts/0 00:00:00 su
2077 pts/0 00:00:00 bash
2174 pts/0 00:00:00 dbus-launch
4803 pts/2 00:00:00 sudo
4805 pts/2 00:00:00 su
4813 pts/2 00:00:00 bash
5282 pts/1 00:00:00 linux_server
5774 pts/2 00:00:00 man
5784 pts/2 00:00:00 pager
6256 pts/4 00:00:00 sudo
6257 pts/4 00:00:00 su
6265 pts/4 00:00:00 bash
6275 pts/4 00:00:00 main
6276 pts/3 00:00:00 ps
这里是获取main 程序的进程空间的映射,找到未被使用的空间来写入我们指定的字符串,这里使用的指令是:
cat /proc/6275/maps
00258000-00274000 r-xp 00000000 08:01 918417 /lib/i386-linux-gnu/ld-2.13.so
00274000-00275000 r--p 0001b000 08:01 918417 /lib/i386-linux-gnu/ld-2.13.so
00275000-00276000 rw-p 0001c000 08:01 918417 /lib/i386-linux-gnu/ld-2.13.so
0058f000-00590000 r-xp 00000000 00:00 0 [vdso]
00cf6000-00e50000 r-xp 00000000 08:01 918430 /lib/i386-linux-gnu/libc-2.13.so
00e50000-00e51000 ---p 0015a000 08:01 918430 /lib