Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Редактировать hex значения в файле (http://forum.oszone.net/showthread.php?t=340606)

blackeangel 19-05-2019 19:46 2872358

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

Iska 19-05-2019 22:39 2872373

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

yurfed 19-05-2019 23:28 2872385

blackeangel, патч сделать не пробовали?

Iska 20-05-2019 00:12 2872395

Цитата:

Цитата 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). Всё равно спасибо, буду пробовать.

Iska 20-05-2019 13:51 2872453

Цитата:

Цитата blackeangel
На Питоне писал, 14 строк »

Вы не могли бы их привести здесь?

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

blackeangel 20-05-2019 13:58 2872456

Цитата:

Цитата Iska (Сообщение 2872453)
Цитата:

Цитата blackeangel
На Питоне писал, 14 строк »

Вы не могли бы их привести здесь?

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

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

Iska 20-05-2019 14:46 2872459

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!')

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

Iska 21-05-2019 02:48 2872519

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

mwz 21-05-2019 11:19 2872539

Цитата:

Цитата blackeangel
да если проверок навещать, то там уже 30 строк получилось ;-) »

Если вы посмотрите мою старинную, более чем 20-летней давности статью, то увидите, что даже тогда было ясно, что проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. :lol:

blackeangel 21-05-2019 12:19 2872549

Цитата:

Цитата mwz (Сообщение 2872539)
Цитата:

Цитата blackeangel
да если проверок навещать, то там уже 30 строк получилось ;-) »

Если вы посмотрите мою старинную, более чем 20-летней давности статью, то увидите, что даже тогда было ясно, что проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. :lol:

Кстати, статейка интересная) Спасибо)

Iska 21-05-2019 16:33 2872569

Цитата:

Цитата mwz
проверки и интерфейс с пользователем должны составлять ок. 95% объёма программы. »

Именно так!


Время: 07:20.

Время: 07:20.
© OSzone.net 2001-