求助!!! WriteProcessMemory(100分)

  • 主题发起人 主题发起人 gks
  • 开始时间 开始时间
G

gks

Unregistered / Unconfirmed
GUEST, unregistred user!
WriteProcessMemory(GetCurrentProcess(), old, &New,sizeof(New), NULL);
以上调用出现998错误:Invalid access to memory location.
怎么解决啊?!
 
这种问题注定没有人能够帮您回答啊:)
给出一点思路,希望对您有用。
(1) 每个进程有它自己的私有虚拟内存空间,放置进程要执行的指令和相关数据。
(2)使用VirtualProtectEx函数把存放指令的页面的权限更改为可读可写可执行(PAGE_EXECUTE_READWRITE),再改写其内容,从而修改正在运行的程序。
(3)使用VirtualAllocEx函数从一个进程为另一正运行的进程分配虚拟内存,再用 VirtualProtectEx函数把页面的权限更改为可读可写可执行,并把要执行的指令用WriteProcessMemory函数以二进制机器码的形式写入,从而为一个正在运行的进程注入任意的代码
 
在读写内存的实际操作中会遇到一些问题。如果我们指定了写相关的访问权(如PROCESS_VM_WRITE、PROCESS_SET_INFORMATION、PROCESS_ALL_ACCESS等),用OpenProcess打开一些普通进程是没什么问题,但要是打开的是系统安全进程(如System、Winlogon、smss、csrss、services、lsass等)或是一些注册为服务的进程时,就会遇到“访问拒绝”的错误,这是为了系统的安全而采取的保护手段。说明了当前的进程没有足够的权限来进行此操作。在进程控制结构中有一个“访问令牌”(Access tokens),里面包含有本进程的权限信息。
权限名 权限含义
SeBackup 在备份的时候绕过安全检查
SeDebug 可对一个进程进行调试
SeShutdown 可关闭本地系统
SeTakeOwnerShip 在没有得到自由访问权的情况下得到一个对象的所有权
要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被使能(Enabled)的,所以我们要做的首先是使能这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegeValue、AdjustTokenPrivileges。
 
參考一下:
#include <stdio.h>
#include <windows.h>
#define DATA_SIZE 1024
void main(void)
{
LPVOID lpAddress = VirtualAlloc( NULL,
DATA_SIZE,
MEM_COMMIT | MEM_RESERVE,
PAGE_READWRITE );
if ( lpAddress )
{
DWORD dwProcessId = GetCurrentProcessId();
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS,
FALSE,
dwProcessId );
if ( hProcess )
{
char szBuffer[] = "MyData";
DWORD dwWrite;
if ( WriteProcessMemory( hProcess,
lpAddress,
szBuffer,
sizeof(szBuffer),
&amp;dwWrite ) )
{
char szData[1024];
if ( ReadProcessMemory( hProcess,
lpAddress,
szData,
sizeof(szBuffer),
&amp;dwWrite ) )
printf( "%s/n", szData );
}
CloseHandle( hProcess );
}
VirtualFree( lpAddress, 0, MEM_RESERVE );
}

}
 
最后一个参数错误,应该传入一个4字节整型变量的地址
 
pankun,说的对啊。
 
后退
顶部