Показать полную графическую версию : Редактировать hex значения в файле
blackeangel
19-05-2019, 19:46
Приветствую. Возможно ли сделать так как показано на скринах ниже. Одна фотку до, другая после.
Тк offset разные, то нужно реализовать поиск и замену значений.
Естественно, файл бинарный.
А то надоело это делать winhex'ом руками.
Вес файла около 300кб.
Ну и естественно, вес файла и offset должны остаться теми же, что и до редактирования.
blackeangel, можно. Выложите образец файла в архиве на DropMeFiles, напишите, что мы ищем, и на что меняем (и то, и другое — в Hex).
blackeangel
19-05-2019, 22:50
blackeangel, можно. Выложите образец файла в архиве на DropMeFiles, напишите, что мы ищем, и на что меняем (и то, и другое — в Hex).
К сожалению, файл выложить не могу из-за его физического на текущий момент отсутствия. Давайте на примере любой .dll винды попробуем.
Давайте откроем в winhex любую и найдём в текстовой части "This program ...." и заменим эти 16 значения на "20 00 20 00 20 00 20 00 20 00 ..." то есть на пробелы.
Мне по большей части надо понять суть как это делать, как это реализовывать.
Я начал читать вот это https://www.experts-exchange.com/questions/26644158/How-to-Open-File-In-HEX-in-VB6-0-and-Re-Write-HEX-to-File.html , но тк у меня проблемы с иностранным языками, то почти ничего не понял.
blackeangel, патч сделать не пробовали?
Давайте на примере любой .dll винды попробуем.
Давайте откроем в winhex любую и найдём в текстовой части "This program ...." и заменим эти 16 значения на "20 00 20 00 20 00 20 00 20 00 ..." то есть на пробелы.
Мне по большей части надо понять суть как это делать, как это реализовывать. »
Пробуйте:
Option Explicit
Sub Sample()
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Dim strFindString As String
Dim strReplaceString As String
Dim arrHex() As String
Dim arrFind() As Byte
Dim arrReplace() As Byte
Dim i As Long, j As Long
Dim arrContent() As Byte
Dim bFound As Boolean
Dim lngOffset As Long
' «This program cannot be run in DOS mode.»
strFindString = "54 68 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 6D 6F 64 65 2E"
strReplaceString = "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF"
' Convert hex values from find string to Byte Array
arrHex = Split(strFindString)
ReDim arrFind(UBound(arrHex))
For i = 0 To UBound(arrHex)
arrFind(i) = CByte("&H" & arrHex(i))
Next i
' Convert hex values from replace string to Byte Array
arrHex = Split(strReplaceString)
ReDim arrReplace(UBound(arrHex))
For i = 0 To UBound(arrHex)
arrReplace(i) = CByte("&H" & arrHex(i))
Next i
' Read content from file to Byte Array
With CreateObject("ADODB.Stream")
.Type = adTypeBinary
.Open
.LoadFromFile "C:\Мои проекты\0262\accessibilitycpl.dll"
arrContent = .Read()
' Search find Byte Array in content of file
For i = 0 To UBound(arrContent)
bFound = True
For j = 0 To UBound(arrFind)
If arrContent(i + j) <> arrFind(j) Then
bFound = False
Exit For
End If
Next j
If bFound Then
lngOffset = i
Exit For
End If
Next i
' If found — replace part by replace Byte Array
If bFound Then
.Position = lngOffset
.Write arrReplace
.SaveToFile "C:\Мои проекты\0262\accessibilitycpl3.dll", adSaveCreateOverWrite
Else
MsgBox "Can't find source string", vbExclamation + vbOKOnly, "Not found"
End If
End With
End Sub
https://i.imgur.com/SHkr87r.png
blackeangel
20-05-2019, 07:38
blackeangel, патч сделать не пробовали?
Патч обычно делается по фиксированному offset, а тут он плавающий.
Iska, что то как то длинно. На Питоне писал, 14 строк(https://dropmefiles.com/Us2l8). Всё равно спасибо, буду пробовать.
На Питоне писал, 14 строк »
Вы не могли бы их привести здесь?
blackeangel, когда вставляете ссылки, не полагайтесь на движок, лучше делайте вручную.
blackeangel
20-05-2019, 13:58
На Питоне писал, 14 строк »
Вы не могли бы их привести здесь?
blackeangel, когда вставляете ссылки, не полагайтесь на движок, лучше делайте вручную.
К сожалению я даже скопировать не могу, только сфоткать. А фотку я выложил постом выше (ссылку поправил)
blackeangel, в смысле? Не можете скопировать четырнадцать строк текста?!
blackeangel
20-05-2019, 15:01
blackeangel, в смысле? Не можете скопировать четырнадцать строк текста?!
да, не могу. Тк код находится на ПК, на котором нет usb разъмов и выхода в интернет. Могу только переписать его сюда, но не весь, тк hex значения больно длинные)))
На Питоне писал, 14 строк »
Вы не могли бы их привести здесь?
blackeangel, когда вставляете ссылки, не полагайтесь на движок, лучше делайте вручную.
import os, sys
fopen='C:\\Program Files\\,.......\\KDScanViewerDll.dll'
wfind=b'\x1e\x04\x31...…'
wrepl=b'\x20\x00\x20\x00.....'
if os.path.exists(fopen):
with open(fopen, 'rb') as file:
data=file.read()
data=bytearray(data)
data=data.replace(wfind, wrepl)
with open(fopen, 'wb)as file:
file.write(data)
else:
print('File "KDScanViewerDll.dll" not found!')
Вот, единственное, там где много "...." значит я не стал переписывать длинное.
blackeangel, спасибо, ясно.
Как Вы видите, на Python'е класс bytearray имеет готовый метод .replace(), а на VB/VBA его приходится реализовывать «ручками». Кстати, программа Ваша должна быть немного больше, нежели 14 строк: вместо безусловного присваивания и последующей записи:
data=data.replace(wfind, wrepl)
with open(fopen, 'wb)as file:
file.write(data)
»
требуется сначала проверить — а есть ли вообще такая последовательность байт в искомом файле, например, банальным in:
To check if sub is a substring or not, use the in operator:
>>> b'Py' in b'Python'
True
в условии.
blackeangel
21-05-2019, 10:40
Iska, да если проверок навещать, то там уже 30 строк получилось ;-)
Если интересно, то могу прислать фото
да если проверок навещать, то там уже 30 строк получилось ;-) »
Если вы посмотрите мою старинную, более чем 20-летней давности статью (http://www.softholm.com/articles/shareware15.html), то увидите, что даже тогда было ясно, что проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. :lol:
blackeangel
21-05-2019, 12:19
да если проверок навещать, то там уже 30 строк получилось ;-) »
Если вы посмотрите мою старинную, более чем 20-летней давности статью (http://www.softholm.com/articles/shareware15.html), то увидите, что даже тогда было ясно, что проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. :lol:
Кстати, статейка интересная) Спасибо)
проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. »
Именно так!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.