远程注入手段 及 内存操作

转载 2015年11月19日 09:48:42
有两个函数可以用来实现上述功能:VirtualAllocEx和CreateRemoteThread。这两个函数都只能在Windows NT下使用。
VirtualAllocEx函数可以用来在其他进程的地址空间内申请内存,当然申请到的内存也是位于目标进程的地址空间内的,将这个函数和WriteProcessMemory函数配合就可以在目标进程的地址空间中“造”出任何东西来。

VirtualAllocEx函数是VirtualAlloc的扩充,相比之下,VirtualAllocEx函数多了一个参数hProcess,其他参数定义和使用的方法都和VirtualAlloc函数相同,新增的hProcess参数用来指定要申请内存的进程句柄,如果需要在目标进程中使用VirtualAllocEx函数,那么必须对进程拥有PROCESS_VM_OPERATION权限。

如果内存申请成功,函数返回一个指针,指向申请到的内存块,当然这个指针是针对目标进程的地址空间的。如果内存申请失败,函数返回NULL。

CreateRemoteThread函数用来在其他进程内创建一个线程,当然创建的线程是运行于目标进程的地址空间内的,它和目标进程自己创建的线程并没有什么区别。


该函数是CreateThread函数的扩充,与CreateThread相比,CreateRemoteThread函数多了一个hProcess参数,其他所有参数的定义和用法都与CreateThread的参数相同。hProcess用来指定要创建线程的目标进程句柄。注意:lpStartAddress指向的线程函数的地址是位于目标进程的地址空间内的。如果需要在目标进程中使用CreateRemoteThread函数,那么必须对进程拥有PROCESS_CREATE_THREAD权限。

使用VirtualAllocEx和CreateRemoteThread函数,再配合WriteProcessMemory函数,就能够让一段代码在其他进程中运行,由于远程线程是属于目标进程的,所以在任务管理器中不会产生新的进程,事实上,谁也不会发现列出的某个进程中会多了一个不属于它自己控制的线程。整个实现的过程归纳如下:


(1)使用VirtualAllocEx函数在目标进程中申请一块内存,内存块的长度必须能够容纳线程使用的代码和数据,内存块的属性应该是PAGE_EXECUTE_READWRITE,这样拷贝到内存块中的代码就可以被执行。


(2)使用WriteProcessMemory函数将需要在远程线程中执行的代码(包括它使用的数据)拷贝到第(1)步申请到的内存块中。


(3)使用CreateRemoteThread函数创建远程线程。



下面再记录下一个部分内容:

ReadProcessMemory与WriteProcessMemory

首先介绍一个函数VirtualProtectEx,它用来改变一个进程的虚拟地址中特定页里的某一区域的保护属性,这句话有些咬嘴,直接从MSDN中翻译过来的,简单来说就是改变某一进程中虚拟地址的保护属性,如果以前是只读的,那改变属性为PAGE_EXECUTE_READWRITE后,就可以更改这部分内存了。


具体看它的实现


BOOL WINAPI VirtualProtectEx(
  __in   HANDLE hProcess,
  __in   LPVOID lpAddress,
  __in   SIZE_T dwSize,
  __in   DWORD flNewProtect,
  __out  PDWORD lpflOldProtect
);


第一个参数是进程的句柄,这个句柄可以使用由CreateProcess()函数得到的PROCESS_INFORMATION结构中的hProcess成员,CreateProcess()这个函数相信大家用的很多了,我就不详细介绍了。如果仅仅知道hProcess的ID,那么可以通过OpenProcess()函数得到,OpenProcess()有三个参数,最后一个参数就是进程的ID,它的返回值为进程的句柄。如果想得到线程的句柄,同样可以采用这两种方式,利用结构体PROCESS_INFORMATION重的hThread成员或使用函数OpenThread()。


第二个参数lpAddress就是页中要改变保护属性的地址。第三个参数dwSize改变保护属性区域的大小,以字节为单位。通过这两个变量就可以确定要改变包括属性的区域了。


第四个参数fNewProtect是要改变的保护属性。包含PAGE_EXECUTE_READWRITE,PAGE_READONLY等,但先看第五个参数lpfOldProtect,是用来保存为改变之前的内存区域的保护属性,也就是说我们可以先备份之前的保护属性,然后将属性更改为PAGE_EXECUTE_READWRITE,然后对内存区域进行一些操作,然后再将内区域更改回来。


 


接下来看ReadProcessMemory()函数


BOOL WINAPI ReadProcessMemory(
  __in   HANDLE hProcess,
  __in   LPCVOID lpBaseAddress,
  __out  LPVOID lpBuffer,
  __in   SIZE_T nSize,
  __out  SIZE_T *lpNumberOfBytesRead
);


第一个参数hProcess为进程的句柄,第二个参数lpBaseAddress为要读取内容的基地址,当然你事先要了解你要读取内容的基地址。第三个参数lpBuffer为接收所读取内容的基地址。第四个参数为要读取内容的大小,以字节为单位。最后一个参数lpNumberOfBytesRead为接收读取内容的buffer中收到的字节数。一般都设为NULL,这个该参数将被忽略掉。


使用ReadProcessMemory()函数,可以获得该进程内存空间中的信息,或是用于监测进程的执行情况,或是将进程内的数据备份,然后调用writeProcessMemory()进行修改,必要时再还原该进程的数据。


BOOL WINAPI WriteProcessMemory(
  __in   HANDLE hProcess,
  __in   LPVOID lpBaseAddress,
  __in   LPCVOID lpBuffer,
  __in   SIZE_T nSize,
  __out  SIZE_T *lpNumberOfBytesWritten
);


该函数与readProcessMemory的参数基本相同,只不过第三个参数lpBuffer为要写入进程的内容。


将内存的内容更改后,别忘了调用VirtualProtectEx()恢复内存原来的保护属性。

windows-CODE注入(远程线程注入)

远程线程注入
  • u013761036
  • u013761036
  • 2016年08月14日 17:25
  • 2566

使用Java自带的VisualVM监控远程主机JVM内存使用情况

下面是使用JXM协议配置的简单的操作步骤,详细内容可以阅读文章后的参考资料。 1.远程主机 (1)修改JMX服务的配置文件:   在JDK的根目录/jre/lib/management中,将...
  • dong_007_007
  • dong_007_007
  • 2013年08月21日 15:48
  • 2283

代码注入之远程线程篇

引子           前些日子由于项目要求,在网上到处找资料,于无意中发现了 CodeProject 上的一篇很老的文章,文章标题为: Three Ways to Inject Your C...
  • qq1978366308
  • qq1978366308
  • 2016年04月10日 18:04
  • 1164

无DLL注入(函数直接注入)

在第三中方法中,我们启动远程线程时,线程函数是我们从Kernel32.dll中取得的 LoadLibrary函数的地址为线程函数的地址,其实我们可以直接将线程函数体和函数参数写入目标 进程...
  • Lyntion
  • Lyntion
  • 2014年10月02日 14:33
  • 1026

JVM内存监控:VisualVM远程监控JVM

简介 VisualVM是一个集成多个JDK命令行工具的可视化工具。可以作为Java应用程序性能分析和运行监控的工具。开发人员可以利用它来监控、分析线程信息,浏览内存堆数据。系统管理员可以利用它来监测、...
  • liufeng93
  • liufeng93
  • 2015年06月12日 15:21
  • 768

DLL注入练习之远程注入-CreateRemoteThread()

最近在学习Windows API,觉得其中的一些函数比较有意思,就把它记录下来了。...
  • u013565525
  • u013565525
  • 2014年05月30日 00:05
  • 3542

MFC hook注入dll,远程线程注入dll

[cpp] view plain copy  print? #include "stdafx.h"   #include    //很多人在vs2010找不到dllmain的文件,都倍封装...
  • u011672712
  • u011672712
  • 2016年06月04日 20:19
  • 707

使用远程线程来注入DLL

windows内的各个进程有各自的地址空间。它们相互独立互不干扰保证了系统的安全性。但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作。虽然他们是为调试...
  • a904003695
  • a904003695
  • 2016年07月03日 12:24
  • 1160

从内存中加载映像(EXE/DLL)到本地或者远程进程执行

被加载的映像EXE,固定基址(/FIXED:NO)即必须有重定位表, 否则无法处理重定位. 在vs的linker->advanced 中设置 fixed base address。 从其他博主中摘...
  • ooyyee
  • ooyyee
  • 2016年07月06日 20:28
  • 1020

[原创&译]向其他进程注入代码的三种方法

分类: Windows C++编程2005-04-15 08:58 6742人阅读 评论(5) 收藏 举报 dll编译器windowsthreadwinapicallback 向其他进程注入代...
  • pi9nc
  • pi9nc
  • 2014年09月11日 19:25
  • 1512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:远程注入手段 及 内存操作
举报原因:
原因补充:

(最多只允许输入30个字)