真诚请教用VB 修改二进制文件,并匹配二进制文件中的字符串?

colordancer 2008-07-18 11:12:58
我做的是一个修复 被病毒感染的文件 的工具
被病毒感染的文件 末尾是特定的字符串,我要用正则表达式匹配到

但是为了不破坏原来的文件,所以只能以二进制读取,这就带来一系列的问题:
比如:
1·byte数组怎么匹配到那个字符串
2·修改后怎么回写到原来的文件中

我目前没有好的想法,主要卡在“用VB 修改二进制文件,并且匹配二进制文件中的字符串”
我这两天已经百度了不下几百页了,还是没方案
真诚等到高人的出现,有例子就更好啦
...全文
374 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxp5556 2010-09-05
  • 打赏
  • 举报
回复
云里雾里的
WXP1027 2009-01-05
  • 打赏
  • 举报
回复
好,谢谢
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wlxu1209 的回复:]
老马的口号怎么改了?
好像对VB很失望的样子
[/Quote]
因為在中國VB群相對其他語言認可度沒那么高
不管怎樣VB相對其他語言來說 開發效率和執行效率并不算差
colordancer 2008-07-20
  • 打赏
  • 举报
回复
楼上的朋友,强悍!
  • 打赏
  • 举报
回复
增加2行代碼會更清楚 VB怎么操作字符串的

Private Sub Command1_Click()
Dim a() As Byte
Dim b() As Byte
a = "1234abc"
b = "abc"
b(2) = 0
a(6) = 0
a(10) = 0
Debug.Print InStr(a, b), a, b, UBound(a), UBound(b)
ReDim Preserve a(14)
a(14) = 66
ReDim Preserve b(6)
b(6) = 65
Debug.Print InStrB(a, b), a, b, UBound(a), UBound(b)
b(6) = 66
Debug.Print InStrB(a, b), a, b, UBound(a), UBound(b)
End Sub
colordancer 2008-07-20
  • 打赏
  • 举报
回复
读取后面几位字节的思路,我自己研究,再次感谢~
  • 打赏
  • 举报
回复
最好不要存到string變量中
byte數組直接可以當作用字符串來使用
我給你舉個例子就知道了

Private Sub Command1_Click()
Dim a() As Byte
Dim b() As Byte
a = "1234abc"
b = "abc"
b(2) = 0
a(6) = 0
a(10) = 0
Debug.Print InStr(a, b), a, b, UBound(a), UBound(b)
ReDim Preserve a(14)
a(14) = 66
ReDim Preserve b(6)
b(6) = 65
Debug.Print InStrB(a, b), a, b, UBound(a), UBound(b)
End Sub
colordancer 2008-07-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 colordancer 的回复:]
引用 4 楼 happy_sea 的回复:
1、这种病毒在文件末尾添加的特殊字符不会是中文的吧,因为你只需要判断是否为真,所以我说的用字符串处理仍然是可行的;
2、get和put的第一个参数是文件号,第二个参数是读写位置,第三个参数是数据,你用binary方式打开一个文件后,在close前,可以在任意位置读取和写入数据,除非必要,你完全可以只读写需要处理的数据,而不必整个文件读出后再处理,更不用处理完后写入另一个文件,只是需要处…
[/Quote]

经过不断尝试,我发现,1楼的大哥的方法是可行的
而我之所以失败,是因为我在写文件的时候,用错了方法:
Open sFileName For Output As h
Print #h, SFile
Close

这样导致文件打不开
而还是应该是二进制方式写回去

谢谢老大了~~~~~~~~~~~收我为徒吧
结贴了~~~~~~~~~~~
colordancer 2008-07-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ayalicer 的回复:]
引用 7 楼 wlxu1209 的回复:
老马的口号怎么改了?
好像对VB很失望的样子

因為在中國VB群相對其他語言認可度沒那么高
不管怎樣VB相對其他語言來說 開發效率和執行效率并不算差
[/Quote]

嗯,这也是我重拾VB的原因,开发效率快
colordancer 2008-07-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 happy_sea 的回复:]
1、这种病毒在文件末尾添加的特殊字符不会是中文的吧,因为你只需要判断是否为真,所以我说的用字符串处理仍然是可行的;
2、get和put的第一个参数是文件号,第二个参数是读写位置,第三个参数是数据,你用binary方式打开一个文件后,在close前,可以在任意位置读取和写入数据,除非必要,你完全可以只读写需要处理的数据,而不必整个文件读出后再处理,更不用处理完后写入另一个文件,只是需要处理好每次读写的位置,相当于指…
[/Quote]

十分感谢
可是对于您的第一个回答:
我试了一下,我直接是binary读入,存到string里,然后再把这个string写到另一个文件,(这是一个gif文件),却提示gif打不开了,这是为什么呢

谢谢!
明寿 2008-07-19
  • 打赏
  • 举报
回复
老马的口号怎么改了?
好像对VB很失望的样子
colordancer 2008-07-18
  • 打赏
  • 举报
回复
楼上的朋友,太感谢了
1我下午试一下
2我不怎吗明白,为什么要计算好开始写入的位置
因为我目前的做法是读取整个文件,然后匹配/删除,再全部写回去
你之所以要计算好位置,是因为只读取末尾的特定字节吧
3如果能提供代码就更好了,5年不做vb了,现在重拾,语法忘得还是挺多的

十分感谢
happy_sea 2008-07-18
  • 打赏
  • 举报
回复
1、以二进制打开,同样可以按字符串方式读取数据,比如用下面的方法读取最末尾的7个字符:
open "c:\myfile.dat" for binary as #1
dim s as string * 7
get #1,lof(1)-6,s '读取后按字符串用正则匹配就行了
debug.print s
close #1
2、修改后直接用put写就行了,不过要计算好开始写入的位置:
open "c:\myfile.dat" for binary as #1
'此处是处理过程
put #1,lPos,data 'lPos是计算好的位置,data可以是字符串也可以是byte数组
close #1
3、如果要去掉末尾的标志字符,也就是使文件变小,也无需重新写入另一个文件,如果需要我再给你提供代码。
嗷嗷叫的老马 2008-07-18
  • 打赏
  • 举报
回复
嘿,支持,路过!
haifengsCS 2008-07-18
  • 打赏
  • 举报
回复
1楼正解
happy_sea 2008-07-18
  • 打赏
  • 举报
回复
1、这种病毒在文件末尾添加的特殊字符不会是中文的吧,因为你只需要判断是否为真,所以我说的用字符串处理仍然是可行的;
2、get和put的第一个参数是文件号,第二个参数是读写位置,第三个参数是数据,你用binary方式打开一个文件后,在close前,可以在任意位置读取和写入数据,除非必要,你完全可以只读写需要处理的数据,而不必整个文件读出后再处理,更不用处理完后写入另一个文件,只是需要处理好每次读写的位置,相当于指针。
colordancer 2008-07-18
  • 打赏
  • 举报
回复
回happy_sea :
1是不可行的
因为:
在VB中一定要记住,不能使用String变量处理二进制数据。早期的VB是采用单字节处理方式(通常也称为ANSI方式),也就说一个英文字母用一个字节表示,一个汉字算两个字节,当然这样就可能出现半个汉字的问题。从VB 4.0起,VB采用了一种新的处理方式,即内部采用Unicode方式,即不论英文字母还是汉字,一律用两个字节表示,但Unicode还不够普及,所以VB只是在其内部完全使用Unicode,而在外部仍转换为人们习惯的ANSI方式,但在字符串处理上与先前的版本有所不同。例如:在中文Windows或英文Windows外挂RichWin 97中,Len("电子&电脑")=5(这里的&号为半角字符),而在以前的版本或纯英文Windows中Len("电子&电脑")=9。除了Len、Left、Right等字符串函数受此影响外,所有字符操作都受此影响。如果你把二进制数据读入字符串变量,在读入的过程中会发生转换错误,这样你再写入文件数据也就不对了。以上的讨论对于中文等双字节系统都是适用的,但英文版下没有这个问题。所以,你在网上看到的许多程序因为都是美国人写的,他们根本就不考虑这个问题,使用字符串来处理二进制数据,但这样的程序在中文系统中肯定出错。解决的办法是使用Byte数组来处理二进制数据,这样就不会有你说的问题了

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧