请教个问题,delphi搜索并替换内存中的字符串做过吗? 比如,已运行的一个exe文件叫 test.exe,它的内存里内在如 aaaa 这个字符串,想把它在内存中生成的这个字符串aaaa都替换成另一个字符串,如 bbbb如果实现啊?拜谢了

解决方案 »

  1.   

    下载一个Cheat Engine源码,看一下内存替换功能
      

  2.   

    function CheckData(lpData,szData:PChar):Boolean;
    var
      Size,s,l:Integer;
    begin
      Result:=False;
      Size:=lstrlen(szData);
      l:=1;
      for s:=1 to Size do
      begin
        if lpData ^ = szData^ then Inc(l)
        else
        Break;
        Inc(lpData);
        Inc(szData);
      end;
      if l = Size then Result:=True;
      Dec(szData,l);
    end;function ReplaceData(lpData,szData:PChar):Integer;
    var
      Size,l:Integer;
    begin
      Result:=0;
      if CheckData(lpData,szData) then
      begin
        Size:=lstrlen(szData);
        for l:=1 to Size do
        begin
          lpData^:=szData^;
          Inc(lpData);
          Inc(szData);
        end;
        Result:=Size;
      end;
    end;procedure ReplaceMem(lpData:Pointer;Size:Integer;szData:Pointer);
    var
      l:Integer;
    begin
      while Size > 1 do
      begin
        if PChar(lpData)^ = PChar(szData)^ then
        begin
          l:=ReplaceData(lpData,szData);
        end
        else
        Inc(PChar(lpData),l);
      end;
    end;随手写的,没调试,应该可以
    调用ReplaceMem就OK。
    参数1:要被替换内存指针
    参数2:要被替换的内存总大小
    参数3:要替换的数据内存指针
      

  3.   


    test.exe进程的内存里所有 aaaa 字符串 替换成 bbbb 怎么实现呢?还得找到这个进程,再读取其内存,查找其中所有的 aaaa,再一一替换
      

  4.   

    API函数CopyMemory可以实现这个功能,不过首先的找到内存地址
      

  5.   

    枚举进程不难吧?快照,createtoolhelp32snapshot
    查找,CE那个算是不错的算法,再简单的很难写出来了
      

  6.   

    Cheat Engine比较复杂,花时间看看,谢谢了
      

  7.   

    以前写的
    Delphi内存搜索与读写
    http://www.unpack.cn/thread-38342-1-1.html
      

  8.   

    我曾经使用下列代码在内存中搜索word中的中文字符,替换应该也差不多:
    .................
          stContext:=keyADO.CreateBlobStream(keyADO.FieldByName('Content'),bmRead);
          stContext.Position:=0;
          SetLength(S,stContext.size);
          stContext.Read(S[0],stContext.size);
          if Pos(keystr,Widestring(S))>0 then
    ........................          keyADO.edit;
          FreeAndNil(stContext);//释放流以备下一循环使用
          SetLength(S,0);S:=nil;
          
      

  9.   

    10年前就用delphi5写过内存游戏修改器,所以,这个是可以的。