Что нового

Смещение и замена значений в бинарном файле

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Нужно реализовать патч для Opera.dll (это dll'ка от одноимённого браузера), т.к у него есть бага с ком строкой.

Нужно сделать смещение на некоторые адреса, и произвести замену байтов.
Вот таблица замены:

Код:
    RAW Offset   | Old Byte | New Byte
-----------------+----------+----------
     00000210         0B         50
     0059E575         56         E9
     0059E576         FF         96
     0059E577         74         36
     0059E578         24         2C
     0059E579         20         00
     00861C10         00         50
     00861C11         00         89
     00861C12         00         E6
     00861C13         00         83
     00861C14         00         C6
     00861C15         00         20
     00861C16         00         8B
     00861C17         00         36
     00861C18         00         85
     00861C19         00         F6
     00861C1A         00         74
     00861C1B         00         2B
     00861C1C         00         AC
     00861C1D         00         83
     00861C1E         00         F8
     00861C1F         00         22
     00861C20         00         75
     00861C21         00         25
     00861C22         00         58
     00861C23         00         60
     00861C24         00         31
     00861C25         00         C0
     00861C26         00         50
     00861C27         00         59
     00861C28         00         F7
     00861C29         00         D1
     00861C2A         00         83
     00861C2B         00         44
     00861C2C         00         24
     00861C2D         00         3C
     00861C2E         00         02
     00861C2F         00         8B
     00861C30         00         7C
     00861C31         00         24
     00861C32         00         3C
     00861C33         00         F2
     00861C34         00         66
     00861C35         00         AF
     00861C36         00         83
     00861C37         00         EF
     00861C38         00         04
     00861C39         00         AA
     00861C3A         00         61
     00861C3B         00         31
     00861C3C         00         F6
     00861C3D         00         56
     00861C3E         00         FF
     00861C3F         00         74
     00861C40         00         24
     00861C41         00         20
     00861C42         00         E9
     00861C43         00         33
     00861C44         00         C9
     00861C45         00         D3
     00861C46         00         FF
     00861C47         00         58
     00861C48         00         EB
     00861C49         00         F1
реально ли это сделать на AutoIt?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Да.

FileOpen для дозаписи.
Для всех смещений:
FileSetPos на это смещение и записать туда новый байт.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Код:
Global $aPatch[64][3] = _
	   [[0x00000210, 0x0B, 0x50], _
		[0x0059E575, 0x56, 0xE9], _
		[0x0059E576, 0xFF, 0x96], _
		[0x0059E577, 0x74, 0x36], _
		[0x0059E578, 0x24, 0x2C], _
		[0x0059E579, 0x20, 0x00], _
		[0x00861C10, 0x00, 0x50], _
		[0x00861C11, 0x00, 0x89], _
		[0x00861C12, 0x00, 0xE6], _
		[0x00861C13, 0x00, 0x83], _
		[0x00861C14, 0x00, 0xC6], _
		[0x00861C15, 0x00, 0x20], _
		[0x00861C16, 0x00, 0x8B], _
		[0x00861C17, 0x00, 0x36], _
		[0x00861C18, 0x00, 0x85], _
		[0x00861C19, 0x00, 0xF6], _
		[0x00861C1A, 0x00, 0x74], _
		[0x00861C1B, 0x00, 0x2B], _
		[0x00861C1C, 0x00, 0xAC], _
		[0x00861C1D, 0x00, 0x83], _
		[0x00861C1E, 0x00, 0xF8], _
		[0x00861C1F, 0x00, 0x22], _
		[0x00861C20, 0x00, 0x75], _
		[0x00861C21, 0x00, 0x25], _
		[0x00861C22, 0x00, 0x58], _
		[0x00861C23, 0x00, 0x60], _
		[0x00861C24, 0x00, 0x31], _
		[0x00861C25, 0x00, 0xC0], _
		[0x00861C26, 0x00, 0x50], _
		[0x00861C27, 0x00, 0x59], _
		[0x00861C28, 0x00, 0xF7], _
		[0x00861C29, 0x00, 0xD1], _
		[0x00861C2A, 0x00, 0x83], _
		[0x00861C2B, 0x00, 0x44], _
		[0x00861C2C, 0x00, 0x24], _
		[0x00861C2D, 0x00, 0x3C], _
		[0x00861C2E, 0x00, 0x02], _
		[0x00861C2F, 0x00, 0x8B], _
		[0x00861C30, 0x00, 0x7C], _
		[0x00861C31, 0x00, 0x24], _
		[0x00861C32, 0x00, 0x3C], _
		[0x00861C33, 0x00, 0xF2], _
		[0x00861C34, 0x00, 0x66], _
		[0x00861C35, 0x00, 0xAF], _
		[0x00861C36, 0x00, 0x83], _
		[0x00861C37, 0x00, 0xEF], _
		[0x00861C38, 0x00, 0x04], _
		[0x00861C39, 0x00, 0xAA], _
		[0x00861C3A, 0x00, 0x61], _
		[0x00861C3B, 0x00, 0x31], _
		[0x00861C3C, 0x00, 0xF6], _
		[0x00861C3D, 0x00, 0x56], _
		[0x00861C3E, 0x00, 0xFF], _
		[0x00861C3F, 0x00, 0x74], _
		[0x00861C40, 0x00, 0x24], _
		[0x00861C41, 0x00, 0x20], _
		[0x00861C42, 0x00, 0xE9], _
		[0x00861C43, 0x00, 0x33], _
		[0x00861C44, 0x00, 0xC9], _
		[0x00861C45, 0x00, 0xD3], _
		[0x00861C46, 0x00, 0xFF], _
		[0x00861C47, 0x00, 0x58], _
		[0x00861C48, 0x00, 0xEB], _
		[0x00861C49, 0x00, 0xF1]]

$hFile = FileOpen('Opera.dll', 1 + 16)
Do
	For $i = 0 To UBound($aPatch) - 1
		FileSetPos($hFile, $aPatch[$i][0], 0)
		If @error Then
			MsgBox(16, ':-(', 'Read error!')
			ExitLoop 2
		EndIf
		$bData = FileRead($hFile, 1)
		If (@error) Or ($bData <> $aPatch[$i][1]) Then
			MsgBox(16, ':-(', 'Read error!')
			ExitLoop 2
		EndIf
	Next
	For $i = 0 To UBound($aPatch) - 1
		FileSetPos($hFile, $aPatch[$i][0], 0)
		FileWrite($hFile, Binary($aPatch[$i][2]))
		If @error Then
			MsgBox(16, ':-(', 'Write error!')
			ExitLoop 2
		EndIf
	Next
Until 1
FileClose($hFile)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Yashied
Спасибо.

Правда после применения Dll'ка нерабочая.

Вот архив, в нём две Dll'ки, одна оригинальная, а вторая пропатченная другим патчем (он делает по таблице выше), сам патч тут.

Нужно чтобы после обработки, оригинальная Dll'ка была совпадала с пропатченной (байт в байт).

Буду признателен если сможешь помочь.

OffTopic:
P.S
Циферки в подсветке я то починил, а вот про Hex-числа совсем забыл :whistle:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Код:
#Include <Crypt.au3>
#Include <WinAPI.au3>

Opt('MustDeclareVars', 1)

Global Const $aPatch[64][2] = _
	   [[0x00000211, 0x50], _
		[0x0059E576, 0xE9], _
		[0x0059E577, 0x96], _
		[0x0059E578, 0x36], _
		[0x0059E579, 0x2C], _
		[0x0059E57A, 0x00], _
		[0x00861C11, 0x50], _
		[0x00861C12, 0x89], _
		[0x00861C13, 0xE6], _
		[0x00861C14, 0x83], _
		[0x00861C15, 0xC6], _
		[0x00861C16, 0x20], _
		[0x00861C17, 0x8B], _
		[0x00861C18, 0x36], _
		[0x00861C19, 0x85], _
		[0x00861C1A, 0xF6], _
		[0x00861C1B, 0x74], _
		[0x00861C1C, 0x2B], _
		[0x00861C1D, 0xAC], _
		[0x00861C1E, 0x83], _
		[0x00861C1F, 0xF8], _
		[0x00861C20, 0x22], _
		[0x00861C21, 0x75], _
		[0x00861C22, 0x25], _
		[0x00861C23, 0x58], _
		[0x00861C24, 0x60], _
		[0x00861C25, 0x31], _
		[0x00861C26, 0xC0], _
		[0x00861C27, 0x50], _
		[0x00861C28, 0x59], _
		[0x00861C29, 0xF7], _
		[0x00861C2A, 0xD1], _
		[0x00861C2B, 0x83], _
		[0x00861C2C, 0x44], _
		[0x00861C2D, 0x24], _
		[0x00861C2E, 0x3C], _
		[0x00861C2F, 0x02], _
		[0x00861C30, 0x8B], _
		[0x00861C31, 0x7C], _
		[0x00861C32, 0x24], _
		[0x00861C33, 0x3C], _
		[0x00861C34, 0xF2], _
		[0x00861C35, 0x66], _
		[0x00861C36, 0xAF], _
		[0x00861C37, 0x83], _
		[0x00861C38, 0xEF], _
		[0x00861C39, 0x04], _
		[0x00861C3A, 0xAA], _
		[0x00861C3B, 0x61], _
		[0x00861C3C, 0x31], _
		[0x00861C3D, 0xF6], _
		[0x00861C3E, 0x56], _
		[0x00861C3F, 0xFF], _
		[0x00861C40, 0x74], _
		[0x00861C41, 0x24], _
		[0x00861C42, 0x20], _
		[0x00861C43, 0xE9], _
		[0x00861C44, 0x33], _
		[0x00861C45, 0xC9], _
		[0x00861C46, 0xD3], _
		[0x00861C47, 0xFF], _
		[0x00861C48, 0x58], _
		[0x00861C49, 0xEB], _
		[0x00861C4A, 0xF1]]

Global $hFile, $tData, $pData, $sPath, $iBytes, $iSize

$sPath = FileOpenDialog('Open File', @ScriptDir, 'DLL Files (*.dll)', 1 + 2, 'opera.dll')
If Not $sPath Then
	Exit
EndIf
$iSize = FileGetSize($sPath)
If ($iSize <> 11855216) Or (FileGetVersion($sPath) <> '10.62.3500.0') Then
	MsgBox(16, ':-(', 'Unable to apply patch. Size or version of the file does not match.')
	Exit
EndIf
If _Crypt_HashFile($sPath, $CALG_MD5) = Binary('0x0163263AC6FEF57776C5E14CD2D6E3F5') Then
	MsgBox(48, ':-)', $sPath & ' is already patched.')
	Exit
EndIf
$tData = DllStructCreate('byte[' & $iSize & ']')
$pData = DllStructGetPtr($tData)
$hFile = _WinAPI_CreateFile($sPath, 2, 2)
_WinAPI_ReadFile($hFile, $pData, $iSize, $iBytes)
_WinAPI_CloseHandle($hFile)
If $iSize <> $iBytes Then
	MsgBox(16, ':-(', 'Read file error.')
	Exit
EndIf
If Not FileMove($sPath, $sPath & '.bak', 1) Then
	MsgBox(16, ':-(', 'Write file error.')
	Exit
EndIf
For $i = 0 To UBound($aPatch) - 1
	DllStructSetData($tData, 1, $aPatch[$i][1], $aPatch[$i][0])
Next
$hFile = _WinAPI_CreateFile($sPath, 1, 4)
_WinAPI_WriteFile($hFile, $pData, $iSize, $iBytes)
_WinAPI_CloseHandle($hFile)
If $iSize <> $iBytes Then
	FileMove($sPath & '.bak', $sPath, 1)
	MsgBox(16, ':-(', 'Write file error.')
	Exit
EndIf
MsgBox(64, ':-)', $sPath & ' has been patched successfully.')
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Yashied
Класс :beer:
Opera грузится!
Этому скрипту нужно дописать GUI для добавления адресов и значений и однозначно в полезняшки!

P.S. Однако думаю что только средствами Autoit`а тоже можно пропатчить. Или я ошибаюсь?
Дело в том, что в первом варианте скрипта я заметил, что FileWrite дописывает байт до конца нулями.
Полагаю что BinaryLen и BinaryMid могут тут помочь или нет?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Garrett сказал(а):
Однако думаю что только средствами Autoit тоже можно пропатчить.
Замени на это:

Код:
FileWrite($hFile, Binary('0x' & Hex($aPatch[$i][2], 2)))


Но я не люблю работать с нативными AutoIt функциями File... в бинарном режиме. Да и через WinAPI это будет намного быстрее, чем скакать по всему файлу туда-сюда с помощью FileSetPos()...

P.S

А еще я не люблю Oper'у.

:whistle:
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Верх