一提到外挂程序,大家肯定都不陌生,QQ就有很多个版本的去广告外挂,很多游戏也有用于扩展功能或者作弊的工具,其中很多也是以外挂的形式提供的。外挂和插件的区别在于插件通常依赖于程序的支持,如果程序不支持插件机制,那么就无法为其开发插件,而外挂则不然,它不依赖于程序本身的功能,通常是一个单独运行的程序,“挂”其它程序的方法就是跨进程代码注入。如果这个世界的所有软件都是开放源代码的,而且没有那么多的License限制,黑客们可以自由修改代码发布新功能,那么就不会出现外挂这东西。给别的程序做外挂是一件很麻烦的事情,并不是所有的程序都能够“容忍”从外部注入的代码,特别是一些程序存在内部缺陷,按照正常的Windows运行机制注入的功能通常不能达到预期的效果,甚至是造成该程序不能使用,所以如果不是实在没有别的办法的话,没有人会主动使用做外挂的方式一个程序扩展功能。
    
    尽管不愿意,但还是有一些程序只能通过外挂来扩展它的功能,本文提到的这个“不得不挂”的程序就是大名鼎鼎的源代码浏览工具:Source Insight。Source Insight是一款....[此处省略介绍性文字字符数(不计空格)1028,非中文单词126,中文字符或朝鲜语单词819]。我使用VC很长时间,也许是被VC的“Tabbar”插件惯坏了,所以当我使用不能通过文件标签切换文件的编辑器的时候就感觉非常不适应,很不幸,“Source Insight”就是这样的。使用了“Source Insight”一段时间之后,我开始寻求为其添加一个文件标签栏的方法,“Source Insight”功能强大,可以通过自定义命令扩展它的功能,甚至支持一种类似于C语言语法的宏语言,但是经过一段时间的研究之后,我得结论是只能通过外挂对“Source Insight”的界面进行扩展,添加一个用于文件切换的标签栏。

前面已经提到,不是所有的程序都能够“容忍”外部注入的代码,我之所以觉得“Source Insight”可以挂一下,是因为“Source Insight”使用的是标准的Windows MDI(多文档界面)窗口,窗口之前的消息流向简单且遵循Windows标准机制。于是一个月以后,“Source Insight”的文件标签外挂:TabSiPlus就诞生了,在研究“Source Insight”和编写“TabSiPlus”期间积累了一些经验,留在自己的脑子中只会慢慢遗忘,现在把它们整理成文字和大家一起共享。

首先介绍一下“TabSiPlus”,它的主要功能就是给“Source Insight”添加一个文件切换标签栏,这个切换标签栏对于使用“Source Insight”编写代码的人有很大的帮助,先看一些它都给“Source Insight”带来了哪些变化:

代码窗口下面多了一个文件标签栏,菜单也变样了,还加上了几个图标,其实菜单的底色和文字颜色都是可以改变的,文件标签栏的颜色也是可以改变的,看看:

除此之外,还添加了C/C++文件翻转的功能,这个可是VA的常用功能,相信大家都不陌生,这个C/C++文件翻转功能继承了“Tabbar for Visual C++”插件的多目录、多扩展名搜索功能:

从现在开始,我就通过一系列文章介绍“TabSiPlus”是怎样一步一步的做出来的,也包括对“Source Insight”的研究过程,本篇主要介绍如何找到“Source Insight”。这是一个很重要的问题,如果不能从系统中找到正在运行的“Source Insight”,那么外挂就无从挂起了。查找系统中运行的“Source Insight”程序有很多种方法,可以遍历系统中的所有进程,然后看看有没有insight3.exe,并得到这个进程的句柄;也可以通过窗口枚举,找到有“Source Insight”标志的主窗口,并获得这个主窗口的句柄。当然还有其他的方法,这里就不一一介绍了,“TabSiPlus”采用窗口枚举的方法,因为“Source Insight”的主窗口的类名是固定的且标题栏文字很有规律,在任何情况下都有“Source Insight”字样,便于匹配,其实主要的原因是窗口枚举方法简单。

使用Spy++工具研究“Source Insight”的主窗口,发现其窗口的类名是“si_Frame”,这是一个好兆头,如果一个窗口的类名是类似于“Afx:400000:0:10011:10:0”就麻烦了,这是MFC主框架窗口类的典型名字,里面的那些数字是诸如进程地址,窗口图标句柄,鼠标光标句柄格式化成的一个字符串,它是可变的,在某个系统上是一个结果,在另一个系统上可能是另一个结果。再来看看“Source Insight”主窗口的标题文字,发现无论什么情况都包含一个“Source Insight”子串,这对于我们确定这个窗口是否是“Source Insight”主窗口可以起到一个辅助判断的作用。枚举窗口使用EnumWindows() API,这个API使用一个回调函数,以下是回调函数的原型:

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)

下面是“TabSiPlus”中EnumWindowsProc()回调函数的实现:
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
 BOOL bSuccess = TRUE;
 if(hwnd != NULL && IsSourceInsightFrameWnd(hwnd))
 {
  if(lParam)
  {
   HWND *pHwnd = (HWND *)lParam;
   *pHwnd = hwnd;
   bSuccess = FALSE;//已经找到一个Source Insight窗口,退出枚举
  }
 }

return bSuccess;
}
这个函数利用lParam参数将窗口句柄传递出来,它一次只处理一个“Source Insight”窗口,如果系统中有多个“Source Insight”运行,就会有多个“Source Insight”主窗口,这由外部机制驱动枚举函数进行多次枚举,保证对所有的“Source Insight”进行处理。你可能已经看出来这样存在重复发现的问题了,是的,存在这样的问题,不过“TabSiPlus”采用一个巧妙的方法解决了这个问题。“TabSiPlus”在Hook一个“Source Insight”窗口之后就在窗口标题栏添加一个“ with TabSiPlus”的标志,这样就可以区分窗口是否已经处理过了。下面就是判断一个窗口是否是“Source Insight”窗口的IsSourceInsightFrameWnd()函数:

LPCTSTR lpszSourceInsight = _T("Source Insight");
LPCTSTR lpszSiFrameWndClass = _T("si_Frame");
LPCTSTR lpszTextMark = _T(" with TabSiPlus");

BOOL IsSourceInsightFrameWnd(HWND hWnd)
{
 TCHAR szClassName[128],szTitle[256];
 
 int nRtn = GetClassName(hWnd,szClassName,128);
 if(nRtn == 0)
  return FALSE;

nRtn = GetWindowText(hWnd,szTitle,256);
 if(nRtn == 0)
  return FALSE;

//类名是si_Frame,并且窗口标题又含有Source  Insight,可以基本判定是一个Source Insignt窗口
 if((lstrcmp(lpszSiFrameWndClass,szClassName) == 0) && (StrStr(szTitle,lpszSourceInsight) != NULL))
 {
  if(StrStr(szTitle,lpszTextMark) != NULL)//有这个mark说明已经Hook过了,不要再骚扰source insignt窗口了
   return FALSE;

return TRUE;
 }

return FALSE;
}

下面是找到一个“Source  Insight”窗口的调度函数,每次调用一次调度函数可以查询到一个没有被Hook过的“Source  Insight”:
HWND FindSourceInsightFrameWindow()
{
 HWND hSiFrmWnd = NULL;
 
 BOOL bRtn = ::EnumWindows(EnumWindowsProc,(LPARAM)&hSiFrmWnd);
 if(!bRtn && hSiFrmWnd != NULL)
  return hSiFrmWnd;
 else
  return NULL;
}

最后是查找“Source  Insight”窗口并将指定的动态连接库挂到“Source  Insight”进程中的函数:
//一次试图查找并Hook一个Source Insighe窗口
BOOL FindAndHookSourceInsightWindow(LPCTSTR lpszHookDll)
{
 BOOL bSuccess = FALSE;
 if(lpszHookDll)
 {
  HWND hSiFrmWnd = FindSourceInsightFrameWindow();
  if(hSiFrmWnd != NULL)
  {
   bSuccess = HookSourceInsightWindow(hSiFrmWnd,lpszHookDll);
  }
 }
 return bSuccess;
}
这个函数中调用了一个重要的函数:HookSourceInsightWindow(),这个函数负责将我们的代码注入到“Source  Insight”进程中,这涉及到代码远程注入的很多细节,关于代码注入方法将在下一篇:《给Source Insight做个外挂系列之二--将本地代码注入到Source Insight进程》中介绍,本篇到此结束。

Source Insignt文件标签外挂:TabSiPlus的下载地址:
点击下载

给Source Insight做个外挂系列之一--发现Source Insight的更多相关文章

  1. 给Source Insight做个外挂系列之五--Insight “TabSiPlus”

    “TabSiPlus 外挂插件”主要有两部分组成,分别是“外挂插件加载器”和“插件动态库”.“插件动态库”完成Source Insight窗口的Hook,显示Tab标签栏,截获Source Insig ...

  2. 给Source Insight做个外挂系列之三--构建外挂软件的定制代码框架

    上一篇文章介绍了“TabSiPlus”是如何进行代码注入的,本篇将介绍如何构建一个外挂软件最重要的部分,也就是为其扩展功能的定制代码.本文前面提到过,由于windows进程管理的限制,扩展代码必须以动 ...

  3. 给Source Insight做个外挂系列之六--“TabSiPlus”的其它问题

    关于如何做一个Source Insight外挂插件的全过程都已经写完了,这么一点东西拖了一年的时间才写完,足以说明我是一个很懒的人,如果不是很多朋友的关心和督促,恐怕是难以完成了.许多朋友希望顺着本文 ...

  4. 给Source Insight做个外挂系列之四--分析“Source Insight”

    外挂的目的就是将代码注入到其它进程中,所以必须要有目标进程才能完成注入,而所谓的目标进程通常是某软件的一部分或者是全部,所以要对目标程序有深入地了解.一般外挂都是针对某个应用程序开发的,其装载.运行都 ...

  5. 给Source Insight做个外挂系列之二--将本地代码注入到Source Insight进程

    上一篇文章介绍了如何发现正在运行的“Source Insight”窗口,本篇将介绍“TabSiPlus”是如何进行代码注入的.Windows 9x以后的Windows操作系统都对进程空间进行了严格的保 ...

  6. 【转】使用XCODE 的SOURCE CONTROL 做版本控制 (1)

    原文网址:http://it.zhaozhao.info/archives/60469 有一次笔者在开心项目准备尝试新的练习的时候,赫然注意到在选择档案存放位置的时候,下面有个Source Contr ...

  7. Source Insight 4 中文乱码的解决办法(source insight 3.5 及以下版本就到其他地方看看吧)

    干货:Source Insight 4 中文乱码的解决办法(source insight 3.5 及以下版本就到其他地方看看吧) [解决办法]: 菜单栏中[File]->[Reload As E ...

  8. Python论做游戏外挂,Python输过谁?

    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢? 我打开了4399小游戏网,点开了一个不知名的游戏,唔,做寿司的,有材料在一边,客人过来后说出他们的要求,你按照菜 ...

  9. 一看就会一做就废系列:说说 RECOVER UNTIL CANCEL

    这里是:一看就会,一做就废系列 数据库演示版本为 19.3 (12.2.0.3) 该系列涉及恢复过程中使用的 5 个语句: 1. recover database 2. recover databas ...

随机推荐

  1. iOS8系统H264视频硬件编解码说明

    公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会 ...

  2. HTML是什么?如何使用?

    ①我们首先打开桌面DW网页开发器. 也可以是其他的开发器. ②打开之后那么我们创建一个新的文档: 点击创建之后出现下图: 一般我们不管用哪种网页开发器,都会最先呈现上图的状态,那么下面来解读一下这些文 ...

  3. 51nod1256(乘法逆元)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...

  4. Lattice FPGA 板子 调试笔记

    最近在调试LATTICE  FPGA 做的视频板子,颇不顺利,所以记录下来作为以后的参考: 1.FPGA的IO口不是所有的都是双向的,有些有特殊作用的是单向的. 在查阅 LatticeECP3-17E ...

  5. 笔记本双系统XP与Ubuntu,重装XP后如何恢复grup引导,另附操作系统启动过程

    背景:笔记本双系统(XP与Ubuntu),其中XP系统因问题重装了一下,重装后不能识别Ubuntu系统(该系统装在另一个磁盘中),直接进入了XP系统. 解决办法:利用U盘(Ubuntu系统)启动机器, ...

  6. 卸载 ibus 使Ubuntu16.04任务栏与启动器消失 问题解决

    经查证是unity误卸载了,我使用了命令: sudo apt-get remove --purge ibus 解决方法是: 使用以下命令:重置compiz: dconf reset -f /org/c ...

  7. Power BI for Office 365(八)共享查询

    在Power Query中,你不但可以搜索线上的数据,也可以把自己的数据发布到线上供其它人检索.Power Query通过Power BI站点提供了这种内置的分享功能.在Excel中,Anna打开了她 ...

  8. 情人节那点事,Power BI告诉你

    情人节伴随着元宵节刚刚过去,Power BI团队就送给我们一份大礼,利用来自NRF(national retail foundation)和Bing搜索的数据,在Power BI中帮助我们发现在美国那 ...

  9. WPF使用IDataErrorInfo进行数据校验

    这篇博客将介绍如何使用IDataErrorInfo进行数据校验.下面直接看例子.一个Customer类,两个属性(FirstName, Age) class Customer { public str ...

  10. HTTP错误500.19-定义了重复的节点

    打开服务器的asp.net页面时出现这个错误: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效.   解决办法: 打开II ...