- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的代码。
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,表示地址无效。
但是地址是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
。
不知道函数的长度可能是个问题。如果您无法读取超过 create
的 1024*1024
字节怎么办?
您程序中的缺陷很简单。你传递了错误的地址。但是,我认为您需要退后一步。不要只是修复那个缺陷然后继续前进。您确实需要花一些时间来熟悉 Win32 API 使用的类型。除非你改掉这个习惯,否则你肆意的打字会一次又一次地伤害你。
关于c++ - VirtualAllocEx 成功返回一个基地址,但是 WriteProcess 失败,错误是 487,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39198068/
有谁知道函数VirtualAllocEx从 Windows API 调用时可以分配多个页面吗? 比如我要分配100MB。我调用函数。分配的内存是否可以跨越多个页面(一次调用),还是总是只分配一个精确大
我试图让 calc.exe 显示一个消息框,但 calc.exe 总是在我执行我的程序时崩溃。因此,我尝试将代码注入(inject)到我自己的进程中,以便查看调试消息。这样做给了我指向 pData->
我需要使用 VirtualAlloc/VirtualAllocEx 做什么? 举个例子,我发现的一个案例——如果我分配了 4 GB 的虚拟内存,那么如果我不使用所有虚拟内存,那么我就不会花费物理内存,
如何使用 VirtualAllocEx 为 code cave 腾出空间? ?我目前拥有一个“可用空间”很少的软件,我读到 VirtualAllocEx 用于创建这个空间.. 最佳答案 清除“代码洞穴
我试图在挂起模式下使用 CreateProcessA 创建一个进程,然后在基址 0x400000 地址上分配内存,问题是当我设置动态基标志时,virtualallocex 随机失败,但是当我关闭动态基
我的代码。 int main() { HANDLE hTargetHandle; int TargetProcessId=GetTargetProcessId(); hTargetHandle=Ope
我是一名优秀的程序员,十分优秀!