注册 登录
编程论坛 VB6论坛

如何实现以16进制方式打开指定的文件并查找替换16进制数值?

dx002386 发布于 2021-02-09 23:50, 3351 次点击
如何实现以16进制方式打开指定的文件并查找替换16进制数值?
能实现以16进制方式打开指定的文件,
然后查找16进制数值  1E xx 11 55 55 并替换为  00 xx-2 00 00 00 么?
XX 是任意的16进制数值,  xx-2为任意数值-2    也是16进制的

比如:
1E 6F 11 55 55 替换为  00 6D 00 00 00
1E E3 11 55 55 替换为  00 E1 00 00 00
都是16进制的
下面是部分替换列表实例
57 43 00 00 00  ---> 0F 45 00 57 67
57 58 00 00 00  ---> 0F 5A 00 57 67
57 48 00 00 00  ---> 0F 4A 00 57 67
57 60 00 00 00  ---> 0F 62 00 57 67
57 61 00 00 00  ---> 0F 63 00 57 67
57 80 00 00 00  ---> 0F 82 00 57 67
57 3C 00 00 00  ---> 0F 3E 00 57 67
57 4F 00 00 00  ---> 0F 51 00 57 67
57 4D 00 00 00  ---> 0F 4F 00 57 67
57 F5 00 00 00  ---> 0F F7 00 57 67
15 回复
#2
yuma2021-02-10 07:46
你这种替换方法,你确定程序还能运行?
我种替换方法意义何在?

[此贴子已经被作者于2021-2-10 08:23编辑过]

#3
dx0023862021-02-10 09:49
回复 2楼 yuma
肯定有用处啊  大师。。。。确定能运行的
#4
dx0023862021-02-10 09:51
回复 2楼 yuma
不是exe程序,是其他调用的部件,原作者这样修改后完全不影响使用,就是增加了破解的难度。。

我这样操作,是把他恢复为原来的样子
#5
zbjzbj2021-02-10 09:55
如果想研究这个用C语言吧。如果C语言没搞到一定深度,还是学习基础吧。
#6
dx0023862021-02-10 16:13
回复 2楼 yuma
只有本站会员才能查看附件,请 登录


附件已上传

二进制文件。。 必须以16进制修改才能不影响使用
#7
dx0023862021-02-10 16:22
回复 2楼 yuma
如何实现以16进制方式打开指定的文件并查找替换16进制数值?
然后查找16进制数值
比如
0F XX 00 57 67 替换为  57 YY 00 00 00
XX 是任意的16进制数值, YY=XX-2  (也是16进制的)

下面是部分替换列表实例

0F 45 00 57 67  --->   57 43 00 00 00
0F 5A 00 57 67  --->   57 58 00 00 00
0F 4A 00 57 67  --->   57 48 00 00 00
0F 62 00 57 67  --->   57 60 00 00 00
0F 63 00 57 67  --->   57 61 00 00 00
0F 82 00 57 67  --->   57 80 00 00 00
0F 3E 00 57 67  --->   57 3C 00 00 00
0F 51 00 57 67  --->   57 4F 00 00 00
0F 4F 00 57 67  --->   57 4D 00 00 00
0F F7 00 57 67  --->   57 F5 00 00 00
#8
yuma2021-02-10 16:35
回复 7楼 dx002386
程序代码:
Function ReadBinary(FileName)
        Const adTypeBinary = 1
        Dim stream, xmldom, node
        Set xmldom = CreateObject("Microsoft.XMLDOM")
        Set node = xmldom.CreateElement("binary")
        node.DataType = "bin.hex"
        Set stream = CreateObject("ADODB.Stream")
        stream.Type = adTypeBinary
        stream.Open
        stream.LoadFromFile FileName
        node.NodeTypedValue = stream.Read
        stream.Close
        Set stream = Nothing
        ReadBinary = node.Text
        Set node = Nothing
        Set xmldom = Nothing
End Function

Sub WriteBinary(FileName, Buf)
        Const adTypeBinary = 1
        Const adSaveCreateOverWrite = 2
        Dim stream, xmldom, node
        Set xmldom = CreateObject("Microsoft.XMLDOM")
        Set node = xmldom.CreateElement("binary")
        node.DataType = "bin.hex"
        node.Text = Buf
        Set stream = CreateObject("ADODB.Stream")
        stream.Type = adTypeBinary
        stream.Open
        stream.write node.NodeTypedValue
        stream.SaveToFile FileName, adSaveCreateOverWrite
        stream.Close
        Set stream = Nothing
        Set node = Nothing
        Set xmldom = Nothing
End Sub

Private Sub Form_Load()
Dim str As String, i As Long, j As String, k As String

str = UCase(ReadBinary("1.fas"))  '获取指定二进制文件的十六进制代码,代码形式:4D5A90000300
'
MsgBox str

For i = 1 To Len(str) Step 2
    j = Mid(str, i, 2)
    k = k + " " + j + " "
Next
k = Right(k, Len(k) - 1)
k = Left(k, Len(k) - 1)
'MsgBox k  '获取格式化之后的十六进制代码,代码形式:4D 5A 90 00 03 00

'替换字符串(有多少替换写多少行):
k = Replace(k, "1E 6F 11 55 55", "00 6D 00 00 00")  '1E 6F 11 55 55 替换为  00 6D 00 00 00
k = Replace(k, "1E E3 11 55 55", "00 E1 00 00 00")  '1E E3 11 55 55 替换为  00 E1 00 00 00

k = Replace(k, " ", "")   '写回二进制前,记得要把格式化之后的十六进制代码还原为格式化之前状态才能写入。
WriteBinary "New_1.fas", k   '写回二进制文件,文件名若为同名则写入相同文件
End Sub


[此贴子已经被作者于2021-2-10 18:33编辑过]

#9
dx0023862021-02-10 16:38
回复 8楼 yuma
'替换字符串(有多少替换写多少行),如:
k = Replace(k, "1E 6F 11 55 55", "00 6D 00 00 00")  '1E 6F 11 55 55 替换为  00 6D 00 00 00
k = Replace(k, "1E E3 11 55 55", "00 E1 00 00 00")  '1E E3 11 55 55 替换为  00 E1 00 00 00



这个替换 是固定字符串的。。实际上,, 0F XX 00 57 67 中的XX 不确定是哪个数值。。。

可能我表达的有点问题
#10
dx0023862021-02-10 16:41
回复 8楼 yuma
比如
0F XX 00 57 67 替换为  57 YY 00 00 00
XX 是任意的16进制数值, YY=XX-2  (也是16进制的)

XX 的数值是不确定的。。
#11
yuma2021-02-10 16:49
如果你手边没有VB6软件,或者觉得VB6编译、修改比较麻烦

你也可以用VBS,右击可直接编辑。双击可直接运行完成修改。

代码差不多。

附上:
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-2-10 18:36编辑过]

#12
yuma2021-02-10 16:52
以下是引用dx002386在2021-2-10 16:41:11的发言:

比如
0F XX 00 57 67 替换为  57 YY 00 00 00
XX 是任意的16进制数值, YY=XX-2  (也是16进制的)

XX 的数值是不确定的。。


不确定你让程序如何修改。或者这种替换存在什么规律?







为了缩短楼层在这里编辑一下。

文件的十六进制代码是怎么计算的?

第一步:数字、汉字、字符 得到它们的ASCII值。

第二步: ASCII值的十六进制数,就是你要替换的十六进制数(也是WinHex软件看到的十六进制数)

这里不再举例。

像你这种YY=XX-2 (也是16进制的),如果XX是汉字的16进制数,你-2等于 HEX(ASCII-2),换了一个汉字。

[此贴子已经被作者于2021-2-10 17:14编辑过]

#13
dx0023862021-02-10 18:48
回复 12楼 yuma
多谢大师指点。。。。。。我研究下看看  有疑问再请教  再次感谢
#14
dx0023862021-02-10 21:47
回复 12楼 yuma
0F XX 00 57 67 替换为  57 YY 00 00 00
XX 是任意的16进制数值, YY=XX-2  (也是16进制的)

XX 的数值是不确定的。。


不考虑汉字问题,只关注16进制数值。。。
#15
yuma2021-02-11 07:34
修复一下前面楼层代码中的Bug,前面楼层代码将不在更新。

本页的代码是正确的,本人只对本页的代码正确性负责。

本页代码可能是最后一次更新,也可能发现Bug不进行任何通知就进行编辑,无Bug的话后继都不会更新。

VB6代码如下:
程序代码:
Function ReadBinary(FileName)
        Const adTypeBinary = 1
        Dim stream, xmldom, node
        Set xmldom = CreateObject("Microsoft.XMLDOM")
        Set node = xmldom.CreateElement("binary")
        node.DataType = "bin.hex"
        Set stream = CreateObject("ADODB.Stream")
        stream.Type = adTypeBinary
        stream.Open
        stream.LoadFromFile FileName
        node.NodeTypedValue = stream.Read
        stream.Close
        Set stream = Nothing
        ReadBinary = node.Text
        Set node = Nothing
        Set xmldom = Nothing
End Function

Sub WriteBinary(FileName, Buf)
        Const adTypeBinary = 1
        Const adSaveCreateOverWrite = 2
        Dim stream, xmldom, node
        Set xmldom = CreateObject("Microsoft.XMLDOM")
        Set node = xmldom.CreateElement("binary")
        node.DataType = "bin.hex"
        node.Text = Buf
        Set stream = CreateObject("ADODB.Stream")
        stream.Type = adTypeBinary
        stream.Open
        stream.write node.NodeTypedValue
        stream.SaveToFile FileName, adSaveCreateOverWrite
        stream.Close
        Set stream = Nothing
        Set node = Nothing
        Set xmldom = Nothing
End Sub

Private Sub Form_Load()
Dim str As String, i As Long, j As String, k As String

str = UCase(ReadBinary("1.fas"))  '获取指定二进制文件的十六进制代码,代码形式:4D5A90000300
'
MsgBox str

For i = 1 To Len(str) Step 2
    j = Mid(str, i, 2)
    k = k & " " & j
Next
k = Right(k, Len(k) - 1)  '去除k初次写入的字符串左边的空格
'
MsgBox k  '获取格式化之后的十六进制代码,代码形式:4D 5A 90 00 03 00

'替换字符串(有多少替换写多少行):
k = Replace(k, "1E 6F 11 55 55", "00 6D 00 00 00")  '1E 6F 11 55 55 替换为  00 6D 00 00 00
k = Replace(k, "1E E3 11 55 55", "00 E1 00 00 00")  '1E E3 11 55 55 替换为  00 E1 00 00 00

k = Replace(k, " ", "")   '写回二进制前,记得要把格式化之后的十六进制代码还原为格式化之前状态才能写入。
WriteBinary "New_1.fas", k   '写回二进制文件,文件名若为同名则写入相同文件
End Sub




[此贴子已经被作者于2021-2-22 19:50编辑过]

#16
dx0023862021-02-11 08:32
回复 15楼 yuma
多谢
多谢
多谢
1