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

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

 
阅读更多
<!-- Search Google -->
Google 输入您的搜索字词 提交搜索表单
<!-- Search Google -->
上一篇文章介绍了“TabSiPlus”是如何进行代码注入的,本篇将介绍如何构建一个外挂软件最重要的部分,也就是为其扩展功能的定制代码。本文前面提到过,由于windows进程管理的限制,扩展代码必须以动态链接库的形式挂载到被挂程序的进程空间中,使用上一篇介绍的方法已经可以通过创建远程线程的方式启动一个线程,让这个线程加载我们的定制动态链接库,现在就看看这个动态链接库是如何实现的。

首先这是一个动态链接库,因为考虑到扩展功能中有大量的界面操作,所以选择支持MFC,同时,还要提供一个名为“InitFunc”的导出函数,供在被挂程序中启动的远程线程调用,以初始化外挂动态链接库,这个导出函数的原型是这样的:
typedef DWORD (WINAPI *PFN)();
没有参数,但是有一个返回值用于表示初始化是否成功。现在就用Visual C++的向导生成一个支持MFC的动态链接库的框架,并手工添加一个名为“InitFunc”的导出函数,如果你还不清楚怎么做,那么可以停止看本文了,因为本文可能对你毫无用处。

在生成的代码中,MFC对DllMain进行了封装,所以有了一个CxxxApp的类,xxx与你的动态链接库的名字一致,TabSiPlus使用的是CTabSiPlusApp,现在有三个地方需要特别注意,一个是CTabSiPlusApp::InitInstance(),一个是CTabSiPlusApp::ExitInstance(),另一个就是我们的导出函数“InitFunc”。当远程线程中LoadLibrary()调用我们的定制动态链接库时,CTabSiPlusApp::InitInstance()被调用,当FreeLibrary()调用发生时,CTabSiPlusApp::ExitInstance()被调用,当然,伴随而出现的还有两个函数调用,那就是CTabSiPlusApp类的构造函数和析构函数,部分初始化代码也可以放在构造函数中完成,不过并不推荐这样做,因为如果因为构造函数触发异常导致LoadLibrary()失败,那么随后的析构函数也不会被调用,因为构造函数没有完成对象的构造,同时,由于LoadLibrary()失败,使得FreeLibrary()调用分支没有执行,那么导致CTabSiPlusApp::ExitInstance()也没有被调用,这会引起资源释放的异常。

很显然,CTabSiPlusApp::InitInstance()的调用发生在InitFunc函数的调用之前,所以要控制好初始化代码之前的先后关系。CTabSiPlusApp::InitInstance()中布置对资源初始化的代码,而诸如创建文件标签栏窗口,Hook “Source Insight”窗口消息,管理这些消息的代码则可以布置到InitFunc函数中实现。这里需要注意的是由于我们的外挂代码是以动态链接库的形式挂载到“Source Insight”进程中的,所以它没有消息循环,所有的窗口UI系统无法正常工作,解决的办法有两个,一个是在InitFunc函数创建窗口之后人为地添加一个消息循环,关于这一点如何实现可以参考Windows SDK编程的方法;另一个方法就是不要把主要的工作放在InitFunc,而是在InitFunc函数中再创建一个本地线程,把窗口UI这些麻烦的东西放在这个线程中处理,这样就可以利用这个线程的消息循环使窗口UI系统工作起来,这样做还有一个好处,就是InitFunc函数可以立即返回,加载外挂的宿主程序也可以及时得到外挂的加载情况,以便根据情况安排下一次加载动作(就是调用CreateRemoteThread()),同时还可以及时释放在被挂程序中分配的内存。TabSiPlus就是采用的第二种方法,下面就是TabSiPlus的InitFunc函数实现,当然省去了一些代码,主要核心就是一行:

DWORD WINAPI InitFunc()
{
//其它初始化操作
g_pTabWndUIThread = (CTabWndUIThread *)AfxBeginThread(RUNTIME_CLASS(CTabWndUIThread),THREAD_PRIORITY_NORMAL,0,0,NULL);
//其它操作

return (g_pTabWndUIThread != NULL);
}

在CTabWndUIThread类的InitInstance()函数中创建标签栏窗口,hook “Source Insight”中相关窗口的消息:

BOOL CTabWndUIThread::InitInstance()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

g_pSiFrameWnd = new CSIFrameWnd(); //CWnd::FromHandle(hDevStudioWnd);
g_pSiFrameWnd->Attach(hWndSIFrame); //hook SI主窗口

HWND hMDIWnd = g_pSiFrameWnd->GetMDIClientWnd();

//UINT uThressID = GetCurrentThreadId();
// create the tabs window
m_pTabbarWnd = new CTabBarsWnd();
m_pTabbarWnd->Create(CWnd::FromHandle(g_pSiFrameWnd->GetSafeHwnd()),
RBS_BANDBORDERS | RBS_AUTOSIZE | RBS_FIXEDORDER | RBS_DBLCLKTOGGLE,
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CBRS_TOP | CBRS_SIZE_FIXED, AFX_IDW_REBAR );

m_pMainWnd = m_pTabbarWnd;//这很重要,否则这个线程就无法退出
g_pSiFrameWnd->SetTabbarWnd(m_pTabbarWnd->GetSafeHwnd());
g_MdiChildMng.SetTabbarWnd(m_pTabbarWnd->GetSafeHwnd());

m_pTabbarWnd->SetWindowPos(CWnd::FromHandle(hMDIWnd)->GetWindow(GW_HWNDPREV), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

g_pSiMDIClientWnd = new CSiMDIWnd();
g_pSiMDIClientWnd->SetTabbarWnd(m_pTabbarWnd->GetSafeHwnd());
DebugTracing(gnDbgLevelNormalDebug,_T("MDI Client Attach..."));
g_pSiMDIClientWnd->Attach(hMDIWnd);
DebugTracing(gnDbgLevelNormalDebug,_T("MDI Client Enum..."));
g_pSiMDIClientWnd->EnumMdiChildWnd(g_MdiChildMng,TRUE);
DebugTracing(gnDbgLevelNormalDebug,_T("MDI Client Enum end (%d)"),g_MdiChildMng.GetChildCount());
pGlobalActiveSIWindow = g_MdiChildMng.LookupMdiChild(g_pSiMDIClientWnd->MDIGetActive(NULL));
g_pSiMDIClientWnd->SetManaging(true);

return TRUE;
}

是不是很象标准单文档结构的MFC程序中的CxxxApp::InitInstance()函数?特别是对m_pMainWnd的赋值?对m_pMainWnd赋值其实很重要,否则线程就会直接退出,对m_pMainWnd赋值还有一个好处,就是关闭m_pTabbarWnd窗口就会中止CTabWndUIThread线程,这和标准单文档结构的MFC程序中的结果一样。

CTabWndUIThread::InitInstance()函数中有很多是对“Source Insight”内部窗口进行hook的代码,那么TabSiPlus是如何得到这些窗口的句柄呢,又是如何关联它们之间的消息呢,请看下篇:给Source Insight做个外挂系列之四--分析“Source Insight”



Source Insignt文件标签外挂:TabSiPlus的下载地址:
http://blog.csdn.net/orbit/
分享到:
评论

相关推荐

    Source Insight4.rar

    《Source Insight 4:软件框架解析与应用》 Source Insight 4是一款强大的源代码阅读、分析和编辑工具,尤其在软件开发领域广受好评。它以其高效、智能的特性,帮助程序员快速理解复杂的代码结构,提升开发效率。...

    如何在Source Insight中集成CppCheck静态代码分析工具教程

    ### 如何在Source Insight中集成CppCheck静态代码分析工具教程 #### 一、安装与配置CppCheck **1. 下载与安装CppCheck** - 访问官方网址:[http://cppcheck.net/](http://cppcheck.net/),根据您的操作系统选择32...

    Source Insight 4.0.0086 Patched 86版工具下载

    Source Insight的核心功能之一是其强大的代码分析引擎。它能够快速地解析和索引项目中的源代码,提供实时的语法高亮、自动完成和跳转功能。在4.0.0086版本中,这一功能得到了进一步优化,支持更多的编程语言和框架...

    springsource-insight含有的所有jar包

    标题 "springsource-insight含有的所有jar包" 提供的信息是这个压缩包包含了与SpringSource Insight相关的所有Java档案(JAR)文件。SpringSource Insight是一款用于深入理解应用程序运行时行为的工具,它主要针对...

    Linux软件开发环境.pdf

    Linux作为一款开放源代码的操作系统,已经被广泛应用于服务器、桌面、嵌入式系统等多个领域,它的软件开发环境也异常活跃和丰富,涵盖了从代码管理到构建、调试、测试、文档编写、性能分析等软件开发的各个阶段。...

    一个HelloWorld界面程序例子

    【压缩包子文件的文件名称列表】中包含了"bin"、"DuiLib"和"Debug"这三个文件夹。这给我们提供了关于项目结构的一些线索: - "bin"通常是存放可执行文件的目录,这些文件可以直接运行。在编译完成后,编译器会把...

    ZStack试验介绍

    4. **替换hal_lcd.c文件**:为了确保液晶显示屏的正常工作,需要将附件中的`hal_lcd.c`文件替换到三个特定的文件夹中: - `C:\TexasInstruments\ZStack-CC2530-2.3.0-1.4.0\Components\hal\target\CC2530EB\` - `C...

    groovy 最新 学习 动态

    Grails是一个基于Groovy的全栈框架,用于构建现代Web应用程序。它集成了Spring、Hibernate等流行的技术,使得开发者能够快速构建功能丰富的应用。Grails的GORM(Groovy Object Relational Mapping)提供了简洁的数据...

    半条命的源代码

    - **Source Insight 3.5**:一款强大的源代码浏览器和编辑器,能够帮助开发者更好地理解和管理源代码。 - **VC6 + SP5**:安装VC6并更新到服务包5后,可通过运行`dev_build_all.bat`脚本来构建项目。 需要注意的是...

    AStyle_3.1_windows

    Source Insight是一款流行的代码阅读和编辑软件,尤其受到程序员的青睐,因为它提供了快速的代码导航、查找和理解功能。通过将AStyle作为插件,用户可以在Source Insight内部方便地对源代码进行格式化,无需离开编辑...

    选项卡插件

    9. **库和框架**:很多开发者会使用现有的JavaScript库或框架,如jQuery、React、Vue或Angular,来快速构建选项卡插件。这些库提供了便利的工具和API,简化了开发过程。 10. **代码优化**:为了提高性能,选项卡...

    docker-workshop:Insight的Docker研讨会的方向和源代码-docker source code

    该存储库包含Insight Data Science的Docker研讨会的内容和方向。 该研讨会的目的是向参与者介绍基础知识,并帮助人们开始构建容器。为此,我们将从基础知识开始,最后部署由Jupyter笔记本服务器和PostgreSQL组成的...

    springsource-tool-suite-2.7.1.RELEASE-e3.7-win32.zip

    SpringSource Tool Suite 2.7.1.RELEASE-e3.7-win32.zip 是一个针对Windows平台的软件包,主要用于开发基于Spring框架的应用程序。这个压缩包包含了SpringSource Tool Suite (STS) 的2.7.1版本,它是一个集成开发...

    springsource-tool-suite-3.9.11.RELEASE-e4.14.0-up.zip

    在使用STS时,开发者还可以利用内置的Spring Insight工具进行性能分析,通过Spring Roo快速生成项目结构,或者借助Maven和Gradle的集成进行自动化构建。此外,STS还支持与其他Java框架的集成,如Hibernate、MyBatis...

    Qt 实现 微软记事本

    【压缩包子文件的文件名称列表】"SourceInsight-build-desktop"和"SourceInsight"可能是开发过程中使用的源代码管理工具或调试辅助软件。SourceInsight是一款流行的源代码查看和分析工具,常被程序员用来阅读、理解...

    mtk软件环境的搭建说明.doc

    - **安装**: SourceInsight用于方便地对源代码进行分析和修改。 #### 二、调试环境介绍 **2.1 DOS环境下的编译** - **编译命令**: 使用以下命令在DOS环境下编译整个软件系统: - `make [custom=customname] ...

    Android源码——快捷查询源码.zip

    - AOSP浏览器(如Source Insight或Eclipse ADT)提供更丰富的代码导航功能。 5. **快速查询技巧**: - 理解AOSP模块间的依赖关系,有助于定位源码位置。 - 查看Android.mk和Android.bp构建文件,了解模块编译...

    Linux 开发环境工具 指导

    本文将详细介绍一系列Linux下的开发工具,涵盖集成开发环境、代码索引工具、调试器、评测器、代码静态检查工具、代码静态测量工具、软件构建系统、交叉工具链、代码版本控制系统、测试框架、代码差异工具、代码在线...

    C语言OOP编程.pptx

    Source insight 是一款广泛使用的C/C++代码编辑器,它提供了强大的代码浏览和分析功能。LS库是由深圳市乐视科技的梁先生开发的一个宏语言扩展,用于增强Source insight的功能。这个库包含超过一万行的宏语言,使得C...

Global site tag (gtag.js) - Google Analytics