gpt4 book ai didi

c - VS-2010 中的函数指针(+ Virtual Alloc 调用)

转载 作者:太空宇宙 更新时间:2023-11-04 03:07:03 24 4
gpt4 key购买 nike

作为实验,我正在尝试编写以下程序,它允许我在运行时生成代码。即我执行以下操作:

1. 用我要执行的指令的操作码填充缓冲区。
2. 声明一个函数指针并使其指向缓冲区的开始。
3.使用上述函数指针调用函数。

代码如下:(按照下面 AndreyT 的说明更新。)

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
//#include <sys/mman.h>
int main(int argc, char *argv[])
{
int u32;
int (*ptr)(void);

uint8_t *buf = malloc(1000);
//uint8_t *buf = mmap(NULL, 1000, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

buf[0] = 0xb8;
u32= 42;
memcpy(buf + 1, &u32, 4);
buf[5] = 0xc3;

ptr = (int (*)(void)) buf;

printf("return is %d\n", ptr());

return 0;
}

此代码在使用 gcc 的 linux 机器上编译良好。
现在我正在将它迁移到 Windows (visual-studio-2010)。

据我所知,mmap 功能由 virtualAllocvirtualProtect 在 Windows 上提供。

我已经浏览了 MSDN 和网上的其他文档,
但我仍然无法找到一种方法让这个程序在 Windows 的 VS-2010 上运行。


更新:

@AndreyT 谢谢。它现在似乎正在工作。虽然我收到以下错误:

1>MSVCRTD.lib(crtexew.obj) :  
error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
1>file.exe : fatal error LNK1120: 1 unresolved externals
Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped

我想我现在需要用 virtualAlloc() 交换 mmap() 调用。
非常感谢大家。接下来,我想我需要深入研究 MSDN 以了解 virtualAlloc()

最佳答案

您收到此错误是因为您试图在 block 的中间声明 ptr

经典的 ANSI C 语言 (C89/90) 不允许在 block 的中间声明。声明必须位于 block 的开头。只有在 C99 中才允许在中间声明变量。

GCC 编译器,即使在 C89/90 模式下,也允许在中间声明变量作为非标准扩展。 MSVC 编译器是一个严格的 C89/90 编译器,它不允许这样的声明。

关于c - VS-2010 中的函数指针(+ Virtual Alloc 调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com