有关于配置器写法的问题困绕了小弟好几天,忘高手指点一二!(100分)

  • 主题发起人 主题发起人 精灵猪
  • 开始时间 开始时间

精灵猪

Unregistered / Unconfirmed
GUEST, unregistred user!
本人想写个类似木马配置器的程序在网上看到一篇文章 地址是<br>http://bbs.caoyuan.net/viewtopic.php?t=26389<br>其中服务端的关键部分<br>seek(f, filesize(f)); //上次是将指针移动到指定位置,这次是将指针移动到文件末尾 <br>for i := 1 to 255 do str := char(0); //循环写入所有的配置数据 <br>for i := 1 to length(str) do str := HostName; <br>BlockWrite(f, str, length(HostName)); <br>Each_size[1] := char(length(HostName)); //计算出配置数据的长度 <br><br>blockwrite(f, Each_size, 1); //写入配置文件的长度到末尾,否则文件改变了长度没变会出错 <br>CloseFile(f); //最后别忘了关闭 <br>和客户端的关键部分<br>assignfile(f, paramstr(0)); //打开自己 <br>Reset(f, 1); <br>seek(f, filesize(f) - 1); //移动到末尾-1,因为最后一个字节记录的是配置长度,不是配置数据 <br>BlockRead(f, each_size, 1); //读出长度 <br>len := 0; <br>for i := 1 to 2 do len := len + ord(each_size); //计算总长度 <br>seek(f, filesize(f) - 1 - len); //将指针移动到配置数据开始的地方 <br>for i := 1 to 255 do str := ' '; <br>blockread(f, str, len); //读出所有配置数据 <br>setstr := (trim(DecryptSettings(str))); //将配置数据解密后付值给SetStr变量 <br>CloseFile(f); //关闭 <br>问题出来了 他只能读写255字节的长度 我的程序配置比较长 试过很多方法都不成 而这种写入配置的方式正好适合我的程序 可是由于长度的问题在实践过程中始终不好解决 <br>有的时候只能读出一半或者一小部分 请各位看官给出出主意 程序如何改才能支持比较长的输入 比如最长可以长到1024 请指教 小弟不盛感激!
 
那位高人回答一下 小弟在线等
 
我晕,这可以灵活变通的嘛!你先把你的配置信息弄成byte数组,然后把这个数组写入服务端,由于数组的长度可以自定义,当然就突破了255的限制了!代码大致是下面这样!自己修改下就可以了<br><br>const code:array[0..长度] of byte &nbsp;= ($48, $48, $5F, ...这里是配置信息);<br>var fs: TFileStream;<br>begin<br>//下面用文件流打开<br>fs := TFileStream.Create('服务端.exe', fmOpenReadWrite +fmShareDenyWrite);<br> &nbsp;try<br> &nbsp; &nbsp;//这里定位到你要写入配置信息的地方<br> &nbsp; &nbsp;fs.Seek($238,sofrombeginning);<br> &nbsp; &nbsp;fs.Write(code,length(code));<br>finally<br> &nbsp; &nbsp;fs.Free;<br> &nbsp;end;
 
可是这样似乎特别麻烦 如果我要1024个字节的不就是要<br>const code:array[0..1024] of byte &nbsp;= ($00, $00, $00, ...这样写1024个$00吗?);<br>var fs: TFileStream;<br>而且能不能不改变这个方式还是从底部读起?主要是从最后读1字节的长度 他最大也就是255了 小弟编程很烂 还忘多指点下
 
如果你的配置有规律的话,比如说很多0,完全可以定义一个数组,用循环赋值啊,比如说1024个$00,可以这样啊!<br>for i:=0 to 1023 code:=$00;<br>至于从底部读起也可以啊,把sofrombeginning改下就行了
 
不知道这样可否,你最后使用两个字节存放长度,一个A是255的倍数,一个B是除以255的余数,然后你在计算配置长度的时候用255*A+B.
 
hityou 的想法我认为比较省事 但是我试了居然不成功 能否写段代码 我测试下 我编程垃圾 见笑了 我是把Each_size改成了 string然后占尾部的4字节 结果还是不成
 
声明部分<br>Each_size:array[1..1] of char 改为 &nbsp;Each_size:array[1..2] of char<br>服务器部分<br>Each_size[1]:=char(length(HostName) div 255);//倍数<br>Each_size[2]:=char(length(HostName) mod 255);//余数 <br>blockwrite(f,Each_size,2);<br>客户端部分;<br>seek(f, filesize(f) - 2); &nbsp;<br>BlockRead(f, each_size, 2); //声明同上<br>len:=255*ord(each_size[1])+ord(each_size[2])//求出长度<br><br>至于str长度的定义,以及循环就得根据你的实际情况来了
 
谢谢各位老哥的关心
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
806
import
I
后退
顶部