关于WriteProcessMemory?(VC代码 译DELPHIL) 5元酬谢!(支付宝支付QQ47537815)
尝试想把VC++代码 转译DELPHI 代码,本人对WriteProcessMemory 理解不够,望高手指点
VC++代码
#include<windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//OBJIP
unsigned int OBJ_ip=0x0040567D;//修改潜艇生命数代码的偏移地址
unsigned int OBJ_patch[1]={0x89CA8B90};//其中的90则是NOP的十六进制
HWND hwndOBJ=FindWindow(NULL,"潜艇大战");//获得游戏的窗口句柄
DWORD PID;
HANDLE hProcess;
if (hwndOBJ!=0)
{
SetForegroundWindow(hwndOBJ);//找到句柄后将游戏设置为当前窗口
GetWindowThreadProcessId(hwndOBJ,&PID);//得到游戏的进程ID
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);//打开游戏进程
WriteProcessMemory(hProcess,(void *)OBJ_ip,OBJ_patch,1,0);//写入修改后的代码
CloseHandle(hwndOBJ);
CloseHandle(hProcess);
}
else
MessageBox(NULL,"游戏还没有启动吧?","错误!",NULL);
return 0;
}
DELPHI代码
unit call;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
hwndobj: HWND;
PID,n:DWORD;
hProcess:THandle;
const
obj_ip: dword = $0040567D;
obj_patch: dword =$89CA8B90;
begin
hwndOBJ:=FindWindow('潜艇大战',nil);//获得游戏的窗口句柄
SetForegroundWindow(hwndOBJ);//找到句柄后将游戏设置为当前窗口
GetWindowThreadProcessId(hwndOBJ,@PID);//得到游戏的进程ID
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);//打开游戏进程
WriteProcessMemory(hprocess, Pointer(obj_ip), pointer(@obj_patch),1,0)// 就是这边出错啦
CloseHandle(hwndOBJ);
CloseHandle(hProcess);
end;
end.
[解决办法]
- Delphi(Pascal) code
const OBJ_ip = $0040567D; //修改潜艇生命数代码的偏移地址 OBJ_patch: array[0..0] of Longword = ($89CA8B90); //其中的90则是NOP的十六进制var hwndOBJ: THandle; PID: DWORD; hProcess: THandle; vNumberOfBytesWritten: DWORD;begin hwndOBJ := FindWindow(nil, '潜艇大战'); //获得游戏的窗口句柄 if hwndOBJ <> 0 then begin SetForegroundWindow(hwndOBJ); // 找到句柄后将游戏设置为当前窗口 GetWindowThreadProcessId(hwndOBJ, @PID); // 得到游戏的进程ID hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID); //打开游戏进程 WriteProcessMemory(hProcess, Pointer(OBJ_ip), @OBJ_patch[0], SizeOf(OBJ_patch), vNumberOfBytesWritten); //写入修改后的代码 CloseHandle(hwndOBJ); CloseHandle(hProcess); end else MessageBox(0, '游戏还没有启动吧?','错误!', 0);end;