[已解决]ltrace到底能跟踪到那些函数的调用?
- wxf
- 帖子: 54
- 注册时间: 2008-05-28 8:50
[已解决]ltrace到底能跟踪到那些函数的调用?
我想探测一个QT程序或者gtk程序在执行某个功能时到底依次调用了那些函数。可是用“ ltrace /usr/bin/xfce4-screenshooter ”或者 “ltrace /usr/bin/kylin-screenshot launcher ”这样的命令之后并没有看到输出。
这是为什么?
这是为什么?
上次由 wxf 在 2023-08-15 18:31,总共编辑 1 次。
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: ltrace到底能跟踪到那些函数的调用?
建议先阅读一下man ltrace中关于-e参数的说明
- wxf
- 帖子: 54
- 注册时间: 2008-05-28 8:50
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
- wxf
- 帖子: 54
- 注册时间: 2008-05-28 8:50
Re: ltrace到底能跟踪到那些函数的调用?
比如这样的代码:
代码: 全选
// 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 -e XMapWindow ./dockwindow
Window created 25165825
X connection to :0 broken (explicit kill or server shutdown).
+++ exited (status 1) +++
- wxf
- 帖子: 54
- 注册时间: 2008-05-28 8:50
Re: ltrace到底能跟踪到那些函数的调用?
您了解QT截图功能的实现细节吗?我想hook函数,阻止qt程序截图,但不能使qt程序出错,可以给qt提供一个假图像。
但是试了很多函数,xlib里的 xcb里的,网上文章里截图代码用到的关键函数都hook过了,但还是拦截不到QT截图程序的截图动作。
不知道QT截图功能在内部到底是怎么实现的。
hook QT类的成员函数(比如 QScreen::GrabWindow)倒是可以,但是Qt又不是只有一个版本,hook so依赖的QT版本和截图程序依赖的版本可能不一样,注入进去的话,可能造成程序出错。
最好是找到Qt截图程序依赖的底层库的函数,hook之。所以我才想用ltrace 启动截图程序,点击截图,看有哪些函数名输出了
但是试了很多函数,xlib里的 xcb里的,网上文章里截图代码用到的关键函数都hook过了,但还是拦截不到QT截图程序的截图动作。
不知道QT截图功能在内部到底是怎么实现的。
hook QT类的成员函数(比如 QScreen::GrabWindow)倒是可以,但是Qt又不是只有一个版本,hook so依赖的QT版本和截图程序依赖的版本可能不一样,注入进去的话,可能造成程序出错。
最好是找到Qt截图程序依赖的底层库的函数,hook之。所以我才想用ltrace 启动截图程序,点击截图,看有哪些函数名输出了
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: ltrace到底能跟踪到那些函数的调用?
研究了下,现在ubuntu上的gcc默认开启pie,用pie模式编译出来的需要把-e换成-x
或者你在编译时禁用pie,gcc -no-pie -fno-pie xxxx,就可以直接用ltrace不加其他参数
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
- 帖子: 54
- 注册时间: 2008-05-28 8:50
Re: ltrace到底能跟踪到那些函数的调用?
之前看过QT源代码了,但是没看懂,完全没看到获取图像的代码,抽象得很。
不过你给的这个代码我没看过,我看看。好像是获取图像的代码
不过你给的这个代码我没看过,我看看。好像是获取图像的代码
- wxf
- 帖子: 54
- 注册时间: 2008-05-28 8:50
Re: ltrace到底能跟踪到那些函数的调用?
我知道为啥ltrace跟踪不到了/usr/bin/kylin-screenshot,是因为这个程序启动后又创建了子进程,自己退出了。。。。
- wxf
- 帖子: 54
- 注册时间: 2008-05-28 8:50
Re: ltrace到底能跟踪到那些函数的调用?
看了那个源码,hook了其中一个函数,能过滤qt程序的截图活动了。多谢版主!
- LinuxLin365
- 帖子: 11
- 注册时间: 2023-12-05 11:14
- wxf
- 帖子: 54
- 注册时间: 2008-05-28 8:50
Re: ltrace到底能跟踪到那些函数的调用?
xcb_copy_area
- LinuxLin365
- 帖子: 11
- 注册时间: 2023-12-05 11:14
- wxf
- 帖子: 54
- 注册时间: 2008-05-28 8:50
Re: ltrace到底能跟踪到那些函数的调用?
你试过了吗?我hook时,就hook这个函数,QT截图动作能拦截到啊。LinuxLin365 写了: ↑2024-01-08 15:13qt程序hook这个没问题,对于QQ程序的截图似乎没有生效,gdk_pixbuf_get_from_window 和 xcb_copy_area QQ的截屏并没有调用;
后续有分析过QQ的截图具体实现吗? 我没有分析到是如何实现的
gdk_pixbuf_get_from_window ,这个是用来拦截gtk截图的。我是这么做的
- LinuxLin365
- 帖子: 11
- 注册时间: 2023-12-05 11:14
Re: ltrace到底能跟踪到那些函数的调用?
gdk_pixbuf_get_from_window 和 xcb_copy_area 我同时hook,并没有捕获到,你qq是hook的哪个?wxf 写了: ↑2024-01-10 17:43你试过了吗?我hook时,就hook这个函数,QT截图动作能拦截到啊。LinuxLin365 写了: ↑2024-01-08 15:13qt程序hook这个没问题,对于QQ程序的截图似乎没有生效,gdk_pixbuf_get_from_window 和 xcb_copy_area QQ的截屏并没有调用;
后续有分析过QQ的截图具体实现吗? 我没有分析到是如何实现的
gdk_pixbuf_get_from_window ,这个是用来拦截gtk截图的。我是这么做的
qq不是用qt写的