`
ldb19890624
  • 浏览: 243581 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

给Source Insight做个外挂之一--发现Source Insight

 
阅读更多

作者:星轨(oRbIt)
E_Mail:inte2000@163.com

<!-- Search Google -->
Google 输入您的搜索字词 提交搜索表单
<!-- Search Google -->

一提到外挂程序,大家肯定都不陌生,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 3.5 UTF-8中文乱码插件_sourceinsight3.5_utf-8_插件补丁_中文乱码_

    源洞察(Source Insight)是一款广泛使用的源代码阅读和分析工具,尤其受到程序员和软件开发者们的喜爱。它提供了强大的代码导航...对于依赖Source Insight进行日常工作的中国开发者来说,这是一个非常实用的解决方案。

    SourceInsight 完美的配色方案 theme-Monokai 主题

    **SourceInsight是一款强大的源代码阅读和编辑工具,尤其在编程和软件开发领域中被广泛使用。它提供了丰富的功能,包括语法高亮、代码跳转、自动完成等,极大地提升了程序员的工作效率。Monokai主题是其中一种广受...

    pc-lint用于sourceinsight上静态代码检测

    **正文** 在软件开发过程中,静态代码分析是一种重要的质量保证手段,它能够在代码执行...总之,PC-lint与Source Insight的结合使用,为开发者提供了一个强大且直观的静态代码分析环境,有助于实现高质量的C/C++编程。

    Source Insight 3支持Utf-8

    Source Insight 3是一款广受欢迎的源代码阅读器和编辑器,尤其在软件开发领域中,它为程序员提供了强大的代码浏览、分析和编辑功能。对于处理各种编码格式的源代码文件,Source Insight 3表现出了良好的兼容性,其中...

    Astyle集成到sourceinsight指导说明

    Astyle集成到SourceInsight指导...Astyle是一个功能强大且灵活的编码格式化程序,通过将其集成到SourceInsight中,可以提高代码的可读性和维护性。同时,Astyle也可以与其他集成开发环境集成,以满足不同的开发需求。

    sourceinsight-3.5-window7-64-汉化

    幸运的是,我们有了“sourceinsight-3.5-window7-64-汉化”这个资源,它为SourceInsight 3.5在Windows 7 64位系统上提供了汉化支持。 首先,我们需要了解SourceInsight 3.5的基本功能。它支持多种编程语言,包括C/...

    解决source insight3.5不支持中文utf8问题

    在IT行业中,源代码阅读和分析工具Source Insight是一款广受欢迎的软件,特别是在C、C++、Java等编程语言的开发和维护中。然而,对于中文支持的问题,Source Insight 3.5版本曾经存在一些困扰用户的局限性,尤其是当...

    source insight UTF-8插件

    总之,"source insight UTF-8插件"是一个针对性的解决方案,旨在增强Source Insight对UTF-8编码的支持,特别是在处理中文内容时。通过正确安装和使用这个插件,用户可以享受到更顺畅的代码阅读和编辑体验,消除语言...

    linux Ubuntu下安装 Source insight

    Wine是一个开源的实现了Windows API的软件,可以让Linux平台下运行Windows应用程序。使用以下命令安装Wine: `sudo apt-get install wine` 二、安装Source Insight --------------------- 安装Wine后,可以使用...

    SourceInsight4配色xml文件-深色

    标题提到的"SourceInsight4配色xml文件-深色",意味着这是针对SourceInsight4版本的一个深色调的配色方案。深色主题通常被认为对长时间编程的眼睛更为友好,因为它可以减少屏幕反射,减轻眼睛疲劳。深色背景与浅色...

    Source Insight 插件 UTF-8

    Source Insight 插件,解决SI UTF-8中文显示乱码问题。 Source Insight Patch File, solve display wrong code when using UTF-8 chinese charater

    sourceinsight_4.0.86.0-setup.zip

    3. 跳转和查找:使用F3可以跳转到下一个引用,Shift+F3则返回上一个引用。Ctrl+G可以快速定位到指定行号。 4. 智能提示:在编写代码时,按Ctrl+空格可以触发智能提示,显示可能的函数或变量选择。 5. 代码修改:...

    sourceinsight-scan

    SourceInsight-Scan 是一个强大的代码扫描工具,旨在帮助开发者快速扫描和检测代码中的错误和问题。下面将详细介绍 SourceInsight-Scan 的配置和使用方法。 安装 首先,需要安装 SourceInsight-Scan 软件。双击...

    source Insight---- Quicker

    `source Insight quicker.em`是一个增强型插件,用于优化Source Insight的默认功能。将`quicker.em`文件复制到Source Insight的安装目录下的`User Settings`或`Config`文件夹,然后重启Source Insight以应用更改。 ...

    Source Insight 语言文件 -- MIPS ASM

    `GLOBAL_090424.CF3` 文件可能是另一个与Source Insight相关的语言文件,可能包含了全局配置或者与其他编程语言的设置。CF3格式是Source Insight的早期版本中使用的配置文件格式,它也用于定义代码的显示样式和行为...

    Source Insight 4.0仿Boxy的Solarized-Dark主题

    Source Insight 4.0的仿Boxy Solarized-Dark主题结合了流行的颜色方案和界面风格,旨在为开发者提供一个既美观又实用的工作环境。通过理解和应用这个主题,用户不仅可以提升编程时的视觉体验,还能更好地融入自己的...

    sourceinsight-4.0.86.0-密码123.zip

    版本4.0.86.0是SourceInsight的一个特定更新版本,可能包含了性能优化、新功能或修复了某些已知问题。 该压缩包文件“sourceinsight-4.0.86.0-密码123.zip”和“sourceinsight_4.0.86.0_密码123.zip”显然包含了...

    Source Insight Theme 自用不刺眼舒适黑色主题

    这个“Source Insight Theme 自用不刺眼舒适黑色主题”就是为了改善这一问题,提供一个更加护眼且舒适的编程环境。 该主题是基于Source Insight 4.0版本进行定制的,经过精心调整,确保在保证代码可读性的同时,...

    SourceInsight_双语版(中文-英文)

    SourceInsight是一款强大的源代码阅读和编辑工具,尤其适合程序员在开发C/C++、Java等编程语言项目时使用。这款软件以其高效、直观的特性,为程序员提供了深入理解代码结构、追踪代码依赖关系以及实时分析代码的便利...

Global site tag (gtag.js) - Google Analytics