“TabSiPlus 外挂插件”主要有两部分组成,分别是“外挂插件加载器”和“插件动态库”。“插件动态库”完成Source Insight窗口的Hook,显示Tab标签栏,截获Source Insight的窗口消息并根据消息调整Tab标签栏等功能,这是一个动态链接库,不能主动执行,所以还需要一个“外挂插件加载器”,“外挂插件加载器”是一个独立的可执行文件,它的主要功能就是发现Source Insight的进程,并把插件动态库“注入”到Source Insight的进程中。本文将简单介绍这两个组件是如何协同工作,最终实现插件的完整功能。
首先介绍“外挂插件加载器”,它就是TabSiHost.exe组件,它的功能就是监视Source Insight进程,发现Source Insight的主窗口,将插件主体动态库插入到Source Insight。关于如何发现Source Insight和代码注入的方法请查看本系列的第一篇《发现Source Insight》和第二篇《将本地代码注入到Source Insight》,此处就不再赘述。此处主要介绍TabSiHost.exe组件的工作流程以及一些实现细节问题。TabSiHost.exe组件的主函数是MainFunction(),这个函数首先获取参数,根据参数判断是加载还是卸载插件,然后是启动一个定时器,这个定时器负责监视Source Insight进程,最后进入一个消息循环,等待进程结束。定时器的主要任务就是检查是否有Source Insight进程创建,其实就是枚举当前全部程序的主窗口,查看是否有Source Insight的主窗口,如果有则要根据设置确定是否对其实施代码注入。这里需要注意的是不能重复注入,因为每次注入都要创建一个Tab标签栏,重复注入会导致很难看的事情发生。如何确定Source Insight已经被Hook过了呢?其实可以有很多方法,比如创建内核对象进行标识,这只内存标志等等,TabSiPlus使用了一种很巧妙的方式,就是在Source Insight主窗口的窗口标题字符串中插入一个标识字符串“with TabSiPlus”,这样定时器在枚举程序的主窗口的时候就可以根据窗口标题判断这个进程实例是否已经被Hook过了,同时,这个字符串标识还宣示了“TabSiPlus 插件”的存在,一举两得。简单了解了“外挂插件加载器”的工作过程之后,下面将重点介绍“插件动态库”的工作过程。
本系列的第三篇已经介绍过TabSiPlus.dll组件中的代码执行顺序,当LoadLibrary()调用发生时,C