Назначение элемента в байтовом объекте в Python - PullRequest
6 голосов
/ 20 декабря 2009

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

в RemoveRETNs toOutput [currentLoc - 0x00400000] = b '\ xCC' TypeError: объект 'bytes' не поддерживает назначение элемента

Как я могу это исправить:

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)

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

Ответы [ 2 ]

18 голосов
/ 20 декабря 2009

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

return bytearray(fileContents)

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

7 голосов
/ 20 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...