比如程序中定义了一个常量,这个常量的值是 aaaa  编译成exe后,要对这个aaaa进行修改,如果长度不够或者多了,是否可以!本贴剩余分,另开帖酬谢!
原理就是用工具找其位置,然后写,知道的兄弟们献上代码,稍后分加上

解决方案 »

  1.   

    如果在exe中'aaaa'的后面还有空位的话,可以直接改。刚看了一下d7的编译结果,如果是'aaaa'(Length=4)的话,后面还可以放3个字符,它在exe中存放的形式是:
    ff ff ff ff // refCount: Integer = -1  常量string的引用计数
    04 00 00 00 // strLength: Integer = 4  串长度
    61 61 61 61 // 'aaaa'
    00 00 00 00 // 第1个0是字符串结尾,剩下3个是为个按4字节对齐加上的
    所以这种可以改成:
    ff ff ff ff  07 00 00 00   61 61 61 61  62 62 62 00 // 'aaaabbb'如果大于7字节就比较麻烦,就要在其它全0的地方新建一个串,然后查找指向它的地址的指针,把那几个地方也改过来
      

  2.   

    顺便说一下,全0的地方也要注意是不是会被pe加载器加载到内存。原则上来说,windows的pe加载器会把整个exe都映像到内存,而delphi的设计应该也是加加快pe的加载速度而不作修改,但还是要检查一下确保原来是0的地方是否被正确加载了
      

  3.   

    对于常量,编译器会专门存放一个位置, 若没有做特殊处理,一般的 反编译调试工具都可以查找修改,utralEdit可以查看
      

  4.   

    这样能搞的话那EXE文件不是都要被搞死?
      

  5.   

    是字符串常量就能修改,但是修改的长度不能超过字符串常量的长度。
    函数:
    function ReadFile ( FileName, WriteStr: string;  PianYiDiZhi: Integer ):Boolean ;//格式 (文件,写入的数据;  便宜地址 )
    var
      vFS : TFileStream;
    begin
      try
        vFS := TFileStream.Create(FileName, fmOpenReadWrite);  //为要写入的文件
        vFS.Position := PianYiDiZhi ;  // 偏移地址  比如用16进制找出常量'aaaa'的第一个字符在$1000,就填写$1000
        vFS.WriteBuffer(pointer(WriteStr)^, Length(WriteStr));  // 写入的长度
        Result := True;
      except
        Result := False;
      end;
      FreeAndNil(vFS);
    end;例子:
    比如你要修改指定文件(c:\1.exe)'aaaa'为'bbbb',假如'aaaa'的第一个字符串在$1000,那么代码可以这样写
    ReadFile('C:\1.EXE','bbbb',$1000),修改成功返回值为true,否则放回false
      

  6.   

    应该只要是字符串就能修改~。要是你那个常量多次用到,那么建议用作变量
    比如你定义的是
    const
      cStr = 'aaaa';
    就改为
    var
      vStr : string = 'aaaa';
    为什么呢?因为要是你使用程序中多次用到那个常量那么编译出来的话,那个常量也会出现在多个位置,因此要修改多次位置。
    如果你用作变量就不会出现在多个位置。
      

  7.   


    procedure TForm1.Button1Click(Sender: TObject);
    const
      C_A='aaaa';
    var
      F:File;
      WriteStr:array[1..4] of Char;
      i:Integer;
    begin
      //非Unicode情况下,长度只能短,如果要写的数据大于原来的话,除非原来的定义足够大
      AssignFile(F,'ExePath');
      try
        Reset(F,1);
        Seek(F,1234); //用16进制编辑器看字符串的起始位置
        FillChar(WriteStr,SizeOf(WriteStr),#0);
        for i:=1 to Length(C_A) do WriteStr[i]:=C_A[i];
        BlockWrite(F,WriteStr,4);
      finally
        CloseFile(F);
      end;
    end;