库插入 nanosleep
Library interposition nanosleep
我正在尝试使用 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));
}
工具 strace 仅显示通过 userspace/os-boundary 的调用。所以,如果你看到这样一行
nanosleep({1, 0}, 0x7ffd50e5acf0) = 0
您正在拦截调用的程序可能直接调用了 glibc 函数 nanosleep()
(这又导致系统调用 nanosleep()
)。在这种情况下,您的拦截应该按预期工作。
但也有可能,程序调用
sleep(1);
在这种情况下,glibc 函数 sleep()
(您所做的 而不是 拦截)调用 nanosleep()
-系统调用。所以在这种情况下你必须拦截对 sleep()
的调用。
工具 ltrace
可以帮助您找出您检查的程序调用了哪些库函数。
我找到了答案。为了能够捕获函数调用,我 运行 终端中的应用程序作为 root ......最重要的是,我正在使用 sudo,这就是问题所在。我删除了 sudo,现在我正在捕获所有函数调用......之前它非常有限并且每次结果都相同......
我正在尝试使用 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));
}
工具 strace 仅显示通过 userspace/os-boundary 的调用。所以,如果你看到这样一行
nanosleep({1, 0}, 0x7ffd50e5acf0) = 0
您正在拦截调用的程序可能直接调用了 glibc 函数 nanosleep()
(这又导致系统调用 nanosleep()
)。在这种情况下,您的拦截应该按预期工作。
但也有可能,程序调用
sleep(1);
在这种情况下,glibc 函数 sleep()
(您所做的 而不是 拦截)调用 nanosleep()
-系统调用。所以在这种情况下你必须拦截对 sleep()
的调用。
工具 ltrace
可以帮助您找出您检查的程序调用了哪些库函数。
我找到了答案。为了能够捕获函数调用,我 运行 终端中的应用程序作为 root ......最重要的是,我正在使用 sudo,这就是问题所在。我删除了 sudo,现在我正在捕获所有函数调用......之前它非常有限并且每次结果都相同......