gpt4 book ai didi

c++ - VirtualAllocEx 成功返回一个基地址,但是 WriteProcess 失败,错误是 487

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:14 27 4
gpt4 key购买 nike

我的代码。

int main()
{
HANDLE hTargetHandle;
int TargetProcessId=GetTargetProcessId();


hTargetHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,TargetProcessId);

if(hTargetHandle==INVALID_HANDLE_VALUE)
{
DWORD d=GetLastError();
printf("openprocess fail\n");
printf("the TargetProcessId is: %d\n",TargetProcessId);

printf("the result of getlast is: %d\n",d);
system("PAUSE");
exit(-1);
}

DWORD dwBufferSize=(DWORD)GetTargetProcessId-(DWORD)create;

DWORD dwProcBaseAddress=(DWORD)VirtualAllocEx(hTargetHandle,NULL,1024*1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE); //the size here is 1024*1024,I don't know the size of the function I am going to inject to another process,so I use 1024*1024 here.I have ever tried to use 1024*1024*10,but it is the same error.

if(dwProcBaseAddress==NULL)
{
DWORD d=GetLastError();
printf("virtualallocex has fail\n");
printf("the last error is:%d\n",d);
system("PAUSE");
exit(-1);
}

int a=WriteProcessMemory(hTargetHandle,&dwProcBaseAddress,create,1024*1024,NULL); //create is a function I defined,used to inject to another process.
if(a==0)
{
DWORD d=GetLastError();
printf("writeprocessmemory has fail\n");
printf("the last error is %d\n",d);
system("PAUSE");
exit(-1);
}

DWORD dwThreadId;

HANDLE hRemoteThreadHandle=CreateRemoteThread(hTargetHandle,NULL,NULL,(LPTHREAD_START_ROUTINE)dwProcBaseAddress,NULL,0,&dwThreadId);

if(hRemoteThreadHandle!=INVALID_HANDLE_VALUE)
{

printf("succeed\n");
system("PAUSE");
exit(-1);
}


system("PAUSE");
return 1;
}

结果如下。 WriteProcessMemory 函数失败,错误 487,表示地址无效。

Error message

但是地址是VirtualAllocEx函数的返回值,返回值不为空,所以地址应该是可用的。我不知道问题出在哪里。

最佳答案

当遇到错误代码时,请查找它。此处记录:https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx .您有 487,它是 ERROR_INVALID_ADDRESS。相关的描述是:

Attempt to access invalid address.

那么,让我们深入挖掘一下。如果有无效地址,它可能是什么?您传递给函数的两个地址在第二个和第三个参数中。当然第一个 lpBaseAddress 是错误的。您应该传递分配的内存地址。相反,您传递包含该地址的变量的地址。

我怀疑您的部分问题是错误的类型转换。 VirtualAllocEx 返回 LPVOID。将其转换为 DWORD 可能适用于 32 位进程,但肯定不适用于 64 位进程。但是你为什么要类型转换? LPVOID 正是您需要传递给 WriteProcessMemory 的内容。您的代码中充斥着错误的转换。一般来说,按照您的方式进行类型转换是一种提示错误的代码味道。强制转换您正在做的方式会阻止编译器对您的代码进行类型检查。

基地址变量应该这样声明:

LPVOID lpBaseAddress = VirtualAllocEx(...);

然后当您调用 WriteProcessMemory 时,传递该变量:

BOOL retval = WriteProcessMemory(..., lpBaseAddress, ...);

我不知道你为什么用int作为变量来捕获WriteProcessMemory的返回值。文档将其作为 BOOL。这传达了语义。您还可以将 int 用于 PID。 PID 的类型为 DWORD

不知道函数的长度可能是个问题。如果您无法读取超过 create1024*1024 字节怎么办?

您程序中的缺陷很简单。你传递了错误的地址。但是,我认为您需要退后一步。不要只是修复那个缺陷然后继续前进。您确实需要花一些时间来熟悉 Win32 API 使用的类型。除非你改掉这个习惯,否则你肆意的打字会一次又一次地伤害你。

关于c++ - VirtualAllocEx 成功返回一个基地址,但是 WriteProcess 失败,错误是 487,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39198068/

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