写机器码改写EXE文件
版本1:
procedure TForm1.Button2Click(Sender: TObject); var vFS: TFileStream; A1: Integer; begin A1 := $07EB; //要写入的机器码 ShowMessage(IntToStr(A1)); //变成了10进制的啦 vFS := TFileStream.Create(sEdit1.Text, fmOpenReadWrite); try vFS.Position := $843; //要写入的FOA(文件偏移地址)即在x64dbg中直接复制得到的那个无需转换! vFS.WriteBuffer(A1, Length(E2.Text) div 2); finally FreeAndNil(vFS); end; end;
版本2:
procedure TForm1.cc1Click(Sender: TObject); var vFS: TFileStream; a: TBytes; begin vFS := TFileStream.Create(sEdit1.text, fmOpenReadWrite); try vFS.Position := $843; //后面这个赋值E1不会报错 SetLength(a, Length(E2.Text) div 2); //后面是写入的长度 a[0] := $EB; //后面这里转换成字节数组不会 a[1] := $07; vFS.WriteBuffer(a[0], Length(a)); //a[0]指向首地址 finally FreeAndNil(vFS); end; end;
版本3:组合了(取编辑框字符串+拆分成字节码数组)
{好友巧妙的用了一个自定义函数完成转换! 不然直接调用就出错了! } function HexToInt(Value: string): Integer; begin result := StrToInt('$' + Value); end; procedure TForm1.NewClick(Sender: TObject); var vFS: TFileStream; A1: Integer; begin A1 := HexToInt(E2.Text); //要写入的机器码 // ShowMessage(IntToStr(A1)); //变成了10进制的啦 vFS := TFileStream.Create(sEdit1.Text, fmOpenReadWrite); try vFS.Position := HexToInt(E1.Text); //要写入的FOA(文件偏移地址)即在x64dbg中直接复制得到的那个无需转换! vFS.WriteBuffer(A1, Length(E2.Text) div 2); finally FreeAndNil(vFS); end; end;
拆分机器码:
procedure TForm1.sdsdClick(Sender: TObject); var buf: array[0..100] of byte; str: string; begin str := '07EB'; Move(str[1], buf[0], 32); ShowMessageFmt('$%.2d, $%.2d, $%.2d, $%.2d', [buf[3], buf[2], buf[1], buf[0]]); end;
采用EnigmaVirtualBox制作单文件便携版只是兴趣爱好,在WES7环境中制作,不保证全系统下正常,随缘随心随性。
温馨提醒建议在SandBoxie中测试https://www.lanzous.com/iatkifc