Board logo

标题: vb问题(2) [打印本页]

作者: 阿尔法孝直    时间: 2004-12-27 13:31

麻烦问一下:假如将一个十六进制的文件(比如英杰传的main.exe)取文件号为#1,那么将该文件地址为0x030FBC的地方改为FF,问语句是什么?谢谢!
作者: Maxwell    时间: 2004-12-28 18:24



QUOTE:
原帖由阿尔法孝直于2004-12-27, 13:31:49发表
麻烦问一下:假如将一个十六进制的文件(比如英杰传的main.exe)取文件号为#1,那么将该文件地址为0x030FBC的地方改为FF,问语句是什么?谢谢!

dim v as byte
v = 255
put #1, 200636, v

我很久不用vb读写文件了,大概是这么写。
作者: Tom Joad    时间: 2004-12-28 20:53



QUOTE:
原帖由Maxwell于2004-12-28, 18:24:17发表
dim v as byte
v = 255
put #1, 200636, v

我很久不用vb读写文件了,大概是这么写。

地址好象要加1的:
put #1, &H30FBC+1, v
今天天氣好冷啊!
作者: Maxwell    时间: 2004-12-28 21:14



QUOTE:
原帖由Tom Joad于2004-12-28, 20:53:06发表

QUOTE:
原帖由Maxwell于2004-12-28, 18:24:17发表
dim v as byte
v = 255
put #1, 200636, v

我很久不用vb读写文件了,大概是这么写。

地址好象要加1的:
put #1, &H30FBC+1, v
今天天氣好冷啊!  

嗯,有道理,不知道原文给的地址是0起还是1起的,用c/c++习惯了,都是给什么地址写什么地址的。
作者: 阿尔法孝直    时间: 2005-1-7 13:46

本人调用了你们所说的语句,发现0x30FBC与0x30FBD都被改成了00(如图所示)
怪哉!Help!

图片附件: jsyx.jpg (2005-1-7 13:46, 111.08 K) / 该附件被下载次数 127
http://xycq.org.cn/forum/attachment.php?aid=4020


作者: Maxwell    时间: 2005-1-8 12:12

你用的代码完整贴出来看看,不太清楚是怎么回事。
作者: 阿尔法孝直    时间: 2005-1-8 15:47

Put 200636,255
Put 200637,255
Put 200637,&HFF
Put &H30FBC,&HFF
Put &H30FBD,&HFF
我就试了这几种,每试完一种后都用原来的main.exe还原改过的main.exe!可就是30FBC=00,30FBD=00!
作者: van    时间: 2005-1-8 18:17

你用Maxwell的那个代码是不会出错的。
至于你提供的那些代码,改成CByte(255)试试看
作者: 阿尔法孝直    时间: 2005-1-9 10:17

哈哈,终于成功了!
[Put &H30FBD Cbyte(255)]
为表示感谢,送给van和maxwell每人10通宝。
作者: 阿尔法孝直    时间: 2005-1-10 12:30

但是引发了下一个问题:
虽然30FBC被成功地改成了FF,但30FBD被改成了00(原值是04)!

图片附件: jsyx1.jpg (2005-1-10 12:30, 109.91 K) / 该附件被下载次数 102
http://xycq.org.cn/forum/attachment.php?aid=3324


作者: 金圭子    时间: 2005-1-10 12:52

我随便弄了个文件,写一串aaaaaaaa
然后用
Private Sub Command1_Click()
Open "C:\a.txt" For Binary As #1

Put #1, 6, 255

Close #1
End Sub

在5H变成FF,6H变成0


但是如果用
Private Sub Command1_Click()
Open "C:\a.txt" For Binary As #1

Put #1, 6, CByte(255)

Close #1
End Sub
这个则就仅仅是5H变成了FF,6H还是61(a)
好像没出现你的情况啊?
作者: Maxwell    时间: 2005-1-11 13:27



QUOTE:
原帖由阿尔法孝直于2005-01-10, 12:30:46发表
但是引发了下一个问题:
虽然30FBC被成功地改成了FF,但30FBD被改成了00(原值是04)!

如果两个字节被改了说明没有正确识别类型,我觉得我的那个代码应该不会出错。用cbyte转换的也不会出错才对。
作者: 阿尔法孝直    时间: 2005-1-19 13:48

继续 ask for help
本人做了个实验:
在VB里执行下列语句:
Private Sub Com1_Click()
Open "d:\sgzyjz\Main.exe" For Binary As #1
Dim a As String * 1
Get #1, &H30FBD, a
Debug.Print a
End Sub
结果不是"v",而是空格!Why?
(事先确定30FBC=76)
作者: Maxwell    时间: 2005-1-19 14:36



QUOTE:
原帖由阿尔法孝直于2005-01-19, 13:48:54发表
继续 ask for help
本人做了个实验:
在VB里执行下列语句:
Private Sub Com1_Click()
Open "d:\sgzyjz\Main.exe"
For Binary As #1
Dim a As String * 1
Get #1, &H30FBD, a
Debug.Print a
nd Sub
结果不是"v",而是空格!Why?
(事先确定30FBC=76)

这里有点问题吧
作者: van    时间: 2005-1-19 20:54

那你把a转成byte数组,看看首元素是多少?
作者: 阿尔法孝直    时间: 2005-1-20 12:15



QUOTE:
原帖由Maxwell于2005-01-19, 14:36:35发表

QUOTE:
原帖由阿尔法孝直于2005-01-19, 13:48:54发表
继续 ask for help
本人做了个实验:
在VB里执行下列语句:
Private Sub Com1_Click()
Open "d:\sgzyjz\Main.exe"
For Binary As #1
Dim a As String * 1
Get #1, &H30FBD, a
Debug.Print a
nd Sub
结果不是"v",而是空格!Why?
(事先确定30FBC=76)

这里有点问题吧

按照十六进制的表示方法,第一字节是0,而按照VB的表示方法,第一字节是1
作者: 阿尔法孝直    时间: 2005-1-20 12:19



QUOTE:
原帖由van于2005-01-19, 20:54:26发表
那你把a转成byte数组,看看首元素是多少?

将它改了一下:
Private Sub Com1_Click()
Open "d:\sgzyjz\Main.exe" For Binary As #1
Dim a As Byte
Get #1, &H30FBD, a
Debug.Print a
End Sub
结果不是118,而是0
作者: van    时间: 2005-1-20 12:20

刚才copy了你的代码试了一下,是“v”啊,不应该出问题的
作者: van    时间: 2005-1-20 12:22

那估计是路径错了。你看看lof(1)是不是0,是0就说明没有找到文件
作者: Maxwell    时间: 2005-1-20 12:26



QUOTE:
原帖由阿尔法孝直于2005-01-20, 12:15:56发表

QUOTE:
原帖由Maxwell于2005-01-19, 14:36:35发表
[quote]原帖由阿尔法孝直于2005-01-19, 13:48:54发表
继续 ask for help
本人做了个实验:
在VB里执行下列语句:
Private Sub Com1_Click()
Open "d:\sgzyjz\Main.exe"
For Binary As #1
Dim a As String * 1
Get #1, &H30FBD, a
Debug.Print a
nd Sub
结果不是"v",而是空格!Why?
(事先确定30FBC=76)

这里有点问题吧

按照十六进制的表示方法,第一字节是0,而按照VB的表示方法,第一字节是1 [/quote]
用vb不用从0计,这样看上去太不方便了。
作者: Maxwell    时间: 2005-1-20 12:29

我没有你用的文件,但是试了一下其他的文件也没有问题。
作者: 阿尔法孝直    时间: 2005-1-20 12:35



QUOTE:
原帖由van于2005-01-20, 12:22:16发表
那估计是路径错了。你看看lof(1)是不是0,是0就说明没有找到文件

d:\sgzyjz\main.exe确实存在。
作者: 阿尔法孝直    时间: 2005-1-20 12:44



QUOTE:
原帖由van于2005-01-20, 12:20:58发表
刚才copy了你的代码试了一下,是“v”啊,不应该出问题的

你瞧,一个空格!(红圈处)

图片附件: error6.jpg (2005-1-20 12:44, 99.72 K) / 该附件被下载次数 107
http://xycq.org.cn/forum/attachment.php?aid=4500


作者: 阿尔法孝直    时间: 2005-1-20 12:49

30FBC确实等于76("v")

图片附件: jsyx2.jpg (2005-1-20 12:49, 161.34 K) / 该附件被下载次数 122
http://xycq.org.cn/forum/attachment.php?aid=4502


作者: Maxwell    时间: 2005-1-20 12:50

你先读个简单文件试试。
作者: 阿尔法孝直    时间: 2005-1-20 12:54

简单文件可以正常读。
作者: van    时间: 2005-1-20 13:07

你把一开始的Close移到Debug后面去。为什么一开始要close而最后反而不用呢?
作者: 阿尔法孝直    时间: 2005-1-21 10:50

防止二次打开文件产生错误。
作者: 阿尔法孝直    时间: 2005-1-21 12:08



QUOTE:
原帖由van于2005-01-20, 13:07:04发表
你把一开始的Close移到Debug后面去。为什么一开始要close而最后反而不用呢?

我按照你的建议,改了一下:

Private Sub Com1_Click()
Open "d:\sgzyjz\main.exe" For Binary As #1
Dim a As String * 1
Get #1, &H30FBD, a
Debug.Print a
Close #1
End Sub

结果仍然是空格
作者: Maxwell    时间: 2005-1-21 12:20

你传这个文件上来试试吧。
作者: 阿尔法孝直    时间: 2005-1-22 10:58

VB测试文件包

附件: MicrosoftVisualStudio.rar (2005-1-22 10:58, 1.05 K) / 该附件被下载次数 109
http://xycq.org.cn/forum/attachment.php?aid=4578
作者: Maxwell    时间: 2005-1-22 11:46



QUOTE:
原帖由阿尔法孝直于2005-01-20, 12:35:25发表
d:\sgzyjz\main.exe确实存在。

用函数判断一下到底打开了没有,存在不一定能打开。

我没有你那个main.exe,我用了另外一个exe文件,没有任何问题。
作者: 阿尔法孝直    时间: 2005-1-22 21:46

把main.exe给你吧

附件: main.exe (2005-1-22 21:46, 240.74 K) / 该附件被下载次数 93
http://xycq.org.cn/forum/attachment.php?aid=4595
作者: Maxwell    时间: 2005-1-22 22:36

是有点蹊跷啊,明天我再继续看看。
作者: Maxwell    时间: 2005-1-22 23:01

晕,现在不知怎么又正常了。
作者: loranrowe    时间: 2005-1-22 23:02

是main.exe的问题...
换原版的可以了
作者: Maxwell    时间: 2005-1-22 23:08



QUOTE:
原帖由loranrowe于2005-01-22, 23:02:12发表
是main.exe的问题...
换原版的可以了

什么意思?


不过现在再试无论如何都是对的了,另外。。。  不知道你修改了内容之后存盘了没有啊?
作者: loranrowe    时间: 2005-1-23 09:58

上传的main.exe文件的30FBD处数据为0x00显示出来当然是0了
程序没有任何其他问题
作者: Maxwell    时间: 2005-1-23 10:14

那个地方是0你不会改成不是0吗。。。楼主问的是那里不是0的时候为什么读出来也是0。我在第一次试的时候确实出了点问题,怎么改都是0,重新开了一次vb就好了。

金山游侠的编辑功能没用过,不知道是不是需要退出才能存盘,要是那样的话当然改了也没有用了。
作者: loranrowe    时间: 2005-1-23 11:10



QUOTE:
原帖由Maxwell于2005-01-23, 10:14:20发表
  那个地方是0你不会改成不是0吗。。。楼主问的是那里不是0的时候为什么读出来也是0。我在第一次试的时候确实出了点问题,怎么改都是0,重新开了一次vb就好了。

金山游侠的编辑功能没用过,不知道是不是需要退出才能存盘,要是那样的话当然改了也没有用了。

晕倒了
我执行了他的程序两次
第一次用上传的main.exe,要读取的位置数据为0x00
第二次用reko3原版的MAIN.EXE,要读取的位置数据为0x76
两次输出都很正常的说
没修改过main
会不会是大小写的问题
ps:
我又试了一下改过的main,还是很正常啊
事实证明,在我的机器上,类似问题不会重现...
文本编辑器建议使用UltraEdit
作者: Maxwell    时间: 2005-1-23 11:18

看他上传的图上金山游侠好像没有保存按钮,所以很怀疑是因为没存盘的问题。
作者: 阿尔法孝直    时间: 2005-1-24 07:54



QUOTE:
原帖由loranrowe于2005-01-23, 9:58:23发表
上传的main.exe文件的30FBD处数据为0x00显示出来当然是0了
程序没有任何其他问题

我不是讲过了吗,金山游侠读文件第一字节编号为0(0x000000),而VB读文件第一字节编号为1。所以金山游侠读出的0x030FBC处等效于VB读出的&H030FBD处(0x30FBD)。
作者: 阿尔法孝直    时间: 2005-1-24 07:55



QUOTE:
原帖由Maxwell于2005-01-23, 11:18:39发表
看他上传的图上金山游侠好像没有保存按钮,所以很怀疑是因为没存盘的问题。

用金山游侠修改文件是自动保存的。
作者: Maxwell    时间: 2005-1-24 09:47

建议你做如下操作
1. 复制一个main.exe到另外一个目录
2. 修改并关闭
3. 重新打开查看是否修改成功并关闭
4. 修改程序到新路径读文件
5. 执行

你用lof(1)测试一下便知行不行了。金山游侠也许是以独占模式打开的文件。
作者: Maxwell    时间: 2005-1-24 09:50

还有,用vb的时候最好说地址都按vb的来说,免得混乱。
你给的文件不管按哪种起始地址算30FBD处都是0,loranrowe说的也没错。
作者: 阿尔法孝直    时间: 2005-2-6 19:26

本人又编了一个程序(如图),结果运行时连续按下按钮,在窗体上连续打出N个"0",不知为什么。

图片附件: VBerror.jpg (2005-2-6 19:26, 73.38 K) / 该附件被下载次数 99
http://xycq.org.cn/forum/attachment.php?aid=5140


作者: 阿尔法孝直    时间: 2005-2-6 19:34

对不起,30FBC本来就等于00
作者: Maxwell    时间: 2005-2-6 19:39

晕,你终于搞明白了?
作者: 阿尔法孝直    时间: 2005-2-6 19:45

今天我又运行了一下那个程序(就是我写在这个主题上的第一个程序),嘿,竟然好了!难道以前是因为VB运行库出问题了?
作者: Maxwell    时间: 2005-2-6 20:03

呵呵,这种东西只能说是rpwt了。我遇到最搞笑的一次是一个程序编译出来运行死机,怎么改都不行,后来新建一个文件把内容拷贝过去,居然好了。




欢迎光临 轩辕春秋文化论坛 (http://xycq.org.cn/forum/) Powered by Discuz! 5.0.0