| eXeL@B —› Основной форум —› Замена push register на push value в бинарном файле |
| Посл.ответ | Сообщение |
|
|
Создано: 05 января 2006 00:16 · Личное сообщение · #1 Приветвтвую, есть небольшой вопросик. Например, замена jz на jnz и наоборот не представляет никакого труда в hex-редакторе. Но вот я только что нашел место в программе, где мне нужно изменить значения, которые заталкиваются в стэк, а именно, код выглядит примерно так: push edx push eax call function_address В регистрах edx и eax лежат значения которые мне нужно поменять. В SoftICE "на лету" я знаю как это сделать, но - как мне нужно изменить бинарный файл, чтобы вместо имен регистров были конкретные числа? В дисассемблированном виде, например, комманда push edx записана просто как "52". Я на самом деле еще только учусь, так что не судите строго. Мне нужно, скажем, чтобы было push 640 - как это можно сделать? Вариант один в голову приходит - где-нибудь до этого сделать безусловный jmp на мною добавленный кусок кода, где в регистры edx и eax будут записываться те значения, которые мне нужны, ну а потом вернутся оттуда откуда пришел... но боюсь и этого я не совсем знаю как сделать (идеи есть конечно). Думаю может есть полегче способ? Буду очень признателен за помошь. ![]() |
|
|
Создано: 05 января 2006 00:24 · Личное сообщение · #2 Xatrix пишет: В регистрах edx и eax лежат значения которые мне нужно поменять. В SoftICE "на лету" я знаю как это сделать, но - как мне нужно изменить бинарный файл, чтобы вместо имен регистров были конкретные числа? В дисассемблированном виде, например, комманда push edx записана просто как "52". Я на самом деле еще только учусь, так что не судите строго. Мне нужно, скажем, чтобы было push 640 - как это можно сделать? Вариант один в голову приходит - где-нибудь до этого сделать безусловный jmp на мною добавленный кусок кода, где в регистры edx и eax будут записываться те значения, которые мне нужны, ну а потом вернутся оттуда откуда пришел... но боюсь и этого я не совсем знаю как сделать (идеи есть конечно). Думаю может есть полегче способ? Полегче спобсоба нет, так как один байт на 2 заменить нельзя ----- Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе! ![]() |
|
|
Создано: 05 января 2006 00:29 · Личное сообщение · #3 Xatrix пишет: ариант один в голову приходит - где-нибудь до этого сделать безусловный jmp на мною добавленный кусок кода, где в регистры edx и eax будут записываться те значения, которые мне нужны, ну а потом вернутся оттуда откуда пришел в общем случае это по-моему единственный метод. но вообще ведь где-то есть код, который модифицирует eax и edx, так попробуй туда вместить код, который и будет менять значения на нужные. ![]() |
|
|
Создано: 05 января 2006 00:41 · Поправил: Xatrix · Личное сообщение · #4 ну есть такие строки: 8B1588CF5500 mov edx, dword ptr [0055CF88] A16CCF5500 mov eax, dword ptr [0055CF6C] Но тут опять непонятно, если из первой и второй строки убрать адрес, то получится (машинный код в hex) : 8B15 A1 Что мне это дает? Что такое, например, A1? Неужели A1 == mov eax? Короче, я не совсем понимаю, как в одном байте может содержаться и инструкция, и имя регистра...
Можно поподробней? ![]() |
|
|
Создано: 05 января 2006 00:44 · Поправил: SeDoYHg · Личное сообщение · #5 Если вообще интересует принцип кодирования/декодирвоания инструкций, то прямая дорога к свинским обучалкам обущающие программы http://wasm.ru/toollist.php?list=22 . Еще посты его поищи в архиве форума васма. А в твоем случае как тебе и сказали, так как всунув двухбайтовую 68 imm16/imm32 вместо однобайтовой 50+rd, порушишь всю программу. ----- Все говорят что мы вместе. Но не многие знают в каком. ![]() |
|
|
Создано: 05 января 2006 00:59 · Поправил: Grey · Личное сообщение · #6 |
|
|
Создано: 05 января 2006 00:59 · Личное сообщение · #7 |
|
|
Создано: 05 января 2006 01:12 · Личное сообщение · #8 |
|
|
Создано: 05 января 2006 01:14 · Поправил: Xatrix · Личное сообщение · #9 пальцем в небо тыкать не надо. Не важно на что менять, хоть на 1000. Вопрос в том, как это записать в опкоде, вот например: mov edx, 640 - как это будет в opcode? (вотрое значение для eax - 480 если очень нужно). SeDoYHg, спасибо за ссылки. Я их обязательно посмотрю, просто сейчас ради такой простой вещи не охота перерывать столько статей. Если знаете, подскажите плиз. ![]() |
|
|
Создано: 05 января 2006 01:19 · Личное сообщение · #10 |
|
|
Создано: 05 января 2006 01:22 · Личное сообщение · #11 короче, mov edx, 640 - BA 80 02 00 00 Как это сделать самому, пишешь свою инструкцию в FASM (его ассемблеру я доверяю =) нажимаешь компилировать и получаешь на выходе бинарник с нужными тебе опкодами. Есть вариант с другими иснтрументами (олли и тп.), но вот в грамотности их ассемблера я не уверен. Вот код что нужно писать в FASM'e use32
----- Все говорят что мы вместе. Но не многие знают в каком. ![]() |
|
|
Создано: 05 января 2006 01:24 · Личное сообщение · #12 |
|
|
Создано: 05 января 2006 01:28 · Личное сообщение · #13 |
|
|
Создано: 05 января 2006 01:30 · Личное сообщение · #14 Я делал просто. Сперва загнал в файл твою строчку, открыл в hiew в ASM режиме. Посмотрел соответствует ли это mov edx, dword ptr [0055CF88], далее на этой инструкции нажал tab и отредактировал вписав mov edx,640. После увидил появившийся лишний байтик (так как mov edx,640 занимает 5 байт) и вписал туда nop. Как это делает hiew - не знаю. Я тоже ради простых вещей не лезу в дебри. Знаешь в дизассемблировании даже IDA не всегда однозначно определяет какая именно это инструкция. Но если интересно покопать как это делается - лучше смотреть исходники. Статьи конечно полезно, но зачастую очень сложны для понимания. Посмотри тут: ms-rem.dot-link.net/files/cadt.rar ![]() |
|
|
Создано: 05 января 2006 01:31 · Личное сообщение · #15 |
|
|
Создано: 05 января 2006 01:43 · Личное сообщение · #16 Xatrix пишет: Если знаете, подскажите плиз. Всё уже подсказано. Система команд довольно сложная, в топике не расскажешь. Однобайтовой инструкции для помещения в стек непосредственного операнда у Интела нет. push reg заменить на что-то нужное тебе - не получится. Xatrix пишет: если очень нужно Ну и чем тебе не подходит вариант с "mov edx,значение"? Если нет места, то заменяешь команду (или несколько) на прыжок в свободное место, там их восстанавливаешь, меняешь регистр EDX как тебе надо и прыгаешь обратно. Простых решений в пару бит здесь нет... Хотя всё зависит от конкретной ситуации. ----- Всем привет, я вернулся ![]() |
|
|
Создано: 05 января 2006 01:52 · Личное сообщение · #17 |
|
|
Создано: 05 января 2006 01:53 · Личное сообщение · #18 Shad0vv Полнее чем мануалы интела FAQ (гы) не встретишь IA-32 Intel(R) Architecture Software Developer's Manuals http://www.intel.com/design/pentium4/manuals/index_new.htm Если с трафом напряг можно поглядеть всякие огрызки типа этого Справочник по опкодам процессоров Intel Pentium 4 и AMD Athlon XP http://ms-rem.dot-link.net/stuff/intel_amd_quick_ref_v2_2.rar таблица опкодов процессора Pentium MMX http://ms-rem.dot-link.net/stuff/pentium.rar Туторы лучше чем те что я указал, на просторах рунета не встречал. ToBad пишет: Статьи конечно полезно, но зачастую очень сложны для понимания. Че правда? ----- Все говорят что мы вместе. Но не многие знают в каком. ![]() |
|
|
Создано: 05 января 2006 01:58 · Личное сообщение · #19 Shad0vv Прив. всем! Недавно решил заняться крэкингом. Но встала одна проблемка: ни как не могу найти опкоды команд (трудно в hex режиме код править) Вот знаете ребят почему вас скоро с форума погонят - за такие утверждения ! Первая-же ссылка в Yandex-се или Google направять вас на путь истинный .. САМ ПРОВЕРЯЛ (ПЕРЕД ТЕМ КАК ТАКИЕ ВОТ ВОПРОСЫ ЗАДАВАТЬ) ! БУБЁНАТЬ ! ![]() |
|
|
Создано: 05 января 2006 02:01 · Личное сообщение · #20 |
|
|
Создано: 05 января 2006 02:03 · Поправил: Grey · Личное сообщение · #21 |
|
|
Создано: 05 января 2006 02:45 · Личное сообщение · #22 |
| eXeL@B —› Основной форум —› Замена push register на push value в бинарном файле |









Для печати