注册 登录
编程论坛 C++教室

关于CreateFileMapping的api的问题

cbd666 发布于 2020-02-03 15:16, 1586 次点击
程序代码:
#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;
}


这种方式自己查资料也没找到,一般执行shellcode都是通过VirtualAlloc都申请内存的,但是自己想试下CreateFileMapping,但是发现没有成功,想问问大佬们有什么原因吗,如果有的话buf = (char *)MapViewOfFile是这句话出现问题吗,但是buf指向的不是物理页的地址吗,按理说应该是行得通的,自己的windows10系统可以运行 但是放在08上就不行了哇
3 回复
#2
cbd6662020-02-03 15:28
FILE_MAP_EXECUTE  映射文件的可执行视图(映射的内存可以作为代码运行)。必须已使用PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPY或PAGE_EXECUTE_READWRITE 保护创建了文件映射对象。
Windows Server 2003和Windows XP:  此值从带有SP2的Windows XP和带有SP1的Windows Server 2003开始可用。

自己改了FILE_MAP_EXECUTE  还是不行
#3
cbd6662020-02-04 17:01
哇 版主我想你了
#4
rjsp2020-02-06 14:15
"my shellcode" 根本不是可执行代码,
1