给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从而避免进行查询的开销. 如果 ...
随机推荐
- mysql datatime 设置默认值为CURRENT_TIMESTAMP报错`Invalid default value`
环境: Ubuntu mysql 5.5 解决方法: 升级mysql至5.6 apt-cache search mysql-server sudo apt-add-repository ppa:ond ...
- testng教程之testng.xml的配置和使用,以及参数传递
昨天学习了一下testng基础教程,http://www.cnblogs.com/tobecrazy/p/4579414.html 昨天主要学习的是testng 的annotation基本用法和生命周 ...
- oracle中lead和lag函数 (转载)
解决上一户和下一户问题这两个函数,是偏移量函数,其用途是:可以查出同一字段下一个值或上一个值. lead(col_name,num,flag) col_name是列名:num是取向下第几个值:flag ...
- 一行实现QQ群组头像,微信群组,圆角等效果. 并支持url直接加载图片
说点题外话. Coding中我们总是经历着这么几个过程. 学会使用: 不管是API也好, 开源库也好. 总是在最开始的学会去用. 了解实现原理: 可能会因为一些不兼容, 代码的异常状态的处理不够完美等 ...
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds -----》myeclipse2015
错误:Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds 错误提示就是我们限定了部署的时间导致的错 ...
- 如何快速的解决Maven依赖冲突
为什么会出现依赖冲突 首先要说明Maven的依赖管理,具体的可以参考这边 Maven学习——依赖管理 这篇文章,maven在依赖冲管理中有一下几个原则. 依赖是使用Maven坐标来定位的,而Maven ...
- 情人节那点事,Power BI告诉你
情人节伴随着元宵节刚刚过去,Power BI团队就送给我们一份大礼,利用来自NRF(national retail foundation)和Bing搜索的数据,在Power BI中帮助我们发现在美国那 ...
- UVA 11645 Bits(组合数学)
从左往右处理,左半部分记为left, 右半部分记为right,若i,i -1均为1, 贡献为ans += (left + 1) + right * (1ll << (i - 1)); 否则 ...
- jquery 事件冒泡的介绍以及如何阻止事件冒泡
在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级 ...
- 浏览器-09 javascript引擎和Chromium网络栈
语言的运行 C/C++语言 使用编译器直接将它们编译成本地代码(机器指令),这是由开发人员在代码编写完成之后实施; 用户只是使用这些编译好的本地代码,这些本地代码被系统的加载器加载执行,由操作系统调度 ...