首页
社区
课程
招聘
[下载][原创]Qt5--通过信号查找槽函数插件
2021-3-15 13:55 8508

[下载][原创]Qt5--通过信号查找槽函数插件

2021-3-15 13:55
8508
1
2
3
查找Qt槽函数的插件--qt5_resolver完成。仍然有些问题无法解决,而且依旧只实现了-d参数。
在执行脚本时必须先暂停调试器.当信号被当作槽函数连接时,无法解析出对应的槽函数名称.这种情况下,被当作槽函数的信号并不在QObjectPrivate的ConnectionList中而是通过硬编码索引,利用activate路由到qt_static_metacall.如果有解决方法,希望有大佬能够提点我一下.
下面是测试代码以及脚本效果.




1
拿到中间的method index就可以在qt_statiic_metacall的switch结构里面顺利的找到对应的函数调用了


 

https://github.com/2781553397/qt5_resolver.git,只能在version为7的qt上运行


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

最后于 2021-4-29 17:30 被狐臭编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (23)
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
SBtengxun 2021-4-5 15:45
2
0
可以利用这个过检测
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-4-29 16:11
3
0
程序跑起来进了x32dbg。但是插件没看到qt_resolver是为什么?然后我就直接把下载的里面的debug和release版本的里面的文件都放到x32dbg插件文件夹还是没看到这个插件额。我放其他的插件,可以看到其他的插件。
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-4-29 17:24
4
0
原来有加载了!原来是输入命令行。但是要断在什么地方再输入命令行啊?还是随时可以?我输入了直接start然后就end了
雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-4-29 17:28
5
0
Skyart 原来有加载了!原来是输入命令行。但是要断在什么地方再输入命令行啊?还是随时可以?我输入了直接start然后就end了
这东西不完整,跑起来会卡住,中间有个循环的条件要改一下.
https://github.com/2781553397/qt5_resolver.git,这个修正了,并且x64和x86,但是只能在version7的版本上跑,version8中只能打印出元数据名称
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-4-30 11:14
6
0
狐臭 这东西不完整,跑起来会卡住,中间有个循环的条件要改一下. https://github.com/2781553397/qt5_resolver.git,这个修正了,并且x64和x86,但是只能在ve ...
使用方法是先获取到staticMetaObject结构体的地址,然后输入qt5_resolver -d 0x7AC07878吗?要如何知道staticMetaObject结构体的地址..我输入命令后一直提示异常DEP 违规,是为什么..
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-4-30 11:24
7
0
version为7的qt 是指qt5.7吗?
雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-4-30 20:36
8
0
Skyart version为7的qt 是指qt5.7吗?
qt的metaData中有一个DWORD来标识版本,我在看5.14的时候发现变成了8.
  static const uint qt_meta_data_MainWindow[] = {
 
 // content:
   7,       // 版本
   0,       // classname
   0,    0, // classinfo
   2,   14, // 函数个数,函数偏移
   0,    0, // properties
   0,    0, // enums/sets
   0,    0, // constructors
   0,       // flags
   1,       // signalCount
 
 // signals: name, argc, parameters, tag, flags
   1,    0,   24,    2, 0x06 /* Public */,
 
 // slots: name, argc, parameters, tag, flags
   3,    1,   25,    2, 0x0a /* Public */,
 
 // signals: parameters
QMetaType::Int,
 
 // slots: parameters
QMetaType::Void, QMetaType::Int,    4,
 
   0        // eod
};
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-5-6 14:12
9
0
win10 下 ,运行起来一直提示DEP violation,我的demo有关了DEP的那个选项,但是还是一直提示这个异常是为什么?
雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-5-6 15:06
10
0
Skyart win10 下 ,运行起来一直提示DEP violation,我的demo有关了DEP的那个选项,但是还是一直提示这个异常是为什么?
这个和dep有啥关系
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-5-6 17:32
11
0
 x32dbg日志一直提示dep violation,然后一直循环异常,我单步跟到GetMetaObject的GUARD_GENTLE(ReadMemory(tovptr(vtable_addr), &fmetaObject_addr, sizeof(fmetaObject_addr), handle), 0);这句代码后,步过这句代码就会开始提示dep violation(我也不懂为啥dep异常,囧)
雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-5-6 17:42
12
0
Skyart x32dbg日志一直提示dep violation,然后一直循环异常,我单步跟到GetMetaObject的GUARD_GENTLE(ReadMemory(tovptr(vtable_addr), ...
读内存数据怎么会触发dep呢?是不是版本的问题,我也没有遇到过dep violation,你要不把你测试的demo传上来看看.
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-5-6 19:50
13
0
链接:https://pan.baidu.com/s/1xTJL94R7ZTODV6H-s3KbCg 
提取码:qott 
雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-5-7 09:54
14
0
Skyart 链接:https://pan.baidu.com/s/1xTJL94R7ZTODV6H-s3KbCg 提取码:qott

没有问题啊,可以正常运行.你的qt是version8,version8的qt connectList结构发生了改变,所以只能打印出函数名没办法获取到对应的槽索引.


雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-5-7 09:58
15
0
Skyart 链接:https://pan.baidu.com/s/1xTJL94R7ZTODV6H-s3KbCg 提取码:qott
脚本没有办法自己判别,输入是否为qt的对象,输入的时候最好自己确认,具体就是看他的一号虚函数是否为metaObject
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-5-7 14:27
16
0
狐臭 脚本没有办法自己判别,输入是否为qt的对象,输入的时候最好自己确认,具体就是看他的一号虚函数是否为metaObject

你的也是windows10吗?输入命令qt_resolver -d 0x406000

我找到metaobject是对的吗?

异常是这样

雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-5-7 16:46
17
0
Skyart 你的也是windows10吗?输入命令qt_resolver -d 0x406000我找到metaobject是对的吗?异常是这样

也是windows10

-d接收一个QObject类型的对象,并从中解析qt的槽和元数据
-s解析一个QString对象并取出其中的字符串

脚本中获取staticMetaObject的方法是通过调试器函数强行修改EIP,使其跳转到metaObject函数,并且需要在栈中压入EIP之类的数据

,你可以看看有没有对应权限

metaObject一般长这样,里面一般可以直接看到staticMetaObject:

最后于 2021-5-7 16:56 被狐臭编辑 ,原因:
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-5-8 09:14
18
0
ret上面那句把staticMetaObject放到eax,那我就是输入qt_resolver -d (eax里的地址)。    是这样操作吗?。还是说输入qt_resolver -d 0x680C3690?(你的图片上的第一个地址)
雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-5-8 09:30
19
0
Skyart ret上面那句把staticMetaObject放到eax,那我就是输入qt_resolver -d (eax里的地址)。 是这样操作吗?。还是说输入qt_resolver -d 0x680C3 ...
qt_resolver -d QObject的地址,也就是一个继承了QObject的对象的地址就可以了
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2021-5-10 10:27
20
0

我现在区分不出来哪个是QObject的地址额。在你的demo里面,你的QObject的地址是0x680C3690吗?在我的demo里面,我的QObject是0x406000吗?我的0x406000长这样

雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-5-11 10:38
21
0
Skyart 我现在区分不出来哪个是QObject的地址额。在你的demo里面,你的QObject的地址是0x680C3690吗?在我的demo里面,我的QObject是0x406000吗?我的0x406000长这 ...

你看他的第一个虚函数是不是metaObject()就行了,metaObject函数大概长这样

雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-5-11 10:43
22
0
Skyart 我现在区分不出来哪个是QObject的地址额。在你的demo里面,你的QObject的地址是0x680C3690吗?在我的demo里面,我的QObject是0x406000吗?我的0x406000长这 ...

比如说我要获取QWidget函数信息,我直接在QWidget::show()处下断点,然后执行qt5_resolver -d rcx(对象地址),就可以了

雪    币: 154
活跃值: (624)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
许可飞 2023-2-11 17:26
23
0
请问有没有x64dbg
雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2023-3-17 09:27
24
0
许可飞 请问有没有x64dbg[em_13]
换个版本编译
游客
登录 | 注册 方可回帖
返回