给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从而避免进行查询的开销. 如果 ...
随机推荐
- java基本算法之快速排序
快速排序:是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确 ...
- 页面位置 top、postop、scrolltop、offsetTop、scrollHeight、offsetHeight、clientHe
1.top 此属性仅仅在对象的定位(position)属性被设置时可用.否则,此属性设置会被忽略. 代码如下: <div style=" position:absolute; widt ...
- iOS之ToolBar定制
ToorBar的定制 在诸如社区类的app里面,很多都涉及到用户发布消息,如现今最流行的新浪微博,每条信息底部都会有个工具条,正如下图所示,有转发.评论和点赞三个按钮的工具条. 结构 1.作为一个独立 ...
- Swift - 使用CAKeyframeAnimation实现关键帧动画
1,CAKeyframeAnimation介绍 CAKeyframeAnimation可以实现关键帧动画,这个类可以实现某一属性按照一串的数值进行动画,就像是一帧一帧的制作出来一样. 2,使用样例 ...
- hdu 1300 Pearls
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1300 思路:用dp[i]表示前i种花费最低的情况,则有dp[i]=min(dp[i],dp[j+1]+(( ...
- em换算px,rem换算px
<body> <style type="text/css" rel="stylesheet"> html,body{ font-size ...
- 微信支付Native扫码支付模式二之CodeIgniter集成篇
CI:3.0.5 微信支付API类库来自:https://github.com/zhangv/wechat-pay 请先看一眼官方场景及支付时序图:https://pay.weixin.qq.com/ ...
- 复制Eclipse工作空间设置
将新建的workspace下的.metadata.plugins内容全部删除: 将原来的workspace下的.metadata.plugins内容除了org.eclipse.core.resourc ...
- java返回一个简单的日历
import java.text.*; //首先得导包 import java.util.*; public class hw2 { /** * 计算日期差 返回的天数 * @param dstr1 ...
- 数据库错误:check the manual that corresponds to your MySQL server version for the right sy
检查对应到您的MySQL服务器版本附近使用正确的语法手册 数据库插入的时候出现上述问题,总结了两方面原因: 1.语法错误,这是百度之得到的大部分结果,但是没有解决我的问题 2.仔细观察我的sql语句, ...