首页
论坛
专栏
课程

[系统底层] [求助]windows分配可执行内存块

2016-12-19 15:10 2168

[系统底层] [求助]windows分配可执行内存块

2016-12-19 15:10
2168
#include "stdafx.h"
#include <Windows.h>
#include <queue>
#include <map>
#include <string>
#include <string.h>

int add(int a, int b){
        return a + b;
}
void end(){}

int _tmain(int argc, _TCHAR* argv[])
{
        int addFunctionSize = (char *) end - (char * )add;
        HANDLE heap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, addFunctionSize, 1000);
        //HANDLE heap = GetProcessHeap();
        PVOID pv = HeapAlloc(heap, HEAP_ZERO_MEMORY, addFunctionSize);

        memcpy(pv, add, addFunctionSize);
       
        printf("%x", *((int *)add));
        printf("%x", *((int *)pv));
        int ret;
        _asm{
                push 1
                push 2
                call pv
                add esp,8
                mov ret, eax
        }
        HeapFree(heap, HEAP_ZERO_MEMORY, pv);
        CloseHandle(heap);
        printf("0x%x", ret);
        getchar();
        return 0;
}

代码如上, 哪位大神教教我, 为什么执行到call的之后报错呢?
Unhandled exception at 0x01650752 in Test1.exe: 0xC0000096: Privileged instruction.

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (5)
b23526 2016-12-19 15:56
2
0
因为新分配的内存没有执行权限,调用VirtualProtect设置新申请的内存PAGE_EXECUTE_READWRITE权限
roothxl 2016-12-19 16:25
3
0
m_newFuncEntry = (unsigned char*)VirtualAlloc(0, m_ndLen + 32, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
casiojxnklla 2016-12-20 00:48
4
0
DWORD dw;
        printf("%s", VirtualProtect(pv, addFunctionSize, PAGE_EXECUTE_READWRITE, &dw) ? "成功" : "失败");
大神帮我看下, 我这样写对吗?加上了这两句还是执行的时候报0x96错误
casiojxnklla 2016-12-20 20:39
5
0
我把分配内存的代码换成了这句, PVOID pv = (unsigned char*)VirtualAlloc(0, addFunctionSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
执行的时候还是报0x96错误, 大神有没有见过类似的例子啊?就是在程序执行的时候分配一块内存, 然后写入汇编, 然后执行的例子, 可以给我个例子的超链接吗? 我翻遍了十几本书都没有找到类似的例子。
casiojxnklla 2016-12-20 21:52
6
0
#include "stdafx.h"
#include <Windows.h>
#include <queue>
#include <map>
#include <string>
#include <string.h>
#include <math.h>

int add(int a, int b){
        return a + b;
}
void end(){}

int _tmain(int argc, _TCHAR* argv[])
{
        UINT nNewSize = (UINT) ceil(1500 / 1024.0) * 1024;
        PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

        //int length = abs((int)((unsigned int) end - (unsigned int) add));
        if (pNewBuffer)
        {
                memcpy(pNewBuffer, add, 1000);
                int result = 0;
                _asm{
                        push 1
                        push 2
                        call pNewBuffer
                        add esp, 8
                        mov result, eax
                }
                printf("0x%x", result);
                VirtualFree(pNewBuffer,0,MEM_RELEASE);
        }
        getchar();
        return 0;
}

可以执行了, 谢谢大家
游客
登录 | 注册 方可回帖
返回