我按照很多文章介绍的写了下面这段代码: HWND hwnd=::FindWindow(NULL,"starcraft");
DWORD lpdwProcessId;
::GetWindowThreadProcessId(hwnd,&lpdwProcessId);
HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,lpdwProcessId);
if(!hProcess)
{
MessageBox("error");
return;
}
char buf;
int buffer=123;
DWORD address=0x20005;
if(!::WriteProcessMemory(hProcess,&address,&buffer, sizeof(int), NULL))
MessageBox("error whriting");(我用的是vc6,win2000)
为什么会没反应?请高手指点!如果你有内存修改的资料,能不能发给我一份,万分感谢!!!

解决方案 »

  1.   

    WriteProcessMemory
    写进程内存需要你对目标进程有相应的权限。
    系统会检查你的访问令牌和目标对象handle的acl
      

  2.   

    在写入内存以前,先把address所指向页面的保护属性改为读/写试试看:
    DWORD dwOldProtect;
    VirtualProtect(address,...,PAGE_READWRITE,&dwOldProtect);
    WriteProcessMemory(hProcess,&address,&buffer,sizeof(int),NULL); 
    VirtualProtect(address,...,dwOldProtect,0);
      

  3.   

    win2000以上版本的这种函数不简单用,除非你挂在一个权限比较大的程序上,比如系统的
      

  4.   

    给你的进程申请Debug权限就可以了。
    //这个函数是提高权限的,在WinNT/2000/XP里有些进程是不能随便打开的,这个函数赋予本进程调试权限
    //这样可以打开除IDLE进程外的所有进程,另外要注意,SYSTEM进程(就是那个8#进程)里没法建立远线程。
    BOOL EnableDebugPrivilege()
    {
    HANDLE hToken;
    BOOL fOk=FALSE;
      if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
        {
        TOKEN_PRIVILEGES tp;
        tp.PrivilegeCount=1;
        if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid))
          printf("Can't lookup privilege value.\n");
        tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
        if(!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL))
          printf("Can't adjust privilege value.\n");
        fOk=(GetLastError()==ERROR_SUCCESS);
        CloseHandle(hToken);
        }
    return fOk;
    }
      

  5.   

    只有注入DLL到进程的方法了,不过大家也可以试试其它方法