EXE文件自我修改

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ComCtrls;

type
  TPackage = packed record {定义结构 TPackage}
    startFlag: char;
    totalSize: Integer;
    paramCnt: Integer;
    param1Len: Integer;
    param2Len: Integer;
    param3Len: Integer;
    param1: array[0..254] of byte;
    param2: array[0..254] of byte;
    param3: array[0..254] of byte;
    endFlag: Char;
  end;


type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Edit1: TEdit;
    GroupBox2: TGroupBox;
    Memo1: TMemo;
    btn_read: TBitBtn;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    edt_param1: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    edt_param2: TEdit;
    edt_param3: TEdit;
    btn_write: TBitBtn;
    StatusBar1: TStatusBar;
    Button1: TButton;
    procedure btn_writeClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure btn_readClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
    TempName: string;
    data: TPackage;

implementation

{$R *.dfm}

procedure TForm1.btn_writeClick(Sender: TObject);
var

  param1, param2, param3: string;
  paramCnt, len_param1, len_param2, len_param3: integer;
  i: integer;

  Stream1: TMemoryStream;
begin


  paramCnt := strtoint(Trim(Edit2.Text));
  param1 := edt_param1.Text;
  param2 := edt_param2.Text;
  param3 := edt_param3.Text;

  len_param1 := Length(param1);
  len_param2 := Length(param2);
  len_param3 := Length(param3);

  data.startFlag := '#';

  data.paramCnt := paramCnt;
  data.param1Len := len_param1;
  data.param2Len := len_param2;
  data.param3Len := len_param3;

  for i := 0 to Length(param1) do
  begin
      data.param1[i] := byte(param1[i]) ;
  end;

  for i := 0 to Length(param2) do
  begin
    data.param2[i] := byte(param2[i]);
  end;

  for i := 0 to Length(param3) do
  begin
    data.param3[i] := byte(param3[i]);
  end;
  data.endFlag := '#';
  data.totalSize := SizeOf(data);


  Memo1.Clear;
  Memo1.Lines.Add('包大小:' + IntToStr(SizeOf(data)) + '字节');


  Stream1 := TMemoryStream.Create;
  Stream1.LoadFromFile(ParamStr(0));

  Memo1.Lines.Add('当前EXE文件:' + ParamStr(0) + ',大小:' + IntToStr(Stream1.Size) + '字节');
  Stream1.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Sr: TSearchRec;
  size : Longint;
begin
  FindFirst(ParamStr(0),$27,Sr);
  size:=Sr.Size;
  FindClose(Sr);
  StatusBar1.SimpleText:='本程序大小为 '+IntToStr(size)+' 字节';
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ShowMessage(TempName+'  '+ParamStr(0));
  WinExec(PChar(TempName+'  '+ParamStr(0)), SW_SHOWNORMAL);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Dir: PChar;
  Ch: Array[0..3] of Char;
  Stream1,Stream2: TMemoryStream;
      param1, param2, param3: string;
  i:integer ;
begin
  GetMem(Dir,254);
  GetTempPath(254, Dir);
  //TempName:=StrPas(Dir)+'o.o.0.o.o.exe';
  TempName:=ExtractFilePath(ParamStr(0))+'测试o.o.0.o.o.exe';
  CopyFile(PChar(ParamStr(0)),PChar(TempName),False);
  Stream1:=TMemoryStream.Create;
  Stream2:=TMemoryStream.Create;
  Stream1.LoadFromFile(TempName);

  //在尾部加入 字节
  Stream1.Seek(0,soFromEnd);

  Stream1.Write(data.startFlag,SizeOf(data.startFlag));
  Stream1.Write(data.totalSize,SizeOf(data.totalSize));
  Stream1.Write(data.paramCnt,SizeOf(data.paramCnt));
  Stream1.Write(data.param1Len,SizeOf(data.param1Len));
  Stream1.Write(data.param2Len,SizeOf(data.param2Len));
  Stream1.Write(data.param3Len,SizeOf(data.param3Len));
  Stream1.Write(data.param1,SizeOf(data.param1));
  Stream1.Write(data.param2,SizeOf(data.param2));
  Stream1.Write(data.param3,SizeOf(data.param3));
  Stream1.Write(data.endFlag,SizeOf(data.endFlag));

     for i := 0 to Length(data.param1)  do
  begin
    param1 := param1+ char(data.param1[i]);
  end;

      for i := 0 to Length(data.param2)  do
  begin
    param2 := param2+ char(data.param2[i]);
  end;

      for i := 0 to Length(data.param3) do
  begin
    param3 := param3+ char(data.param3[i]);
  end;


  Memo1.Lines.Add('data.startFlag:'+data.startFlag);
  Memo1.Lines.Add('data.totalSize:'+inttostr(data.totalSize));
  Memo1.Lines.Add('data.paramCnt:'+inttostr(data.paramCnt));
  Memo1.Lines.Add('data.param1Len:'+inttostr(data.param1Len));
  Memo1.Lines.Add('data.param2Len:'+inttostr(data.param2Len));
  Memo1.Lines.Add('data.param3Len:'+inttostr(data.param3Len));
  Memo1.Lines.Add('data.param1:'+trim(param1));
  Memo1.Lines.Add('data.param2:'+trim(param2));
  Memo1.Lines.Add('data.param3:'+trim(param3));
  Memo1.Lines.Add('data.endFlag:'+data.endFlag);

  ShowMessage(Memo1.Text);

  //修改偏移48的一个字节,记录程序运行次数
  Stream1.Seek(0,soFromBeginning);
  Stream2.CopyFrom(Stream1,Stream1.Size);
  //Stream2.CopyFrom(Stream1,48);
  //Stream1.Seek(48,soFromBeginning);
  //Stream1.Read(Ch,1);
 // Ch[0]:=Chr(1+Ord(Ch[0]));
 // Stream2.Write(Ch,1);
 // Stream1.Seek(49,soFromBeginning);
 // Stream2.CopyFrom(Stream1,Stream1.Size-49);
  Stream2.SaveToFile(TempName);
  Stream1.Free;
  Stream2.Free;
  FreeMem(Dir);

  repeat Close Until FileExists(TempName);
end;

procedure TForm1.btn_readClick(Sender: TObject);
var
  Stream1: TMemoryStream;
    param1, param2, param3: string;
  i:integer;
begin

  Stream1:=TMemoryStream.Create;
  Stream1.LoadFromFile(ParamStr(0));

  //在尾部加入 字节
  Stream1.Seek(-SizeOf(data),soFromEnd);
  Stream1.Read(data.startFlag,SizeOf(data.startFlag));
  Stream1.Read(data.totalSize,SizeOf(data.totalSize));
  Stream1.Read(data.paramCnt,SizeOf(data.paramCnt));
  Stream1.Read(data.param1Len,SizeOf(data.param1Len));
  Stream1.Read(data.param2Len,SizeOf(data.param2Len));
  Stream1.Read(data.param3Len,SizeOf(data.param3Len));

 
  Stream1.Read(data.param1,SizeOf(data.param1));
  Stream1.Read(data.param2,SizeOf(data.param2));
  Stream1.Read(data.param3,SizeOf(data.param3));
  Stream1.Read(data.endFlag,SizeOf(data.endFlag));

  if(data.startFlag <> '#' ) or (data.endFlag <> '#' ) then
  begin
    ShowMessage('文件还未配置,请先写入 配置');
    Stream1.Free;
    Exit;
  end;

   for i := 0 to Length(data.param1)  do
  begin
    param1 := param1+ char(data.param1[i]);
  end;

      for i := 0 to Length(data.param2) do
  begin
    param2 := param2+ char(data.param2[i]);
  end;

      for i := 0 to Length(data.param3)  do
  begin
    param3 := param3+ char(data.param3[i]);
  end;



  Memo1.Lines.Add('data.startFlag:'+data.startFlag);
  Memo1.Lines.Add('data.totalSize:'+inttostr(data.totalSize));
  Memo1.Lines.Add('data.paramCnt:'+inttostr(data.paramCnt));
  Memo1.Lines.Add('data.param1Len:'+inttostr(data.param1Len));
  Memo1.Lines.Add('data.param2Len:'+inttostr(data.param2Len));
  Memo1.Lines.Add('data.param3Len:'+inttostr(data.param3Len));
  Memo1.Lines.Add('data.param1:'+trim(param1));
  Memo1.Lines.Add('data.param2:'+trim(param2));
  Memo1.Lines.Add('data.param3:'+trim(param3));
  Memo1.Lines.Add('data.endFlag:'+data.endFlag);

  Stream1.Free;


end;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值