PDA

Показать полную графическую версию : Редактировать hex значения в файле


blackeangel
19-05-2019, 19:46
Приветствую. Возможно ли сделать так как показано на скринах ниже. Одна фотку до, другая после.
Тк offset разные, то нужно реализовать поиск и замену значений.
Естественно, файл бинарный.
А то надоело это делать winhex'ом руками.
Вес файла около 300кб.
Ну и естественно, вес файла и offset должны остаться теми же, что и до редактирования.

Iska
19-05-2019, 22:39
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 , но тк у меня проблемы с иностранным языками, то почти ничего не понял.

yurfed
19-05-2019, 23:28
blackeangel, патч сделать не пробовали?

Iska
20-05-2019, 00:12
Давайте на примере любой .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). Всё равно спасибо, буду пробовать.

Iska
20-05-2019, 13:51
На Питоне писал, 14 строк »
Вы не могли бы их привести здесь?

blackeangel, когда вставляете ссылки, не полагайтесь на движок, лучше делайте вручную.

blackeangel
20-05-2019, 13:58
На Питоне писал, 14 строк »
Вы не могли бы их привести здесь?

blackeangel, когда вставляете ссылки, не полагайтесь на движок, лучше делайте вручную.
К сожалению я даже скопировать не могу, только сфоткать. А фотку я выложил постом выше (ссылку поправил)

Iska
20-05-2019, 14:46
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!')

Вот, единственное, там где много "...." значит я не стал переписывать длинное.

Iska
21-05-2019, 02:48
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 строк получилось ;-)
Если интересно, то могу прислать фото

mwz
21-05-2019, 11:19
да если проверок навещать, то там уже 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:
Кстати, статейка интересная) Спасибо)

Iska
21-05-2019, 16:33
проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. »
Именно так!




© OSzone.net 2001-2012