首页
社区
课程
招聘
[求助]windows分配可执行内存块
发表于: 2016-12-19 15:10 4828

[求助]windows分配可执行内存块

2016-12-19 15:10
4828
#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.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
因为新分配的内存没有执行权限,调用VirtualProtect设置新申请的内存PAGE_EXECUTE_READWRITE权限
2016-12-19 15:56
0
雪    币: 76
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
m_newFuncEntry = (unsigned char*)VirtualAlloc(0, m_ndLen + 32, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
2016-12-19 16:25
0
雪    币: 3
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
DWORD dw;
        printf("%s", VirtualProtect(pv, addFunctionSize, PAGE_EXECUTE_READWRITE, &dw) ? "成功" : "失败");
大神帮我看下, 我这样写对吗?加上了这两句还是执行的时候报0x96错误
2016-12-20 00:48
0
雪    币: 3
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我把分配内存的代码换成了这句, PVOID pv = (unsigned char*)VirtualAlloc(0, addFunctionSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
执行的时候还是报0x96错误, 大神有没有见过类似的例子啊?就是在程序执行的时候分配一块内存, 然后写入汇编, 然后执行的例子, 可以给我个例子的超链接吗? 我翻遍了十几本书都没有找到类似的例子。
2016-12-20 20:39
0
雪    币: 3
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
#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;
}

可以执行了, 谢谢大家
2016-12-20 21:52
0
游客
登录 | 注册 方可回帖
返回
//