在 Windows 10 c++ x64 上从内存执行代码?
Execute Code From Memory on Windows 10 c++ x64?
我正在尝试弄清楚如何在 Windows10 上执行任意代码。我觉得这段代码应该可以工作,但它给我一个访问冲突写入位置错误。
#include <iostream>
#include <vector>
#include <Windows.h>
// x64 assembly
#define ret (uint8_t)(0xc3)
#define nop (uint8_t)(0x90)
int main() {
std::vector<uint8_t> raw_code = {
nop, ret
};
LPVOID exec = VirtualAlloc(NULL, raw_code.size(), MEM_RESERVE, PAGE_READWRITE);
memcpy(exec, raw_code.data(), raw_code.size());
DWORD old_protect;
VirtualProtect(exec, raw_code.size(), PAGE_EXECUTE, &old_protect); // Line where error occurs
((void(*)())exec)();
VirtualProtect(exec, raw_code.size(), old_protect, &old_protect);
VirtualFree(exec, raw_code.size(), MEM_RELEASE);
return 0;
}
实际上,错误发生在以下行(至少,当我 运行 你的代码时会发生):
memcpy(exec, raw_code.data(), raw_code.size());
这是因为您对 VirtualAlloc
的调用仅 保留 内存,但实际上并未 提交 它。 From the documentation:
MEM_RESERVE (0x00002000)
Reserves a range of the process's
virtual address space without allocating any actual physical storage
in memory or in the paging file on disk.
要提交内存(即使其可用),您需要添加MEM_COMMIT
标志:
LPVOID exec = VirtualAlloc(nullptr, raw_code.size(), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
添加此标志后,您在我的 Windows 10(使用 clang-cl/VS-2019 构建)上编码 运行s 没有错误。
一方面,MEM_RESERVE
意味着内存未分配,因此尝试取消引用指针将导致访问冲突(如您亲眼所见)。别装傻了,像往常一样分配你的内存,使用 MEM_COMMIT | MEM_RESERVE
.
您也没有将内存设置为可执行,您需要改用 PAGE_EXECUTE_READWRITE
。否则,在启用 DEP 的情况下,您的代码将因访问冲突而崩溃。
我正在尝试弄清楚如何在 Windows10 上执行任意代码。我觉得这段代码应该可以工作,但它给我一个访问冲突写入位置错误。
#include <iostream>
#include <vector>
#include <Windows.h>
// x64 assembly
#define ret (uint8_t)(0xc3)
#define nop (uint8_t)(0x90)
int main() {
std::vector<uint8_t> raw_code = {
nop, ret
};
LPVOID exec = VirtualAlloc(NULL, raw_code.size(), MEM_RESERVE, PAGE_READWRITE);
memcpy(exec, raw_code.data(), raw_code.size());
DWORD old_protect;
VirtualProtect(exec, raw_code.size(), PAGE_EXECUTE, &old_protect); // Line where error occurs
((void(*)())exec)();
VirtualProtect(exec, raw_code.size(), old_protect, &old_protect);
VirtualFree(exec, raw_code.size(), MEM_RELEASE);
return 0;
}
实际上,错误发生在以下行(至少,当我 运行 你的代码时会发生):
memcpy(exec, raw_code.data(), raw_code.size());
这是因为您对 VirtualAlloc
的调用仅 保留 内存,但实际上并未 提交 它。 From the documentation:
MEM_RESERVE (0x00002000)
Reserves a range of the process's virtual address space without allocating any actual physical storage in memory or in the paging file on disk.
要提交内存(即使其可用),您需要添加MEM_COMMIT
标志:
LPVOID exec = VirtualAlloc(nullptr, raw_code.size(), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
添加此标志后,您在我的 Windows 10(使用 clang-cl/VS-2019 构建)上编码 运行s 没有错误。
一方面,MEM_RESERVE
意味着内存未分配,因此尝试取消引用指针将导致访问冲突(如您亲眼所见)。别装傻了,像往常一样分配你的内存,使用 MEM_COMMIT | MEM_RESERVE
.
您也没有将内存设置为可执行,您需要改用 PAGE_EXECUTE_READWRITE
。否则,在启用 DEP 的情况下,您的代码将因访问冲突而崩溃。