哪位老大能解释这个补丁的原理, 麻烦能转成delphi的,非常感激!#include <windows.h> void messbox (char* mess)
{
static char caption[]="Process Patcher Error"; MessageBox (NULL,mess,&caption,MB_OK|MB_ICONERROR);
} void main ()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
char* cl;
int x;
static long BaseAddress=0x4255C1;
static char original[6]={0xFF,0x0D,0x14,0x68,0x42,0x00};
static char new_bytes[6]={0x90,0x90,0x90,0x90,0x90,0x90};
static char Buffer[6];
static char fname[]="counters.exe";
static char err1[]="Can't CreateProcess ";
static char err2[]="Can't ReadProcessMemory";
static char err3[]="Bytes don't match";
static char err4[]="Can't WriteProcessMemory";
ZeroMemory (&si,sizeof (si));
si.cb=sizeof (si);
cl=GetCommandLine ();
if (CreateProcess (&fname,cl,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,
NULL,NULL,&si,&pi))
{
WaitForInputIdle (pi.hProcess,INFINITE);
if (ReadProcessMemory (pi.hProcess,BaseAddress,&Buffer,6,NULL))
{
for (x=0;(Buffer[x]==original[x])&&(x<5);x++);
if (x==5)
{
if (!WriteProcessMemory (pi.hProcess,BaseAddress,&new_bytes,6,NULL))
messbox(&err4);
}
else messbox(&err3);
}
else messbox(&err2);
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
}
else messbox(&err1);
}
{
static char caption[]="Process Patcher Error"; MessageBox (NULL,mess,&caption,MB_OK|MB_ICONERROR);
} void main ()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
char* cl;
int x;
static long BaseAddress=0x4255C1;
static char original[6]={0xFF,0x0D,0x14,0x68,0x42,0x00};
static char new_bytes[6]={0x90,0x90,0x90,0x90,0x90,0x90};
static char Buffer[6];
static char fname[]="counters.exe";
static char err1[]="Can't CreateProcess ";
static char err2[]="Can't ReadProcessMemory";
static char err3[]="Bytes don't match";
static char err4[]="Can't WriteProcessMemory";
ZeroMemory (&si,sizeof (si));
si.cb=sizeof (si);
cl=GetCommandLine ();
if (CreateProcess (&fname,cl,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,
NULL,NULL,&si,&pi))
{
WaitForInputIdle (pi.hProcess,INFINITE);
if (ReadProcessMemory (pi.hProcess,BaseAddress,&Buffer,6,NULL))
{
for (x=0;(Buffer[x]==original[x])&&(x<5);x++);
if (x==5)
{
if (!WriteProcessMemory (pi.hProcess,BaseAddress,&new_bytes,6,NULL))
messbox(&err4);
}
else messbox(&err3);
}
else messbox(&err2);
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
}
else messbox(&err1);
}
解决方案 »
- 新建的delphiQQ群 欢迎各位新手老手朋友加入~~
- 请教各位delphi做报表,用什么控件比较好一点啊!
- 如何在程序中查询某一天的数据?
- Delphi调用VC++的API的问题!!!(紧急求助,分不是问题)
- 三层结构的数据更新问题?
- 进来讨论一下, 这是什么原因??(一个看起来很简单的问题)
- 怎么动态的调整PopupMenu?
- teechar关于甘特图序列操作的鼠标事件
- 注意:你们发现D6盘带的InstallShield不支持中文目录的安装吗?奇怪的问题!!!
- csdn上的朋友怎么了啊?。。。我发出求救的信号,并且给了代码。。这么久了都没有回答我?。。。
- delphi编程群号:16147100,群名:软件特工队。欢迎各位有编程爱好者共同交流。
- ADOQuery简单问题?高分在线等待!
i: Integer;
cl: PChar;
si: TStartupInfo;
pi: PROCESS_INFORMATION;
Buffer: array[0..5] of Byte;
nByteRead, nByteWrite: Cardinal;
NewBytes: array[0..5] of Byte;
const
BaseAddress: Pointer = Pointer($004255C1);
Original: array[0..5] of Byte = ($FF,$0D,$14,$68,$42,$00);
FName = 'counters.exe';
Err1 = 'Can''t CreateProcess';
Err2 = 'Can''t ReadProcessMemory';
Err3 = 'Bytes don''t match';
Err4 = 'Can''t WriteProcessMemory';
begin
for i := 0 to 5 do
NewBytes[i] := $90;
ZeroMemory(@si, SizeOf(si));
si.cb := SizeOf(si);
cl := GetCommandLine;
if CreateProcess(FName, cl, nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then
begin
WaitForInputIdle(pi.hProcess, INFINITE);
if ReadProcessMemory(pi.hProcess, BaseAddress, @NewBytes, 6, nByteRead) then
begin
for i := 0 to 5 do
if Buffer[i] <> Original[i] then Break;
if i = 5 then
begin
if not WriteProcessMemory(pi.hProcess, BaseAddress, @NewBytes, 6, nByteWrite) then ShowMessage(Err4)
end else ShowMessage(Err3);
end else ShowMessage(Err2);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end else ShowMessage(Err1);
end;
最近我也在做一个Loader。
这个没什么特别的啊。就和游戏修改器(FPE)差不多的意思啊。
只不过Loader是自动改而已。关键是你要分析出那个游戏的内存结构。