2015-05-10 4 views
1

Я совершенно новый для сборки. Я пишу патч для исполняемого файла, чтобы исправить проблему с графикой. В частности, мне нужно изменить параметр dwExStyle окна от 0 до 00020000. шестнадцатеричного кода оригинальной инструкции являетсясборка - как отредактировать исполняемый файл

6A 00 (push 0) 

И когда я попытался изменить его

68 00 00 02 00 (push 00020000) 

Исполняемых остановлен и я получаю ошибку нарушения доступа. Как изменить параметр команды push без использования исполняемого файла? Заранее спасибо

EDIT: весь код выполняется для вызова функции:

:0055935D 6A00   push 00000000 
:0055935F 56    push esi 
:00559360 6A00   push 00000000 
:00559362 6A00   push 00000000 
:00559364 68F9010000   push 000001F9 
:00559369 6886020000   push 00000286 
:0055936E 6800000080   push 80000000 
:00559373 6800000080   push 80000000 
:00559378 6A00   push 00000000 
:0055937A 683C565700   push 0057563C | 
:0055937F 683C565700   push 0057563C 
:00559384 6A00   push 00000000 

* Reference To: USER32.CreateWindowExA, Ord:0059h 
       | 
:00559386 FF1574B15600  Call dword ptr [0056B174] 

Как вы можете видеть, вызываемая функция CreateWindowExA из Windows API, который должен принять DWORD для требуемого параметра (window style)

+1

Ваша новая инструкция длиннее старой, поэтому вы, вероятно, перезаписали инструкции, которые последовали за ней. – szx

+0

Вы спрашиваете, как редактировать двоичный файл таким образом, чтобы он не менял размер, или вам нравится добавлять в него инструкции? Также ваш пример кажется недействительным. Если команда нажимает 0, то 0 должна иметь такую ​​же битту, как и ваш другой номер (который, как представляется, составляет 64 бита). –

ответ

1

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

Задание исполняемого файла не так просто и не для начинающего ИМХО.

2

Если вы новичок в этом: сборка - это язык - инструкции в двоичном коде находятся в исполняемом файле, скомпилированном из файлов ASM.

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

Плохая новость, если вы действительно имеющие

6A 00 (push 0) 

Это толчок байты аргумент, и вы не можете заменить его непосредственно двойное слово толчка 00020000,

EDIT: в уточните, если он действительно использует байтовый push, то это какая-то оптимизация компилятора C/C++, и вероятность того, что вы можете сделать это, не так много.

EDIT 2: операнд 6А толкает непосредственный байт в стеке, но указатель стека еще probably decremented by 4, так что эта часть была моим ответом, скорее всего, не так: «также функция, которая будет принимать в качестве аргумента предположим, байт выходит из стека, что приведет к тому, что буфер стека перестанет синхронизироваться, а нарушение доступа просто ждет за углом ».

2

Если у вас есть пробел в двоичном формате, который можно перезаписать (посмотрите на строку «0x90» без инструкции по эксплуатации), вы можете написать инструкции для подготовки аргументов и вернуться прямо перед функцией, ожидающей вызова dwExStyle , Или вызовите функцию самостоятельно и вообще пропустите оригинальную функцию. Вы заменили бы первые байты функции для патча с инструкцией «jump» к вашим недавно вставленным инструкциям.

+0

Спасибо, я попробую – Ukk

+0

Проблема может быть в том, что вызываемая функция ждет байта из стека, поэтому нажатие DWORD вместо BYTE просто перепутает остальные параметры - нет? –

+0

Это было бы, но из имени параметра я предполагаю, что функция ожидает DWORD. Я думаю, что есть еще несколько команд push, прежде чем функция вызывается для обеспечения функциональности, но я не могу сказать это точно. Возможно, Укк может опубликовать сборку. – fassl

Смежные вопросы