吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1037|回复: 10
收起左侧

[求助] 以下改写目标程序的Delphi程序有一句看不懂,请指点,谢谢

[复制链接]
冥界3大法王 发表于 2021-12-23 13:33

[Delphi] 纯文本查看 复制代码
procedure TForm1.Button1Click(Sender: TObject);
var
  vFS : TFileStream;
  vStr : String;
begin
  vStr := '1234';
  vFs := TFileStream.Create('C:\我的测试.jpg',fmOpenReadWrite);
  try
    vFS.Position := $400;
    vFS.WriteBuffer(pointer(vStr)^,4);      ================>这句不明白
  finally
    FreeAndNil(vFS);
  end;
end;


确实写入了四个字节,用WinHEX对比了下,却是:
1. C:\5221115.png: 136,794 字节
2. C:\我的测试.png: 136,794 字节
Offsets: 16进制
  400:        83        31
  401:        42        00
  402:        9D        32
  403:        DC        00

4 differencesMatch(es) detected.

比如 要写入b0 01 c3呢?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 冥界3大法王 发表于 2021-12-23 13:35
本帖最后由 冥界3大法王 于 2021-12-23 13:50 编辑

成功了是成功了,但现在不明白,一一对应的关系。
求先生教我。

参考:https://bbs.csdn.net/topics/300050929
https://bbs.csdn.net/topics/350111052?list=6045087
https://zhidao.baidu.com/question/24283762.html
topzhp 发表于 2021-12-23 14:13
在文件$400的位置,写了4个字符
要写vStr := 'b0 01 c3';   中间有两空格 所以要改成
vFS.WriteBuffer(pointer(vStr)^,8);

免费评分

参与人数 1热心值 +1 收起 理由
冥界3大法王 + 1 谢谢@Thanks!

查看全部评分

tywolf 发表于 2021-12-23 14:16
本帖最后由 tywolf 于 2021-12-23 14:20 编辑

这个程序只是简单的往一个文件里指定的地址写入您想要的东西(字符串?二进制文件?资源文件等)

WriteBuffer是写入多少字节的内容到指定的起始地址位置

Position中文直译是定位的意思,也就是将文件流的指针定位到某个地址

$符号在delphi里是十六进制地址的意思,#符号在Delphi里是十进制地址的意思

在这个DEMO里,你如果想要修改写入的内容,只需要修改vStr变量对应的字符串,然后修改一下writebuffer函数的写法,就可以随意修改vstr的写入内容也不用数

[Delphi] 纯文本查看 复制代码
writebuffer(pointer(vStr)^,sizeof(vstr));

免费评分

参与人数 1热心值 +1 收起 理由
冥界3大法王 + 1 谢谢@Thanks!

查看全部评分

sdzzb 发表于 2021-12-23 15:05
应该可直接写Hex数据($)或Hex数组,不需要string类型
qeeqeeeq 发表于 2021-12-23 15:20
要写入b0 01 c3呢  最好使用字节数组,更方便,你上面写入的是、“12”,应该编码不同,所以都带了00,字节数组就不会这样
pzx521521 发表于 2021-12-23 16:03
本帖最后由 pzx521521 于 2021-12-23 16:13 编辑

对二进制修改很少用string 所有语言对应的都是Byte
string 对用的是unicode 就是 widechar 对应2个Byte, 如果不想要00 写 ansistring 或者ansichar 转一下
delphi 的string 是很特殊的  下标从[1]开始, 你可以百度 "delphi stirng byte"自己转一下就知道stirng byte之间的关系了
[Pascal] 纯文本查看 复制代码
procedure TForm5.btn1Click(Sender: TObject);
var
  vFS : TFileStream;
  a : TBytes;
begin
  vFs := TFileStream.Create('C:\Users\Administrator\Desktop\新建文本文档.txt',fmOpenReadWrite);
  try    
    vFS.Position := 0;
    SetLength(a, 3);
    a[0] := $B0;   //b0
    a[1] := $01;   //01
    a[2] := $c3;   //c3    
    vFS.WriteBuffer(a[0], Length(a)); //a[0]指向首地址    
  finally   
    FreeAndNil(vFS);
  end;
end;

免费评分

参与人数 1热心值 +1 收起 理由
冥界3大法王 + 1 谢谢@Thanks!

查看全部评分

 楼主| 冥界3大法王 发表于 2022-1-8 22:57
本帖最后由 冥界3大法王 于 2022-1-8 22:59 编辑
sdzzb 发表于 2021-12-23 15:05
应该可直接写Hex数据($)或Hex数组,不需要string类型

@sdzzb
但是问题来了,我想用Edit1.Text上面用于接收输入的机器码

@tywolf
writebuffer(pointer(vStr)^,sizeof(vstr));
不报错,输出结果也不对

@pzx521521
找来一堆还是折腾不明白,折腾一天,实在是太笨了。
[Delphi] 纯文本查看 复制代码
var
  vFS : TFileStream;
  a : TBytes;
begin
  vFs := TFileStream.Create(sEdit1.text,fmOpenReadWrite);
  try
    vFS.Position := $843; //后面这个赋值Edit1就出问题了;我要实现的效果是ComboBox1中用于存放各种类型的机器码。。。批量输出
    SetLength(a, Length(E2.Text) div 2);      //后面是写入的长度
    a[0] := $EB;          //后面这里转换成字节数组不会;多行更傻了,难道把字符串 拆成 字节用个for 遍历字节数组?
    a[1] := $07;
    vFS.WriteBuffer(a[0], Length(a));         //a[0]指向首地址
  finally
    FreeAndNil(vFS);
  end;
end;

实在是太饭桶了,还请师傅给个实现的代码吧。
唉。。。
 楼主| 冥界3大法王 发表于 2022-1-8 23:12
pzx521521 发表于 2022-1-10 10:51
你想要什么效果?
比如字符串'1234'对应的是byte数组(Buffer)应该是是什么?
正常的应该是[49,50,51,52](ASCII)
[Pascal] 纯文本查看 复制代码
var
  a : TBytes;
  I: Integer;
  s: string;
begin
  s := edt1.Text;
  SetLength(a, Length(s));
  for I := 1 to Length(s) do//string 是从1开始的
  begin
    a[I-1] := Ord(s[I])
  end;
end;
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 17:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表