Присвоение объекта на байтах возражает в Python

GAHH, код, не работающий, является плохим кодом действительно!

в RemoveRETNs toOutput [currentLoc - 0x00400000] = b '\xCC' TypeError: объект 'байтов' не поддерживает присвоение объекта

Как может я фиксировать это:

inputFile = 'original.exe'
outputFile = 'output.txt'
patchedFile = 'original_patched.exe'

def GetFileContents(filename):
    f = open(filename, 'rb')
    fileContents = f.read()
    f.close()

    return fileContents

def FindAll(fileContents, strToFind):
    found = []

    lastOffset = -1

    while True:
        lastOffset += 1
        lastOffset = fileContents.find(b'\xC3\xCC\xCC\xCC\xCC', lastOffset)

        if lastOffset != -1:
            found.append(lastOffset)
        else:
            break

    return found

def FixOffsets(offsetList):
    for current in range(0, len(offsetList)):
        offsetList[current] += 0x00400000
    return offsetList

def AbsentFromList(toFind, theList):
    for i in theList:
        if i == toFind:
            return True
    return False

# Outputs the original file with all RETNs replaced with INT3s.
def RemoveRETNs(locationsOfRETNs, oldFilesContents, newFilesName):
    target = open(newFilesName, 'wb')

    toOutput = oldFilesContents

    for currentLoc in locationsOfRETNs:
        toOutput[currentLoc - 0x00400000] = b'\xCC'

    target.write(toOutput)

    target.close()

fileContents = GetFileContents(inputFile)
offsets = FixOffsets(FindAll(fileContents, '\xC3\xCC\xCC\xCC\xCC'))
RemoveRETNs(offsets, fileContents, patchedFile)

Что я делаю неправильно, и что я могу сделать для фиксации его? Пример кода?

6
задан Craig McQueen 20 January 2010 в 00:38
поделиться

2 ответа

Измените оператор return для GetFileContents на

return bytearray(fileContents)

, остальное должно работать. Вам нужно использовать bytearray , а не байтов просто потому, что первый является изменяемым (чтение / запись), последний (который вы сейчас используете) неизменяем (только для чтения ).

19
ответ дан 8 December 2019 в 04:08
поделиться

Строки байтов (и строки в целом) являются неизменяемыми объектами в Python. Создав их, вы не можете их изменить. Вместо этого вам нужно создать новый, в котором будет часть старого контента. (Например, с базовой строкой newString = oldString [: offset] + newChar + oldString [offset + 1:] или т.п.)

Вместо этого вы можете преобразовать байтовую строку в сначала список байтов или массив байтов, манипулируйте им, а затем преобразуйте массив байтов / список обратно в статическую строку после того, как все манипуляции будут выполнены. Это позволяет избежать создания новой строки для каждой операции замены.

7
ответ дан 8 December 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: