![]() |
#2
cbd6662020-02-03 15:28
|

#include<Windows.h>
#include<stdio.h>
int main() {
HANDLE hMapping;
char *buf;
HANDLE hThread;
char shellcode[] = "my shellcode";
//创建内核对象:物理页
hMapping = CreateFileMapping(
INVALID_HANDLE_VALUE, //为NULL则为创建物理页
NULL,
PAGE_EXECUTE_READWRITE, //物理页的属性 为 可读写执行
0,
0x1000,
NULL //指定映射名
);
//将当前进程中的虚拟地址与物理页进行映射
buf = (char *)MapViewOfFile(
hMapping,
FILE_MAP_ALL_ACCESS, //虚拟内存的属性,并且物理内存的属性要比虚拟内存的属性高
0,
0,
sizeof(shellcode)
); //返回值为映射的起始地址,指向物理页
CopyMemory(buf, shellcode, sizeof(shellcode)); //复制shellcode到buf所指向的物理页
hThread = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)buf,
NULL,
0,
NULL);
WaitForSingleObject(hThread, INFINITE); // 等待线程执行完成
//关闭映射
UnmapViewOfFile(buf);
//关闭句柄
CloseHandle(hMapping);
return 0;
}
#include<stdio.h>
int main() {
HANDLE hMapping;
char *buf;
HANDLE hThread;
char shellcode[] = "my shellcode";
//创建内核对象:物理页
hMapping = CreateFileMapping(
INVALID_HANDLE_VALUE, //为NULL则为创建物理页
NULL,
PAGE_EXECUTE_READWRITE, //物理页的属性 为 可读写执行
0,
0x1000,
NULL //指定映射名
);
//将当前进程中的虚拟地址与物理页进行映射
buf = (char *)MapViewOfFile(
hMapping,
FILE_MAP_ALL_ACCESS, //虚拟内存的属性,并且物理内存的属性要比虚拟内存的属性高
0,
0,
sizeof(shellcode)
); //返回值为映射的起始地址,指向物理页
CopyMemory(buf, shellcode, sizeof(shellcode)); //复制shellcode到buf所指向的物理页
hThread = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)buf,
NULL,
0,
NULL);
WaitForSingleObject(hThread, INFINITE); // 等待线程执行完成
//关闭映射
UnmapViewOfFile(buf);
//关闭句柄
CloseHandle(hMapping);
return 0;
}
这种方式自己查资料也没找到,一般执行shellcode都是通过VirtualAlloc都申请内存的,但是自己想试下CreateFileMapping,但是发现没有成功,想问问大佬们有什么原因吗,如果有的话buf = (char *)MapViewOfFile是这句话出现问题吗,但是buf指向的不是物理页的地址吗,按理说应该是行得通的,自己的windows10系统可以运行 但是放在08上就不行了哇