给Source Insight做个外挂系列之四--分析“Source Insight”
外挂的目的就是将代码注入到其它进程中,所以必须要有目标进程才能完成注入,而所谓的目标进程通常是某软件的一部分或者是全部,所以要对目标程序有深入地了解。一般外挂都是针对某个应用程序开发的,其装载、运行都依赖于宿主进程提供的环境,如果“挂”错了,后果很严重。有一些软件运行时会启动多个进程,每个进程完成各自的任务,所以要分清到底应该“挂”哪个进程,好在“Source Insight”比较简单,所有的功能都在一个进程中完成,分析起来比较简单。
要给“Source Insight”加一个用于文件切换的标签栏,就要对“Source Insight”的窗口体系进行深入研究,因为文件切换体现在“Source Insight”的界面上就是窗口的切换。除此之外,还要研究窗口之间的消息流向,这样的工具要首推“Spy++”。“Spy++”工具是Viausl Studio的一部分,我们先用它来看看“Source Insight”程序的窗口层次结构,首先是主框架窗口,也就是整个界面最外层(最大)的那个窗口,如下图所示:

主窗口的class name是“si_Frame”,这是一个好兆头,这说明“Source Insight”程序有固定的主框架窗口class name,TabSiPlus就是根据主框架窗口的class name识别“Source Insight”的。其实要标签化一个多文档界面的窗口系统,最重要的是找到子框架窗口以及子框架窗口的宿主,也就是子框架窗口的父窗口。通常这个窗口并不是主框架窗口,而是主框架窗口的一个子窗口,这个子窗口和Toolabr或Rebar窗口一样,不同之处在于它既不靠顶,也不靠边,它只是占据主框架窗口的整个客户区。现在就看看“Source Insight”的子框架窗口的宿主窗口是怎么回事,首先关闭所有文档,也就是关闭全部子框架窗口,然后拖着“Spy++”的瞄准星到处找,找啊找,就是这个:

图4.2 MDI Client窗口
注意到它的class name了吗?是的,它的窗口class name是“MDIClient”,熟悉Windows的程序员都知道,这就是windows的标准多文档窗口界面,这很令人振奋,要记住这个名字,因为我们的外挂就是通过Hook这个窗口来控制文件标签的。接下来是研究子框架窗口,打开一个子窗口,不要最大化,然后用“Spy++”的瞄准星慢慢看:

图4.3 Source Insight的子窗口
原来它的class name是“si_Sw”,它还有很多子窗口,不过不在我们关心之列,重要的就是这个class name,因为“TabSiPlus”只Hook这个子框架窗口。
找到这些窗口之后,就需要研究这些窗口之间的消息了,考虑到文件切换标签栏的行为,比如当用户点击一个标签的时候要激活对应的子框架窗口,再比如当用户通过其它方式切换一个窗口的时候(比如使用快捷键或Window菜单),需要标签栏能够作出相应的更新动作,还有就是窗口的创建和销毁(对用操作是打开和关闭文件),所以要重点关注的几个消息是窗口创建,销毁,窗口激活,窗口去激活等等,如下图所示设定消息Filter:

图4.4 消息过滤设置
然后激活这个子框架窗口,可以看到有一个WM_MDIACTIVE消息:

图4.5 MDI消息流动情况
通过解析消息参数就能得到窗口句柄,再通过窗口句柄和标签之间的关系(这个关系由我们的外挂自己维护,关于TabSiPlus内部细节将在下篇介绍)更新相应的标签。同样的方法,Hook WM_MDICREATE和WM_MDIDESTROY可以感知到窗口的创建和销毁,据此可以添加一个标签或删除一个标签。当用户激活某个标签的时候,通过模拟发送相应的消息使窗口能够具有相应的行为,这一部分就是标签外挂的重点。
通过上面的研究,我们来总结一下具有哪些资质的程序才能应用标签窗口外挂,首先,主窗口要有固定的class name或窗口标题格式,有固定的class name这一点不是必须的,可以通过其它方式找到宿主程序的主窗口,但是窗口标题的格式十分重要,因为在无法获得宿主程序内部数据结构的情况下,只能通过分析窗口标题来获知窗口对应的文件名称。其次是应用程序要是标准的Windows多文档界面,虽然从理论上讲所有拥有固定客户区窗口class name和子窗口class name的窗口体系都可以使用TabSiPlus使用的技术,但是对于标准的Windows多文档界面程序,有很多标准的窗口消息可以利用(例如MDICHILD_ACTIVE,MDICHILD_DESTROY等等),能给功能开发带来更多的便利。最后是用于显示文件的子窗口要有固定的class name。“Source Insight”很好地满足了这些条件,所以“TabSiPlus”就出现了。
至此,所有有关“TabSiPlus”的外部情况(包括如何找到“Source Insight”,如何装载外挂动态链接库等等)都介绍完了,本系列的下一篇讲深入“TabSiPlus”的内部,详细讲解注入到宿主程序中的代码是如何工作的,下下篇(可能是最后一篇)会对本文发表过程中读者提到的一些感兴趣的问题进行解答,如果你能耐着性子读完最后一篇文章,会有一个惊喜等待着你,猜猜会是什么?
Source Insignt文件标签外挂:TabSiPlus的下载地址:
http://www.winmsg.com/download/tabsiplus.zip
给Source Insight做个外挂系列之四--分析“Source Insight”的更多相关文章
- 给Source Insight做个外挂系列之五--Insight “TabSiPlus”
“TabSiPlus 外挂插件”主要有两部分组成,分别是“外挂插件加载器”和“插件动态库”.“插件动态库”完成Source Insight窗口的Hook,显示Tab标签栏,截获Source Insig ...
- 给Source Insight做个外挂系列之三--构建外挂软件的定制代码框架
上一篇文章介绍了“TabSiPlus”是如何进行代码注入的,本篇将介绍如何构建一个外挂软件最重要的部分,也就是为其扩展功能的定制代码.本文前面提到过,由于windows进程管理的限制,扩展代码必须以动 ...
- 给Source Insight做个外挂系列之一--发现Source Insight
一提到外挂程序,大家肯定都不陌生,QQ就有很多个版本的去广告外挂,很多游戏也有用于扩展功能或者作弊的工具,其中很多也是以外挂的形式提供的.外挂和插件的区别在于插件通常依赖于程序的支持,如果程序不支持插 ...
- 给Source Insight做个外挂系列之六--“TabSiPlus”的其它问题
关于如何做一个Source Insight外挂插件的全过程都已经写完了,这么一点东西拖了一年的时间才写完,足以说明我是一个很懒的人,如果不是很多朋友的关心和督促,恐怕是难以完成了.许多朋友希望顺着本文 ...
- 给Source Insight做个外挂系列之二--将本地代码注入到Source Insight进程
上一篇文章介绍了如何发现正在运行的“Source Insight”窗口,本篇将介绍“TabSiPlus”是如何进行代码注入的.Windows 9x以后的Windows操作系统都对进程空间进行了严格的保 ...
- Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程
原文:Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程 Red Gate系列之四 SQL Data Compare ...
- WPF编游戏系列 之四 用户控件
原文:WPF编游戏系列 之四 用户控件 在上一篇<WPF编游戏系列 之三 物品清单>中,对物品清单进行了演示,其中反复用到了同一组控件(如下图),而且 颜昌钢也指出在3.2. ...
- Sql Server来龙去脉系列之四 数据库和文件
在讨论数据库之前我们先要明白一个问题:什么是数据库? 数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多 ...
- ntity Framework技巧系列之四 - Tip 13 – 15
提示13. 附加一个实体的简单方式 问题: 在早先的一些提示中,我们讨论了使用Attach来加载一个处于未改变(unchanged)状态的东西到ObjectContext从而避免进行查询的开销. 如果 ...
随机推荐
- [Linux]系统调用理解(1)
本文是Linux系统调用专栏系列文章的第一篇,对Linux系统调用的定义.基本原理.使用方法和注意事项大概作了一个介绍,以便读者对Linux系统调用建立一个大致的印象. 什么是系统调用? Linux内 ...
- PHP 格中方法
1.__tostring()能够直接输出对象 class Ren { public $name; function Run() { echo "跑"; } function __t ...
- MAC 远程桌面链接 证书或链接无效
RDC --> 首选项 --> 安全性 --> 勾选即使验证失败也要链接. 问题解决.
- 【数据采集】VBA数据采集可用 COM 组件
windows 中提供了4个COM组件都可以进行数据采集. Wininet WinHttp XmlHttp MSHTML https://msdn.microsoft.com/en-us/librar ...
- Web前端发展前景及就业方向
Web前端发展前景及就业方向 HTML5技术已经日趋成熟 Html5是移动互联网前端的主流开发语言,目前还没有一个前端的开发语言能取代 html5的位置,所以说,无论你是做手机网站还是在手机app应用 ...
- ios原声音频播放AVAudioSession 总结
//音频播放/*英译:record:录音 */ 1 导入头文件#import<AVFoundation/AVFoundation.h>//AVAudioSession是一个单例模式.在IO ...
- hdu 1502 Regular Words
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502 思路:给定一个n,分别由n个a,b,c组成的字符串的所有前缀中a的个数大于等于b的个数大于等于c的个 ...
- RHCS 6.5 由于resource-agents-3.9.2-40.el6版本过低导致rgmanager[61164]: [fs] umount failed - REBOOTING问题的解决
問題描述: RHEL 6.5版本RHCS在disable或者relocate service的時候,會導致節點重啟,查看日誌顯示umount掛载點失敗,日誌如下: Nov 29 16:03:50 ph ...
- 带callback的future实现
jdk暂时不支持,所以只有自己实现带callback的future. 完成后callback的 final TaskPromise promise = new DefaultTaskPromise() ...
- 8-07CONTIUE 、 BREAK、RETURN
CONTIUE: 可以让程序跳过CONTIUE关键字之后的语句,回到WHILE循环的第一行命令. BREAK:让程序跳出循环,结束WHILE的循环. BREAK: 让系统完全跳出循环,结束WHILE循 ...