-
-
找到关键指令的领空之QtCreator搜索功能实现代码领空定位
-
发表于:
2023-8-22 22:14
3493
-
找到关键指令的领空之QtCreator搜索功能实现代码领空定位
牢记初心
本人学习逆向的目标,是还原二进制代码到C++源码。对于一个程序来讲,需要学习的算法一般只是程序的某一特定部分代码,所以逆向关键算法是找到关键代码并将其还原,而非整个程序的代码还原。
遇到的问题
一般稍大规模的程序,都是由很多模块组成的。并不是平时练习的简单逆向目标那般,写一个简单的exe。所以,在确定自己要逆向的功能之后,不能直接就怼着exe就开撸。因为你所关注的代码,也许并不在exe中。
所以接下来的重点:如何定位到功能代码的二进制领空?
练习和研究
接下来的研究目标是Qt的IDE编译器QtCreator。问题是如何定位到界面的Find的搜索功能的实现代码?
- 一般界面在主线程中,开始按照一般思路,直接怼着qtcreator.exe进行下断点。至于如何下断点,我自己写了一个简单的脚本,脚本实现思路很简单,直接找到对应模块,每个指定指令行数尝试下断点。
比如,该指令表示对qtcreator.exe模块每50行下了一个断点。
通过动态调试,分析到该模块有一个Qt的事件分发机制,并没有相关搜索功能代码的实现。其实因为自己常年在使用Qt,所以知道从该模块还是能分析到排在消息队列中的搜索功能的槽函数的,但是这样深入下去,工作量太大了。所以,接下来换了一种思路,
- 直接从有可能使用到的API入手,反向查找堆栈。思路对了,接下来工作的效率马上翻倍了。
因为程序QtCreator也是基于Qt写的,那么Qt对于搜索字符串一般使用的是QString::indexOf,而QString在Qt5Core.dll中,所以在符号中,找到相应模块,对感兴趣的函数下断:
程序继续运行,经过调试发现最接近实现的三个函数分别是:
然后观察一下调用堆栈,果然有了发现:
这里发现了core4模块,这个是非Qt库,所以最有可能是QtCreator.exe且为搜索功能代码实现的模块。回到符号页,找到Core4,可以发现该模块的文件路径:
从路径上可以看出,该模块是以插件的形式加载到QtCreator.exe中的,这也非常符合Qt的设计模式。
其实到这里基本上是定位差不多了,不过还是看看Core4.dll搜索功能模块的领空吧
这里看到很多的关键信息了,比如:
1 | QTextDocument::find( class QRegularExpression const &, class QTextCursor const &, class QFlags<enum QTextDocument::FindFlag>)
|
小结:
- 熟悉逆向目标的依赖的底层模块API,可以事半功倍;
- 找到逆向还原的指令领空,才是逆向还原源码的第一步。即使是正向开发,合适的位置写正确的代码也是至关重要;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-8-22 23:15
被_THINCT编辑
,原因: