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

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

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

我目前没有好的想法,主要卡在“用VB 修改二进制文件,并且匹配二进制文件中的字符串”
我这两天已经百度了不下几百页了,还是没方案
真诚等到高人的出现,有例子就更好啦
...全文
393 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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数组来处理二进制数据,这样就不会有你说的问题了
该工具支持多个型号,包括但不限于idata95w、idata95v以及iData95等。它是一种pda刷机软件,即个人数字助理(Personal Digital Assistant)设备的固件升级程序。刷机通常指的是将设备的固件或者操作系统进行更新或替换的过程,可以用来修复系统问题、提升设备性能或更新新功能。 刷机工具的操作过程通常包括连接设备到电脑、选择正确的固件版本、执行刷机程序以及等待过程完成。在进行刷机之前,用户需要确保下载的刷机工具版本与自己的设备型号相匹配,并严格遵循操作说明,以避免刷机失败导致设备变砖(即设备无法启动)。 在压缩包文件列表仅提到了"A5V2R2刷机工具",这可能表明该工具是为特定版本的idata95系列产品设计的。可能是指固件的版本号,比如A5V2R2可能代表某个版本的固件,其A5可能表示版本类型,V2表示版本号,R2可能表示修订级别。 刷机工具有时还包含有解锁Bootloader(引导程序)的功能,这在某些设备是进行刷机前的必要步骤。Bootloader是设备启动时首先运行的一段代码,负责加载操作系统。在一些设备上,Bootloader被锁定,以防止非授权的系统更改。解锁Bootloader可能会清除设备上的所有数据,因此这个过程需要谨慎操作。 刷机工具的使用通常涉及以下步骤: 1. 准备工作:备份好设备上的个人数据,确保数据安全。 2. 下载对应的刷机工具:根据设备型号下载相应的刷机工具,确保来源的安全可靠。 3. 启动设备至下载模式:这通常需要在设备关闭状态下同时按住特定的几个按键来进入。 4. 连接设备到电脑:使用USB数据线将设备连接到电脑。 5. 运行刷机工具:打开刷机工具软件,通常会有一个简单的用户界面指导用户完成刷机过程。 6. 执行刷机程序:根据软件指示选择相应的固件文件,然后软件会自动完成刷机过程。 7. 刷机后处理:刷机完成后,通常需要手动启动设备或进行额外的配置以确保设备正常运行。 刷机不仅在技术上有一定风险,而且可能会使设备的保修失效。因此,如果没有足够的经验或者不确定是否需要刷机,建议不要轻易尝试。此外,刷机也可能导致设备的某些功能无法使用或不稳定,所以在进行刷机之前应该进行充分的了解和准备。"
“1-考试报名系统1”项目是一个数据结构课程设计,旨在创建一个考试报名系统。该项目由汪明杰同学在软件学院软件工程专业,同济大学进行,指导教师为张颖。 本文档详细阐述了项目的分析、设计、实现和测试过程。首先,项目背景指出考试报名系统对学校教务管理的重要性,特别是在处理大量考试人员时的挑战。接着,项目需求分析部分明确了系统应具备的功能,包括用户友好性、数据处理能力等。 在项目要求,功能要求详细列出了系统应具备的各个功能,如: 1.3.1 功能要求:这可能包括考生注册、考试选择、报名、取消报名、查询考试信息等功能。 1.3.2 输入格式:可能涉及考生信息输入的格式规范,如姓名、学号、选择的考试科目等。 1.3.3 输出格式:可能涉及打印报名成功通知、查询结果展示等输出信息的格式。 项目设计部分讨论了数据结构和类的设计: 2.1 数据结构设计:可能使用数据结构如链表来存储和管理考生信息和考试数据。 2.2 类设计:包括结点类(ListNode)、双向链表类(List)以及数据库类(DataBase),用于构建系统的核心结构。 在项目实现章节,详细描述了各个功能的实现逻辑和代码,包括: 3.1 项目主体功能:涵盖系统的整体流程和代码实现。 3.2 项目初始化:如何加载初始数据,包括读取文件和手动输入。 3.3 插入数据:添加新的考生信息或考试报名。 3.4 删除数据:取消考生的报名。 3.5 修改数据:更新考生信息或考试选择。 3.6 查询数据:根据特定条件查找考生信息或考试详情。 3.7 统计数据:可能包括统计报名人数、考试科目选择情况等。 最后,项目测试部分涵盖了各种测试用例,确保系统的正确性和稳定性,如: 4.1 项目初始化测试:验证数据加载功能。 4.2 插入、删除、查找、修改和统计测试:分别检查各功能是否正常工作。 4.7 边界测试:测试特殊情况,如插入已存在的考生、删除不存在的考生等。 这个“1-考试报名系统1”项目涵盖了软件开发的完整生命周期,从需求分析到设计、实现和测试,体现了软件工程的核心原则,特别是数据结构的应用和系统功能的实现。

7,785

社区成员

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

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