给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从而避免进行查询的开销. 如果 ...
随机推荐
- Angularjs 双向绑定机制解析
文章转自:http://www.2cto.com/kf/201408/327594.html AngularJs 的元素与模型双向绑定依赖于循环检测它们之间的值,这种做法叫做脏检测,这几天研究了一下其 ...
- Fitbit Flex
Fitbit Flex 使用 7月4日,收到了在美国亚马逊上海淘的Fitbit Flex.首先谈谈这价格,在美国亚马逊上购买时的价格是98美元,下订单过后没几天,京东开始首发出售,价格定在898元.相 ...
- jqueyr eq get用法
相信大部份人都会把这2个的用法搞错.仔细查看下API文档就可以知道.eq返回的是一个jquery对象,get返回的是一个html 对象数组.举个例子: <p style="color: ...
- 各种浏览器的Hack写法(chrome firefox ie等)
Hack是针对不同的浏览器去写不同的CSS样式,从而让各浏览器能达到一致的渲染效果,那么针对不同的浏览器写不同的CSS CODE的过程,就叫CSS HACK,同时也叫写CSS Hack. 然后将Hac ...
- C#设计模式之抽象工厂
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类. 抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品 当一个工厂等级结构可以创建出分属于不同产品等级结构的 ...
- AngularJS Bootstrap
AngularJS 的首选样式表是 Bootstrap. 可以在 AngularJS 应用中加入 Twitter Bootstrap,你可以在你的 <head>元素中添加如下代码: < ...
- Ubuntu16.04安装nginx
//ubuntu //安装nginxcurl -LJO http://nginx.org/download/nginx-1.10.1.tar.gz tar zxvf nginx-1.10.1.tar. ...
- MIS系统开发利器,实施、维护人员自定义报表的福音,AgileEAS.NET SOA平台动态报表指南
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 奇异值分解(SVD)和简单图像压缩
SVD(Singular Value Decomposition,奇异值分解) 算法优缺点: 优点:简化数据,去除噪声,提高算法结果 缺点:数据的转换可能难于理解 适用数据类型:数值型数据 算法思想: ...
- HTML5编码规范
为每个 HTML 页面的第一行添加标准模式(standard mode)的声明,这样能够确保在每个浏览器中拥有一致的展现. 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展 ...