[已解决]ltrace到底能跟踪到那些函数的调用?

软件和网站开发以及相关技术探讨
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

[已解决]ltrace到底能跟踪到那些函数的调用?

#1

帖子 wxf » 2023-07-20 16:59

我想探测一个QT程序或者gtk程序在执行某个功能时到底依次调用了那些函数。可是用“ ltrace /usr/bin/xfce4-screenshooter ”或者 “ltrace /usr/bin/kylin-screenshot launcher ”这样的命令之后并没有看到输出。

这是为什么?
上次由 wxf 在 2023-08-15 18:31,总共编辑 1 次。
头像
astolia
论坛版主
帖子: 6454
注册时间: 2008-09-18 13:11

Re: ltrace到底能跟踪到那些函数的调用?

#2

帖子 astolia » 2023-07-28 10:19

建议先阅读一下man ltrace中关于-e参数的说明
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: ltrace到底能跟踪到那些函数的调用?

#3

帖子 wxf » 2023-08-10 10:18

astolia 写了: 2023-07-28 10:19 建议先阅读一下man ltrace中关于-e参数的说明
我看了写资料,也做了简单的实验,发现ltrace只能探测C语言库函数的调用,比如fopen malloc之类。没法探测xlib xcb gtk和其它库里函数的调用情况。-e只是能规定检测那个函数,并不能突破库的局限。

我本来是想知道QT截图时的函数调用栈,以便决定hook那个库的那个函数,现在看来没法实现了。
头像
astolia
论坛版主
帖子: 6454
注册时间: 2008-09-18 13:11

Re: ltrace到底能跟踪到那些函数的调用?

#4

帖子 astolia » 2023-08-10 12:11

wxf 写了: 2023-08-10 10:18 我看了写资料,也做了简单的实验,发现ltrace只能探测C语言库函数的调用,比如fopen malloc之类。没法探测xlib xcb gtk和其它库里函数的调用情况。
你试试加上个-x '*'参数?即使不用-x,光用-e都足够推翻你的结论了
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: ltrace到底能跟踪到那些函数的调用?

#5

帖子 wxf » 2023-08-10 15:25

astolia 写了: 2023-08-10 12:11
wxf 写了: 2023-08-10 10:18 我看了写资料,也做了简单的实验,发现ltrace只能探测C语言库函数的调用,比如fopen malloc之类。没法探测xlib xcb gtk和其它库里函数的调用情况。
你试试加上个-x '*'参数?即使不用-x,光用-e都足够推翻你的结论了
比如这样的代码:

代码: 全选

// gcc dockwindow.c -o dockwindow -lX11

#include <stdio.h>
#include <X11/Xlib.h>

int main(int argc, const char* argv[]) 
{
    Display* root;
    Window win;
    int screen;
    root = XOpenDisplay(NULL);
    screen = DefaultScreen(root);
    win = XCreateSimpleWindow(root,
        RootWindow(root, screen),
        10, 10,
        400, 600,
        0,
        BlackPixel(root, screen),
        WhitePixel(root, screen));

    XMapWindow(root, win);

    Atom win_type = XInternAtom(root, "_NET_WM_WINDOW_TYPE", False);
    long value = XInternAtom(root, "_NET_WM_WINDOW_TYPE_DOCK", False);
    XChangeProperty(root,  win, win_type, 4, 32, PropModeReplace,(unsigned char*)&value, 1);

    printf("Window created %lu\n", win);
    XEvent e;
    while (1) 
    {
        XNextEvent(root, &e);
        if (e.type == KeyPress)
        {
            break;
        }
    }
    XCloseDisplay(root);
    return 0;
}
我这样使用ltrace,想看到程序有没有调用xlib库的XMapWindow函数,可是没有看到输出

代码: 全选

$ ltrace -e XMapWindow  ./dockwindow
Window created 25165825
X connection to :0 broken (explicit kill or server shutdown).
+++ exited (status 1) +++
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: ltrace到底能跟踪到那些函数的调用?

#6

帖子 wxf » 2023-08-10 15:39

您了解QT截图功能的实现细节吗?我想hook函数,阻止qt程序截图,但不能使qt程序出错,可以给qt提供一个假图像。
但是试了很多函数,xlib里的 xcb里的,网上文章里截图代码用到的关键函数都hook过了,但还是拦截不到QT截图程序的截图动作。

不知道QT截图功能在内部到底是怎么实现的。

hook QT类的成员函数(比如 QScreen::GrabWindow)倒是可以,但是Qt又不是只有一个版本,hook so依赖的QT版本和截图程序依赖的版本可能不一样,注入进去的话,可能造成程序出错。

最好是找到Qt截图程序依赖的底层库的函数,hook之。所以我才想用ltrace 启动截图程序,点击截图,看有哪些函数名输出了
头像
astolia
论坛版主
帖子: 6454
注册时间: 2008-09-18 13:11

Re: ltrace到底能跟踪到那些函数的调用?

#7

帖子 astolia » 2023-08-10 21:37

wxf 写了: 2023-08-10 15:25 我这样使用ltrace,想看到程序有没有调用xlib库的XMapWindow函数,可是没有看到输出

代码: 全选

$ ltrace -e XMapWindow  ./dockwindow
Window created 25165825
X connection to :0 broken (explicit kill or server shutdown).
+++ exited (status 1) +++
研究了下,现在ubuntu上的gcc默认开启pie,用pie模式编译出来的需要把-e换成-x
或者你在编译时禁用pie,gcc -no-pie -fno-pie xxxx,就可以直接用ltrace不加其他参数
wxf 写了: 2023-08-10 15:39 不知道QT截图功能在内部到底是怎么实现的。
Qt代码是开源的,直接去看源码不就完事了 https://code.qt.io/cgit/qt/qtbase.git/t ... n.cpp#n685
在xcb后端的实现是 https://code.qt.io/cgit/qt/qtbase.git/t ... n.cpp#n997
在开源世界里你不去看源码自己瞎想干什么
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: ltrace到底能跟踪到那些函数的调用?

#8

帖子 wxf » 2023-08-11 10:06

之前看过QT源代码了,但是没看懂,完全没看到获取图像的代码,抽象得很。

不过你给的这个代码我没看过,我看看。好像是获取图像的代码
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: ltrace到底能跟踪到那些函数的调用?

#9

帖子 wxf » 2023-08-11 15:55

我知道为啥ltrace跟踪不到了/usr/bin/kylin-screenshot,是因为这个程序启动后又创建了子进程,自己退出了。。。。
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: ltrace到底能跟踪到那些函数的调用?

#10

帖子 wxf » 2023-08-13 12:59

看了那个源码,hook了其中一个函数,能过滤qt程序的截图活动了。多谢版主!
头像
LinuxLin365
帖子: 11
注册时间: 2023-12-05 11:14

Re: ltrace到底能跟踪到那些函数的调用?

#11

帖子 LinuxLin365 » 2023-12-05 11:34

wxf 写了: 2023-08-13 12:59 看了那个源码,hook了其中一个函数,能过滤qt程序的截图活动了。多谢版主!
请教一下qt截图是hook的哪个接口?
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: ltrace到底能跟踪到那些函数的调用?

#12

帖子 wxf » 2023-12-31 15:27

LinuxLin365 写了: 2023-12-05 11:34
wxf 写了: 2023-08-13 12:59 看了那个源码,hook了其中一个函数,能过滤qt程序的截图活动了。多谢版主!
请教一下qt截图是hook的哪个接口?
xcb_copy_area
头像
LinuxLin365
帖子: 11
注册时间: 2023-12-05 11:14

Re: ltrace到底能跟踪到那些函数的调用?

#13

帖子 LinuxLin365 » 2024-01-08 15:13

wxf 写了: 2023-12-31 15:27
LinuxLin365 写了: 2023-12-05 11:34
wxf 写了: 2023-08-13 12:59 看了那个源码,hook了其中一个函数,能过滤qt程序的截图活动了。多谢版主!
请教一下qt截图是hook的哪个接口?
xcb_copy_area
qt程序hook这个没问题,对于QQ程序的截图似乎没有生效,gdk_pixbuf_get_from_window 和 xcb_copy_area QQ的截屏并没有调用;

后续有分析过QQ的截图具体实现吗? 我没有分析到是如何实现的
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: ltrace到底能跟踪到那些函数的调用?

#14

帖子 wxf » 2024-01-10 17:43

LinuxLin365 写了: 2024-01-08 15:13
wxf 写了: 2023-12-31 15:27
LinuxLin365 写了: 2023-12-05 11:34
wxf 写了: 2023-08-13 12:59 看了那个源码,hook了其中一个函数,能过滤qt程序的截图活动了。多谢版主!
请教一下qt截图是hook的哪个接口?
xcb_copy_area
qt程序hook这个没问题,对于QQ程序的截图似乎没有生效,gdk_pixbuf_get_from_window 和 xcb_copy_area QQ的截屏并没有调用;

后续有分析过QQ的截图具体实现吗? 我没有分析到是如何实现的
你试过了吗?我hook时,就hook这个函数,QT截图动作能拦截到啊。
gdk_pixbuf_get_from_window ,这个是用来拦截gtk截图的。我是这么做的
头像
LinuxLin365
帖子: 11
注册时间: 2023-12-05 11:14

Re: ltrace到底能跟踪到那些函数的调用?

#15

帖子 LinuxLin365 » 2024-01-11 17:54

wxf 写了: 2024-01-10 17:43
LinuxLin365 写了: 2024-01-08 15:13
wxf 写了: 2023-12-31 15:27
LinuxLin365 写了: 2023-12-05 11:34
wxf 写了: 2023-08-13 12:59 看了那个源码,hook了其中一个函数,能过滤qt程序的截图活动了。多谢版主!
请教一下qt截图是hook的哪个接口?
xcb_copy_area
qt程序hook这个没问题,对于QQ程序的截图似乎没有生效,gdk_pixbuf_get_from_window 和 xcb_copy_area QQ的截屏并没有调用;

后续有分析过QQ的截图具体实现吗? 我没有分析到是如何实现的
你试过了吗?我hook时,就hook这个函数,QT截图动作能拦截到啊。
gdk_pixbuf_get_from_window ,这个是用来拦截gtk截图的。我是这么做的
gdk_pixbuf_get_from_window 和 xcb_copy_area 我同时hook,并没有捕获到,你qq是hook的哪个?
qq不是用qt写的 :Adore
回复