blackeangel |
19-05-2019 19:46 2872358 |
Редактировать hex значения в файле
Вложений: 2
Приветствую. Возможно ли сделать так как показано на скринах ниже. Одна фотку до, другая после.
Тк offset разные, то нужно реализовать поиск и замену значений.
Естественно, файл бинарный.
А то надоело это делать winhex'ом руками.
Вес файла около 300кб.
Ну и естественно, вес файла и offset должны остаться теми же, что и до редактирования.
|
blackeangel, можно. Выложите образец файла в архиве на DropMeFiles, напишите, что мы ищем, и на что меняем (и то, и другое — в Hex).
|
blackeangel |
19-05-2019 22:50 2872376 |
Цитата:
Цитата Iska
(Сообщение 2872373)
blackeangel, можно. Выложите образец файла в архиве на DropMeFiles, напишите, что мы ищем, и на что меняем (и то, и другое — в Hex).
|
К сожалению, файл выложить не могу из-за его физического на текущий момент отсутствия. Давайте на примере любой .dll винды попробуем.
Давайте откроем в winhex любую и найдём в текстовой части "This program ...." и заменим эти 16 значения на "20 00 20 00 20 00 20 00 20 00 ..." то есть на пробелы.
Мне по большей части надо понять суть как это делать, как это реализовывать.
Я начал читать вот это https://www.experts-exchange.com/que...X-to-File.html , но тк у меня проблемы с иностранным языками, то почти ничего не понял.
|
blackeangel, патч сделать не пробовали?
|
Цитата:
Цитата 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
|
blackeangel |
20-05-2019 07:38 2872407 |
Цитата:
Цитата yurfed
(Сообщение 2872385)
blackeangel, патч сделать не пробовали?
|
Патч обычно делается по фиксированному offset, а тут он плавающий.
Iska, что то как то длинно. На Питоне писал, 14 строк( https://dropmefiles.com/Us2l8). Всё равно спасибо, буду пробовать.
|
Цитата:
Цитата blackeangel
На Питоне писал, 14 строк »
|
Вы не могли бы их привести здесь?
blackeangel, когда вставляете ссылки, не полагайтесь на движок, лучше делайте вручную.
|
blackeangel |
20-05-2019 13:58 2872456 |
Цитата:
Цитата Iska
(Сообщение 2872453)
Цитата:
Цитата blackeangel
На Питоне писал, 14 строк »
|
Вы не могли бы их привести здесь?
blackeangel, когда вставляете ссылки, не полагайтесь на движок, лучше делайте вручную.
|
К сожалению я даже скопировать не могу, только сфоткать. А фотку я выложил постом выше (ссылку поправил)
|
blackeangel, в смысле? Не можете скопировать четырнадцать строк текста?!
|
blackeangel |
20-05-2019 15:01 2872460 |
Цитата:
Цитата Iska
(Сообщение 2872459)
blackeangel, в смысле? Не можете скопировать четырнадцать строк текста?!
|
да, не могу. Тк код находится на ПК, на котором нет usb разъмов и выхода в интернет. Могу только переписать его сюда, но не весь, тк hex значения больно длинные)))
Цитата:
Цитата Iska
(Сообщение 2872453)
Цитата:
Цитата blackeangel
На Питоне писал, 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 строк: вместо безусловного присваивания и последующей записи:
Цитата:
Цитата blackeangel
Код:
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 2872533 |
Iska, да если проверок навещать, то там уже 30 строк получилось ;-)
Если интересно, то могу прислать фото
|
Цитата:
Цитата blackeangel
да если проверок навещать, то там уже 30 строк получилось ;-) »
|
Если вы посмотрите мою старинную, более чем 20-летней давности статью, то увидите, что даже тогда было ясно, что проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. :lol:
|
blackeangel |
21-05-2019 12:19 2872549 |
Цитата:
Цитата mwz
(Сообщение 2872539)
Цитата:
Цитата blackeangel
да если проверок навещать, то там уже 30 строк получилось ;-) »
|
Если вы посмотрите мою старинную, более чем 20-летней давности статью, то увидите, что даже тогда было ясно, что проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. :lol:
|
Кстати, статейка интересная) Спасибо)
|
Цитата:
Цитата mwz
проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. »
|
Именно так!
|
Время: 20:19.
© OSzone.net 2001-