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未加载,原因调查中

Source Insight 3.X 标签插件v1.0发布的更多相关文章

  1. 亿能测试白盒安全测试模板V1.0发布

    亿能测试白盒安全测试模板V1.0发布http://automationqa.com/forum.php?mod=viewthread&tid=2911&fromuid=21

  2. RDIFramework.NET平台代码生成器V1.0发布(提供下载)

    RDIFramework.NET平台代码生成器V1.0发布(提供下载)   RDIFramework.NET(.NET快速开发整合框架)框架做为信息化系统快速开发.整合的框架,其目的一至是给用户和开发 ...

  3. 启明星手机版安卓android会议室预定系统 V1.0发布

    启明星手机版会议室预定系统 V1.0发布 在手机里输入 http://www.dotnetcms.org/e4.apk 或者扫描二维码下载 用户打开系统,可以实时查看所有会议室状态 点击会议室名称,可 ...

  4. Visual Studio的 Apache Cordova 插件CTP3.0发布!

    北京时间12号晚23点开始的Connect()活动上,微软发布了一系列激动人心的消息! .NET开源了!以后.NET将可在Linux和Mac OS平台上运行! VS免费了!!如果你是学生,个人开发者, ...

  5. lib-qqwry v1.0 发布 nodejs解析纯真IP库(qqwry.dat)

    lib-qqwry是当初学习node时用来练手的一个模块,用来解析纯真IP库的 现在发一个v1.0版本弥补我当时稚嫩的代码. 意外收获是,整理代码后发现,相比v0.x版本 急速模式下的效率提升大概20 ...

  6. J20航模遥控器开源项目系列教程(一)制作教程 | 基础版V1.0发布,从0到1

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  7. VisualCom软件仿真平台V1.0发布(附安装包下载链接)

    自我们借助VisualCom(暂定名称,后续可能会变更)软件平台撰写技术文章以来,有不少粉丝发私信询问该软件哪里来的,以及哪里有安装包,这里回复一下:VisualCom软件平台是由本微信公众号组织开发 ...

  8. 痞子衡嵌入式:超级下载算法RT-UFL v1.0发布,附J-Link下安装教程

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> 历时 8 个月终于迎来了 v1.0 版发布,因为是第一个正式版,为了保证质 ...

  9. 免费了 -- EXCEL插件 智表ZCELL 普及版V1.0 发布了!!!

    智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...

随机推荐

  1. python os.path

    os.path 提供了一些处理文件路径的函数. os.path.abspath(path) 返回绝对路径, 在大多数平台上, os.path.abspath(path) == os.path.norm ...

  2. SQLServer2008设置 开启远程连接

    SQLServer2008设置 开启远程连接 前一段时间,学生分组做项目,使用SVN工具,要求功能使用存储过程,在数据库这块出现这么一个问题: A学生在他的数据库上添加了存储过程,需要其他的B,C,D ...

  3. Qt 配置文件QSettings

    QString appDirPath = QCoreApplication::applicationDirPath(); QSettings* configIniRead = new QSetting ...

  4. javascript学习 真正理解DOM脚本编程技术背后的思路和原则

    本文学习来源于<javascriptDOM编程艺术>仅作笔记 学会怎样才能利用DOM脚本编程技术以一种既方便自己更体贴用户的方式去充实和完善你们的网页. 循序渐进:从最核心的内容开始,逐步 ...

  5. springBoot专题3---->springBoot与多数据源的配置

    最近有点忙,更新有点慢.今天进来说说一说springBoot中如何配置多数据源. 第一,新建一个名为springBoot-mutidata的maven项目,完整的pom.xml配置如下: <?x ...

  6. AutoMapper搬运工之自定义映射

    回顾 上节说到了AutoMapper的简单使用,对于复杂的Mapping需要强大的自定义,这节我们来看下AutoMapper的自定义Mapping(Projection) 搬运自Git:https:/ ...

  7. Tomcat配置HTTPS方式(单向)

    简要记录主要步骤备忘 1.进入到jdk下的bin目录 2.输入如下指令 keytool -v -genkey -alias tomcat -keyalg RSA -keystore d:/tomcat ...

  8. Tomcat 解压版安装

    1.下载tomcat7.0 http://tomcat.apache.org/download-70.cgi

  9. 清华学堂 Range

    Descriptioin Let S be a set of n integral points on the x-axis. For each given interval [a, b], you ...

  10. JS:事件对象1

    一,this关键字和上下文 var box = document.getElementById("box");. 普通的函数如果没有给他传递参数,函数本身是没有参数的. test( ...