Source Insight可以说是一款程序员必备的开发/阅读源码工具,美中不足的是SI没有标签栏,多个源码之间切换很不方便,于是我就乘闲暇之余写了该作品sihook:标签插件;不过严格意义上来说sihook并不算是插件,而是一个内挂:)
如何给Source Insight添加标签栏呢?可以查看orbit的博客<<给Source Insight做个外挂>>系列;感谢orbit的分析,而且orbit再很早的时候就已经做了一个标签插件,我也下载和试用了他的插件,不过orbit的像个外挂,而我的更像内挂:),由于很久没写win程序,对windows消息也不熟悉,手头连spy++都没有,开始以为要hook住SI的某个内部函数来挂钩子窗口的创建和销毁,看了orbit的博客后发现原来SI是个标准的MDI程序,子窗口的创建和销毁都是WM_MDI*的消息,那事情就简单了,只要替换原SI的wndproc就可以实现我们想要的事情.orbit的插件居然是用mfc做的dll,代码中还有线程和定时器,用起来还要个loader来加载,使用起来不太方便,在线程中操作UI怎么看都觉得有点别扭,既然已经注入SI程序了,那我们就因该做的更彻底更底层一点:).
经过几年的编程积累,也有点感悟,越来越觉得c++太繁杂了,而c的清晰精简让我越来越欣赏,一段c代码能很好表达清楚的逻辑,c++开发者喜欢绕上一大圈来实现,更不提那些变形的VC和我从来没搞懂过的MFC,几年以前接触MFC依葫芦画瓢的时候总是搞不懂MFC在干些什么,现在回过头来看,MFC完全就是一个失败的设计.好了,不吐槽c++和该死的VC+MFC了,这次sihook用c开发,gcc编译,偷懒没装MSYS用CodeBlocks做IDE,Makefile都省了:)
下面我简单介绍一下sihook的实现原理:
1,插件的自动加载msimg32
几年前dll都是用CreateRemoteThread方法来加载,就是必须要有个exe的loader,而现在有了msimg32延迟加载漏洞,腰不酸了腿不疼了,加载外挂更方便了:),具体原理我就不多介绍了,网上一搜一大把.
2,肢解SI之siframe
SI主窗体是siframe,由于msimg32是延迟加载,由hook CreateWindowEx调试发现,当我们的dll载入的时候,siframe和mdiclient已经创建了,而si_sw未创建,那么我们直接得到当前进程的HWND就是siframe的HWND了,然后SetWindowLong替换窗口过程,只关心WM_SETTEXT消息,WM_SETTEXT设置标题的时候我们在后面加上"加强版"的字样,然后以siframe为父窗体创建我们的systabcontrol32控件.
3,肢解SI之mdiclient
mdiclient是SI中最重要的一个窗口,它管理着源码窗口的创建销毁,首先用FindWindowEx得到mdiclinet的句柄,然后SetWindowLong替换窗口过程,这里面要处理的消息有WM_WINDOWPOSCHANGING;WM_MDICREATE;WM_MDIDESTROY;WM_MDIACTIVATE;
WM_WINDOWPOSCHANGING是窗口大小改变的消息,这时候要处理tab的大小和mdiclient自身的大小,要在oldwndproc执行之前处理;
WM_MDICREATE;WM_MDIDESTROY;WM_MDIACTIVATE;要在oldwndproc执行之后处理,这样就可以直接拿到子窗口的句柄处理了.
WM_MDICREATE消息用FindWindowEx得到新创建的si_sw源码窗口的句柄,替换窗口过程
WM_MDIDESTROY消息直接能拿到HWND,同步删除tab标签
WM_MDIACTIVATE也能直接拿到HWND,同步激活tab标签
4,肢解SI之si_sw
si_sw子窗口就是源码显示窗口了,这个窗口我们只关心WM_SETTEXT消息,得到当前源码的标题(包括标题的变更),直接显示在tab上,这样就不用一个定时器去不停的比较了;
5,tabctl控件
为了精简,直接用sdk编程,只能用系统自带的systabcontrol32控件来做标签了,我封装了一层接口方便上层调用,包括增加,删除,双击关闭,改变选项卡颜色,调整位置高度等.说起来这是我第一次用systabcontrol32这个控件,做的很难看,如果有sdk美化高手知道怎么做的漂亮一点,可以给我留言,再此先表示感谢.另外双击关闭标签的同时要关闭源码窗口,看orbit的介绍要发WM_CLOSE消息,而且他的代码确实是这么实现的,并且有效,但是我怎么试都不灵,最后用OD一调试,发现SI自己发的是WM_SYSCOMMAND消息,WPARAM参数是SC_CLOSE,于是我也用SC_CLOSE消息来关闭文档:)
OK,基本原理就是上面几点,理清楚了制作标签内挂就很容易了,整个工程不算tabctl控件源码不超过10个函数,以下是效果图和插件下载包
sihookv1.0下载:[点我]
安装:解压sihook.zip两个dll放到SI目录即可
删除:删除SI目录msimg32.dll和sihook.dll即可
源代码地址:https://github.com/redxu/sihook
注:测试发现某些XP sp2装了某些卫士的机器会无法使用此插件,msimg未加载,原因调查中