`
jhq470hs
  • 浏览: 17525 次
社区版块
存档分类
最新评论

vc++ 向其他进程注入代码的三种方法(转)

 
阅读更多

vc++ 向其他进程注入代码的三种方法(转)
2010年06月29日
  vc++ 向其他进程注入代码的三种方法
  导言:
  我们在Code project上可以找到许多密码间谍程序(那些可以看到别的程序中密码框内容的软件),他们都依赖于Windows钩子技术。要实现这个还有其他的方法吗?有!但是,首先,让我们简单回顾一下我们要实现的目标,以便你能弄清楚我在说什么。
  要读取一个控件的内容,不管它是否属于你自己的程序,一般来说需要发送 WM_GETTEXT 消息到那个控件。这对edit控件也有效,但是有一种情况例外。如果这个edit控件属于其他进程并且具有 ES_PASSWORD 风格的话,这种方法就不会成功。只有“拥有(OWNS)”这个密码控件的进程才可以用 WM_GETTEXT 取得它的内容。所以,我们的问题就是:如何让下面这句代码在其他进程的地址空间中运行起来:
  ::SendMessage( hPwdEdit, WM_GETTEXT, nMaxChars, psBuffer );
  一般来说,这个问题有三种可能的解决方案:
  1. 把你的代码放到一个DLL中;然后用 windows 钩子把它映射到远程进程。
  2. 把你的代码放到一个DLL中;然后用 CreateRemoteThread 和 LoadLibrary 把它映射到远程进程。
  3. 不用DLL,直接复制你的代码到远程进程(使用WriteProcessMemory)并且用CreateRemoteThread执行之。在这里有详细的说明:
  Ⅰ. Windows 钩子
  示例程序:HookSpy 和 HookInjEx
  Windows钩子的主要作用就是监视某个线程的消息流动。一般可分为:
  1. 局部钩子,只监视你自己进程中某个线程的消息流动。
  2. 远程钩子,又可以分为:
  a. 特定线程的,监视别的进程中某个线程的消息;
  b. 系统级的,监视整个系统中正在运行的所有线程的消息。
  如果被挂钩(监视)的线程属于别的进程(情况2a和2b),你的钩子过程(hook procedure)必须放在一个动态连接库(DLL)中。系统把这包含了钩子过程的DLL映射到被挂钩的线程的地址空间。Windows会映射整个DLL而不仅仅是你的钩子过程。这就是为什么windows钩子可以用来向其他线程的地址空间注入代码的原因了。
  在这里我不想深入讨论钩子的问题(请看MSDN中对SetWindowsHookEx的说明),让我再告诉你两个文档中找不到的诀窍,可能会有用:
  1.当SetWindowHookEx调用成功后,系统会自动映射这个DLL到被挂钩的线程,但并不是立即映射。因为所有的Windows钩子都是基于消息的,直到一个适当的事件发生后这个DLL才被映射。比如:
  如果你安装了一个监视所有未排队的(nonqueued)的消息的钩子(WH_CALLWNDPROC),只有一个消息发送到被挂钩线程(的某个窗口)后这个DLL才被映射。也就是说,如果在消息发送到被挂钩线程之前调用了UnhookWindowsHookEx那么这个DLL就永远不会被映射到该线程(虽然SetWindowsHookEx调用成功了)。为了强制映射,可以在调用SetWindowsHookEx后立即发送一个适当的消息到那个线程。
  同理,调用UnhookWindowsHookEx之后,只有特定的事件发生后DLL才真正地从被挂钩线程卸载。
  2.当你安装了钩子后,系统的性能会受到影响(特别是系统级的钩子)。然而如果你只是使用的特定线程的钩子来映射DLL而且不截获如何消息的话,这个缺陷也可以轻易地避免。看一下下面的代码片段:
  BOOL APIENTRY DllMain( HANDLE hModule,
  DWORD  ul_reason_for_call,
  LPVOID lpReserved )
  {
  if( ul_reason_for_call == DLL_PROCESS_ATTACH )
  {
  //用 LoadLibrary增加引用次数
  char lib_name[MAX_PATH];
  ::GetModuleFileName( hModule, lib_name, MAX_PATH );
  ::LoadLibrary( lib_name );
  // 安全卸载钩子
  ::UnhookWindowsHookEx( g_hHook );
  } 
  return TRUE;
  }
  我们来看一下。首先,我们用钩子映射这个DLL到远程线程,然后,在DLL被真正映射进去后,我们立即卸载挂钩(unhook)。一般来说当第一个消息到达被挂钩线程后,这DLL会被卸载,然而我们通过LoadLibrary来增加这个DLL的引用次数,避免了DLL被卸载。
  剩下的问题是:使用完毕后如何卸载这个DLL?UnhookWindowsHookEx不行了,因为我们已经对那个线程取消挂钩(unhook)了。你可以这么做:
  ○在你想要卸载这个DLL之前再安装一个钩子;
  ○发送一个“特殊”的消息到远程线程;
  ○在你的新钩子的钩子过程(hook procedure)中截获该消息,调用FreeLibrary 和(译者注:对新钩子调用)UnhookwindowsHookEx。
  现在,钩子只在映射DLL到远程进程和从远程进程卸载DLL时使用,对被挂钩线程的性能没有影响。也就是说,我们找到了一种(相比第二部分讨论的LoadLibrary技术)WinNT和Win9x下都可以使用的,不影响目的进程性能的DLL映射机制。
  但是,我们应该在何种情况下使用该技巧呢?通常是在DLL需要在远程进程中驻留较长时间(比如你要子类[subclass]另一个进程中的控件)并且你不想过于干涉目的进程时比较适合使用这种技巧。我在HookSpy中并没有使用它,因为那个DLL只是短暂地注入一段时间
分享到:
评论

相关推荐

    向进程注入自己的代码

    向进程注入自己的dll 带有测试dll 路径和要注入的程序可以自己改 hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD| //允许远程创建线程 PROCESS_VM_OPERATION | //VM操作 PROCESS_VM_WRITE , //允许写 ...

    实现进程注入的示例代码

    实现进程注入的示例代码 实现注入的代码 有c# vb6 和 vc++6 三个版本 注入的dll是用vc++写的一个dll 也附带源码 【测试的dll】 编译的是被注入的dll代码 其他三个文件夹是三种实现注入的语言 需要再代码中修改下...

    DLL注入、输入法与键盘HOOK

    DLL注入、输入法与键盘HOOK.rar

    进程注入示例代码--想学彩虹QQ的请进

    vc++代码,演示了几种进程注入的方法,完整VC++代码,可以在vc6.0下面编译运行,想研究进程注入,比如想编写彩虹QQ等程序等的,应该有很大的参考价值。

    VC++进程注入

    跟博客的代码一致,附加的door.dll的工程

    收集几款VC++代码注入程序

    内容索引:VC/C++源码,其它分类,HOOK,钩子 收集几款VC++代码注入程序,不同时期的都有,通过这些示例你会明白如何将代码注入不同的进程地址空间,随后在该进程的上下文中执行注入的代码。这里主要是三种方法:  1、...

    郁金香vc过驱动保护

    这三个函数的HOOK方式与上一个版本一样,就是上面蓝色字体的方法,把本应该call ObOpenObjectByPointe的代码修改成了call他自己的代码, 然后在他自己的代码中处理保护的进程 上面三个函数,原来正常的代码为 80581ce3 ...

    郁金香VC++初级、中级、进阶、高级+过驱动保护全套教程(已过期)

    2.2.4、远程注入代码,调用打坐CALL; 2.2.5、实例分析:找技能栏对象数组基址+偏移: 2.2.6: 拦截F1-F8功能CALL 2.3、外挂框架构建 2.3.1、DLL动态链接库构建,与调用 2.3.2、API与回调函数 2.3.3、DLL...

    VC++写的APIHook实例源代码

    内容索引:VC/C++源码,系统相关,HOOK,钩子 VC++写的APIHook实例源代码,大致翻了一下,只挂引入表的函数,注入有SetWindowHookEx和CreateRemoteThread两种方式,进程枚举也区分了不同系统下使用的psai和toolhelp,...

    Windows应用程序捆绑核心编程光盘代码

    8.3.2 向PE文件中静态注入代码的完整实例 183 8.4 如何实现文件脱壳 191 8.5 本章小结 192 参考文献 192 第9章 应用程序的动态挂钩 193 9.1 动态挂钩概述 193 9.2 使用Windows钩子函数挂钩 194 9.2.1 Windows...

    Windows环境下32位汇编语言程序设计_随书光盘

    用 DLL 注入的方法实现远程进程 Chapter13\RemoteThread ;不依靠任何外部文件实现远程进程 Chapter14\TopHandler ;使用筛选器处理异常 Chapter14\SEH01 ;最基本结构化异常处理例子 Chapter14\SEH02 ;改进后的结构化...

    易语言 v4.13 黑月专用特别版

     5、黑月的Dll可以使用类似其它语言DLLMAIN入口函数(黑月为“Dll入口函数”),可以通过Dll的模块句柄访问Dll的PE资源、注入进程、多线程应用等等优点。  6、黑月可以突破易语言自身的限制,实现对__cdecl调用...

    Windows编程循序渐进源码

     第14章,进程间通信:介绍共享内存、管道等进程间通信方式的原理与实现方法。  第15章,线程同步:介绍多种线程同步技术,包括使用内核对象实现线程同步。  第16章,动态链接库:介绍DLL的基本原理,包括TLS...

    补丁模块(带源码)InlinePatch,Hook,内存DLL注入等等

    子程序 InjectDll, 逻辑型, 公开, 向目标进程中注入一个指定 Dll 模块文件;注入成功返回 true, 注入失败则返回 false,CreateRemoteThread法 .参数 进程ID, 整数型, , 进程PID .参数 DLL文件名, 文本型, , 欲注入的...

    加密解密.技术内幕.chm

    3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个进程中注入代码3.2 利用调试API编写脱壳机 ...

    Windows环境下32位汇编语言程序设计(最新琢石成器版)附属光盘

    用 DLL 注入的方法实现远程进程 Chapter13\RemoteThread ;不依靠任何外部文件实现远程进程 Chapter14\TopHandler ;使用筛选器处理异常 Chapter14\SEH01 ;最基本结构化异常处理例子 Chapter14\SEH02 ;改进后的...

    软件加密技术内幕 chm

    3.1.7 如何在另一个进程中注入代码 3.2 利用调试API编写脱壳机 3.2.1 tElock 0.98脱壳简介 3.2.2 脱壳机的编写 3.3 利用调试API制作内存补丁 3.3.1 跨进程内存存取机制 3.3.2 Debug API机制 第4章 ...

    软件加密技术内幕

    3.1.7 如何在另一个进程中注入代码 3.2 利用调试API编写脱壳机 3.2.1 tElock 0.98脱壳简介 3.2.2 脱壳机的编写 3.3 利用调试API制作内存补丁 3.3.1 跨进程内存存取机制 3.3.2 Debug API机制 第4章 ...

Global site tag (gtag.js) - Google Analytics