我试图在Linux中使用库插入来挂钩函数调用。我捕捉得非常好,但有些情况我不知道......其中一个案例是nanosleep()。我挂钩的二进制文件每隔一秒就使用这个函数来休眠线程...如果我使用任何其他工具如strace我可以挂钩调用而不会出现问题...我能错过什么?这是我在共享库中使用的定义...
int nanosleep (const struct timespec *rqtp, struct timespec *rmtp)
{
static int (*my_nanosleep)(const struct timespec *, struct timespec *) = NULL;
if (!my_nanosleep)
my_nanosleep = (int(*)(const struct timespec *, struct timespec *)) dlsym(RTLD_NEXT, "nanosleep");
printf("\n\n nanosleep() is called and hooked with my_nanosleep() \n\n");
FILE *f = fopen("/home/user/Desktop/Test.txt", "a");
if (f==NULL)
{
printf("error opening file\n");
exit(0);
}
char *text1 = "nanosleep()";
fprintf(f, "%s\n", text1);
fclose(f);
return(my_nanosleep(rqtp, rmtp));
}
答案 0 :(得分:0)
工具 strace 仅显示通过userspace / os-boundary的调用。所以,如果你看到像
这样的行 nanosleep({1, 0}, 0x7ffd50e5acf0) = 0
你正在拦截调用的程序可能直接调用了glibc-function nanosleep()
(这导致了系统调用nanosleep()
。在这种情况下,你的拦截应该按预期工作。
但也有可能,程序调用
sleep(1);
在这种情况下,glibc-function sleep()
(你做不拦截)调用nanosleep()
- 系统调用。因此,在这种情况下,您必须拦截对sleep()
的调用。
工具ltrace
可以帮助您找出您检查的程序所调用的库函数。
答案 1 :(得分:0)
我找到了答案。为了能够捕获函数调用,我在终端中运行应用程序作为根...最重要的是,我使用的是sudo,这就是问题所在。我删除了sudo,现在我正在捕获所有的函数调用......在它非常有限之前,结果每次都是相同的......