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)
Что я делаю неправильно, и что я могу сделать для фиксации его? Пример кода?
Измените оператор return
для GetFileContents
на
return bytearray(fileContents)
, остальное должно работать. Вам нужно использовать bytearray
, а не байтов
просто потому, что первый является изменяемым (чтение / запись), последний (который вы сейчас используете) неизменяем (только для чтения ).
Строки байтов (и строки в целом) являются неизменяемыми объектами в Python. Создав их, вы не можете их изменить. Вместо этого вам нужно создать новый, в котором будет часть старого контента. (Например, с базовой строкой newString = oldString [: offset] + newChar + oldString [offset + 1:]
или т.п.)
Вместо этого вы можете преобразовать байтовую строку в сначала список байтов или массив байтов, манипулируйте им, а затем преобразуйте массив байтов / список обратно в статическую строку после того, как все манипуляции будут выполнены. Это позволяет избежать создания новой строки для каждой операции замены.