请问各位高手,如题
请帖出来让我们学习,需要学习的都会感谢你的,分也会给你的,谢谢。

解决方案 »

  1.   

    在WIN32中,各个进程中的内存数据是独立而且受到保护的
      

  2.   

    ReadProcessMemory 读另一个进程的内存,原形如下: 
    BOOL ReadProcessMemory( 
    HANDLE hProcess, // 被读取进程的句柄; 
    LPCVOID lpBaseAddress, // 读的起始地址; 
    LPVOID lpBuffer, // 存放读取数据缓冲区; 
    DWORD nSize, // 一次读取的字节数; 
    LPDWORD lpNumberOfBytesRead // 实际读取的字节数; 
    ); 
    hProcess 进程句柄可由OpenProcess 函数得到,原形如下: 
    HANDLE OpenProcess( 
    DWORD dwDesiredAccess, // 访问标志; 
    BOOL bInheritHandle, // 继承标志; 
    DWORD dwProcessId // 进程ID; 
    ); 
    ---- 当然,用完别忘了用 CloseHandle 关闭打开的句柄。读另一个进程的内存 dwDesiredAccess 须指定为 PROCESS_VM_READ ,写另一个进程的内存 dwDesiredAccess 须指定为 PROCESS_VM_WRITE ,继承标志无所谓,进程ID可由 Process32First 和 Process32Next 得到,这两个函数可以枚举出所有开启的进程,这样进程的信息也就得到了。 Process32First 和 Process32Next是由 TLHelp32 单元提供的,需在 uses 里加上TLHelp32。ToolsHelp32 封装了一些访问堆、线程、进程等的函数,只适用于Win9x,原形如下:  BOOL WINAPI Process32First( 
    HANDLE hSnapshot //  
    由 CreateToolhelp32Snapshot 返回 
    的系统快照句柄; 
    LPPROCESSENTRY32 lppe // 指向一个 PROCESSENTRY32 结构; 
    ); 
    BOOL WINAPI Process32Next( 
    HANDLE hSnapshot // 由 CreateToolhelp32Snapshot 返回 
    的系统快照句柄; 
    LPPROCESSENTRY32 lppe // 指向一个 PROCESSENTRY32 结构; 
    ); 
    hSnapshot 由 CreateToolhelp32Snapshot 返回的系统快照句柄; 
    CreateToolhelp32Snapshot 原形如下: 
    HANDLE WINAPI CreateToolhelp32Snapshot( 
    DWORD dwFlags, // 快照标志;  
    DWORD th32ProcessID // 进程ID; 
    ); 
    现在需要的是进程的信息,所以将 dwFlags  
    指定为 TH32CS_SNAPPROCESS, 
    th32ProcessID 忽略;PROCESSENTRY32 结构如下: 
    typedef struct tagPROCESSENTRY32 {  
    DWORD dwSize; // 结构大小; 
    DWORD cntUsage; // 此进程的引用计数; 
    DWORD th32ProcessID; // 进程ID; 
    DWORD th32DefaultHeapID; // 进程默认堆ID; 
    DWORD th32ModuleID; // 进程模块ID; 
    DWORD cntThreads; // 此进程开启的线程计数; 
    DWORD th32ParentProcessID;// 父进程ID; 
    LONG pcPriClassBase; // 线程优先权; 
    DWORD dwFlags; // 保留;  
    char szExeFile[MAX_PATH]; // 进程全名; 
    } PROCESSENTRY32; 
    ---- 至此,所用到的主要函数已介绍完,实现读内存只要从下到上依次调用上述函数即可,具体参见原代码:  
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
    FSnapshotHandle:THandle; 
    FProcessEntry32:TProcessEntry32; 
    Ret : BOOL; 
    ProcessID : integer; 
    ProcessHndle : THandle; 
    lpBuffer:pByte; 
    nSize: DWORD; 
    lpNumberOfBytesRead: DWORD; 
    i:integer; 
    s:string; 
    begin 
    FSnapshotHandle:=CreateToolhelp32Snapshot( 
    TH32CS_SNAPPROCESS,0); 
    //创建系统快照 
    FProcessEntry32.dwSize:=Sizeof(FProcessEntry32); 
    //先初始化 FProcessEntry32 的大小 
    Ret:=Process32First(FSnapshotHandle,FProcessEntry32); 
    while Ret do 
    begin 
    s:=ExtractFileName(FProcessEntry32.szExeFile); 
    if s='KERNEL32.DLL' then 
    begin 
    ProcessID:=FProcessEntry32.th32ProcessID; 
    s:=''; 
    break; 
    end; 
    Ret:=Process32Next(FSnapshotHandle,FProcessEntry32); 
    end; 
    //循环枚举出系统开启的所有进程,找出"Kernel32.dll" 
    CloseHandle(FSnapshotHandle); 
    Memo1.Lines.Clear ; 
    memo1.lines.add('Process ID '+IntToHex( 
    FProcessEntry32.th32ProcessID,8)); 
    memo1.lines.Add('File name '+FProcessEntry32.szExeFile); 
    ////输出进程的一些信息  
    nSize:=4; 
    lpBuffer:=AllocMem(nSize); 
    ProcessHndle:=OpenProcess(PROCESS_VM_READ,false,ProcessID); 
    memo1.Lines.Add ('Process Handle '+intTohex(ProcessHndle,8)); 
    for i:=$00800001 to $0080005f do 
    begin 
    ReadProcessMemory( 
    ProcessHndle, 
    Pointer(i), 
    lpBuffer, 
    nSize, 
    lpNumberOfBytesRead 
    ); 
    s:=s+intTohex(lpBuffer^,2)+' '; 
    //读取内容 
    if (i mod 16) =0 then 
    begin 
    Memo1.Lines.Add(s); 
    s:=''; 
    end; 
    //格式化输出 
    end; 
    FreeMem(lpBuffer,nSize); 
    CloseHandle(ProcessHndle); 
    //关闭句柄,释放内存 
    end; 
      

  3.   

    cg1120(代码最优化-§新年祝福你,好运伴着你§)呵呵,WIN32 API玩到这地步了,真是狠,佩服.请问是否有Delphi格式的Graphics API 的帮助文件,有的话请给我一份
      

  4.   

    没有,初学API看《WINDOWS 程序设计》北京大学出版
      

  5.   

    在WIN32中,各个进程中的内存数据是独立而且受到保护的的确是这样啊,为什么一定要访问另外一个进程的数据?如果是进程间通讯为什么不用内核对象?不过的确佩服: cg1120(代码最优化-§新年祝福你,好运伴着你§) 这位老兄,骨灰级的API玩家,挖哈哈哈
      

  6.   

    for i:=$00800001 to $0083005f do 
    begin 
    ReadProcessMemory( 
    ProcessHndle, 
    Pointer(i), 
    lpBuffer, 
    nSize, 
    lpNumberOfBytesRead 
    ); 
    为什么我读出来的全是00啊???
      

  7.   

    lpNumberOfBytesRead 老是为零。
    cg1120(代码最优化-§新年祝福你,好运伴着你§)还得请教你,是什么原因?
      

  8.   

    如果说是Win32下不能访问的话,这到不可能,因为很多游戏修改软件不是一样的可以改其他进程里的东东吗?还可以查找,修改,等等。
      

  9.   

    楼上用的什么系统,以上程序Win98下有效