哪位老大能解释这个补丁的原理, 麻烦能转成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);
}

解决方案 »

  1.   

    var
      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;
      

  2.   

    多谢 g961681(技术庸人) 大哥!  To FigoZhu(谢慕安):小弟知道这是修改内存的,但这个代码跟一般的不同 能强制修改。WaitForInputIdle(pi.hProcess, INFINITE); 有点不明白  我看有的用SuspendThread()什么的
      

  3.   

    To yunboddd(云波),
    最近我也在做一个Loader。
    这个没什么特别的啊。就和游戏修改器(FPE)差不多的意思啊。
    只不过Loader是自动改而已。关键是你要分析出那个游戏的内存结构。