eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 октября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: lysy75 (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Вопрос по изменению вывода функции через OllyDBG
Посл.ответ Сообщение

Ранг: 0.2 (гость)
Статус: Участник

Создано: 31 декабря 2018 03:09 · Поправил: Gveon New!
Цитата · Личное сообщение · #1

Доброго дня. Помогите разобраться, пожалуйста.

Копаю программу, в которой есть такая функция (как ее видит OllyDBG):

Code:
  1. 0045EC10   83EC 10          SUB ESP,10
  2. 0045EC13   8D4424 00        LEA EAX,DWORD PTR SS:[ESP]
  3. 0045EC17   50               PUSH EAX
  4. 0045EC18   E8 33000000      CALL client.0045EC50
  5. 0045EC1D   8B4424 08        MOV EAX,DWORD PTR SS:[ESP+8]
  6. 0045EC21   83C4 10          ADD ESP,10
  7. 0045EC24   C3               RETN


Мне нужно сделать так, чтобы она всегда возвращала значение 3. К сожалению, с патчингом бинарников, в отличие от .NET, я не очень знаком. Попробовал сделать так:

Code:
  1. 0045EC10   83EC 10          SUB ESP,10
  2. 0045EC13   8D4424 00        LEA EAX,DWORD PTR SS:[ESP]
  3. 0045EC17   50               PUSH EAX
  4. 0045EC18   E8 33000000      CALL client.0045EC50
  5. 0045EC1D   B8 03000000      MOV EAX,3
  6. 0045EC22   C3               RETN
  7. 0045EC23   90               NOP
  8. 0045EC24   90               NOP


После такого "патчинга" программа крэшится. Если открыть исходный exe в IDA и проделать те же изменения через Edit -> Patch Program, IDA начинает ругаться "endp ; sp-analysis failed".

Я понимаю что делаю какую-то очень банальную ошибку, но пока не хватает познаний разобраться, что не так. Подскажите, пожалуйста, как правильно изменить этот код, чтобы получать на выходе нужное мне значение.

Спасибо.


Ранг: 220.3 (наставник)
Статус: Участник

Создано: 31 декабря 2018 03:42 New!
Цитата · Личное сообщение · #2

Code:
  1. ADD ESP,10

Ты стек невыравненным оставил, retn прыгает по адресу на макушке стека, а там что попало лежит. Если не критично вызывать client.0045EC50, воткни mov eax,3/retn в самое начало функции (0045EC10)

Ранг: 0.2 (гость)
Статус: Участник

Создано: 31 декабря 2018 04:03 New!
Цитата · Личное сообщение · #3

О. Получилось. Спасибо!


Ранг: 538.4 (!)
Статус: Участник
оптимист

Создано: 31 декабря 2018 04:12 New!
Цитата · Личное сообщение · #4

как же смешно смотреть когда пишут
Code:
  1. B8 03000000      MOV EAX,3

когда можно красиво сделать
Code:
  1. 6A 03         PUSH 3
  2. 58              POP EAX

| Сообщение посчитали полезным: plutos



Ранг: 313.6 (мудрец)
Статус: Участник

Создано: 31 декабря 2018 12:07 New!
Цитата · Личное сообщение · #5

ClockMan

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

Добавлено спустя 19 минут
Пример.



{ Атач доступен только для участников форума } - move.7z


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 31 декабря 2018 14:54 New!
Цитата · Личное сообщение · #6

difexacaw
Изменять исполняемый код - это тоже некрасиво, нужно декомпилировать приложение в исходный код, на котором оно написано, внести нужные изменения, скомпилировать и получить что требуется.


Ранг: 313.6 (мудрец)
Статус: Участник

Создано: 31 декабря 2018 15:01 · Поправил: difexacaw New!
Цитата · Личное сообщение · #7

Vamit

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

Пересборка кода покрывает все задачи такого рода. Штатно бинарный код описывается графом, изменяется и билдится. Это всегда замечательно работало, только так выполняется любой патч.


Ранг: 538.4 (!)
Статус: Участник
оптимист

Создано: 31 декабря 2018 15:24 · Поправил: ClockMan New!
Цитата · Личное сообщение · #8

Vamit пишет:
Изменять исполняемый код - это тоже некрасиво, нужно декомпилировать приложение в исходный код, на котором оно написано, внести нужные изменения, скомпилировать и получить что требуется

Конечно когда мне нужно взломать программу я сначало её декомпелирую а потом собираю обратно очень удобно кстати


Ранг: 1120.2 (!!!!)
Статус: Участник

Создано: 31 декабря 2018 17:12 New!
Цитата · Личное сообщение · #9

Vamit пишет:
нужно декомпилировать приложение в исходный код


декопилировать тоже не красиво, нужно написать новое приложение с требуемым функционалом


Ранг: 1013.4 (!!!!)
Статус: Участник

Создано: 31 декабря 2018 17:19 New!
Цитата · Личное сообщение · #10

написать новое слишком дорого и хлопотно
необходимо найти другие возможности для решения задачи без использования программы

к примеру
хочется поиграть в фифа
игра стоит денег
денег нет
ломать долго и дорого
решение, пройтись по спорт площадкам где играют в футбол и присоединится к игре

| Сообщение посчитали полезным: plutos, ClockMan



Ранг: 1120.2 (!!!!)
Статус: Участник

Создано: 1 января 2019 03:34 New!
Цитата · Личное сообщение · #11

выйти на улицу? Слишком экстремально.

| Сообщение посчитали полезным: morgot



Ранг: 522.6 (!)
Статус: Участник
_Вечный_Студент_

Создано: 1 января 2019 03:38 New!
Цитата · Личное сообщение · #12

Gideon Vi пишет:
выйти на улицу? Слишком экстремально.


ничего экстремального,
особенно если под рукой есть экземпляр книги "Увлекательная травматология"


Ранг: 263.1 (наставник)
Статус: Участник
RBC

Создано: 1 января 2019 10:43 · Поправил: Kindly New!
Цитата · Личное сообщение · #13

Gveon, обычно пишут в самом начале, но иногда проге нужно пройти всю процедуру, тогда в конце писать надо и RETN нужно перезаписывать, если место снизу позволяет ее восстановить обратно.
Судя по коду, тебе лучше бы патчить функцию в CALL client.0045EC50, она там явно записывает нужное значение и выводит его в DWORD PTR SS:[ESP+8], и это значение может вызываться из этой ячейки прогой повторно в другом месте. Так что лучше перестраховаться и писать именно в ячейку там, где это должно писаться, а то с виду ты не там патчишь.


Ранг: 313.6 (мудрец)
Статус: Участник

Создано: 1 января 2019 16:41 New!
Цитата · Личное сообщение · #14

Kindly

> это значение может вызываться из этой ячейки прогой повторно в другом месте.

Не может, так как сразу после чтения локальной переменной текущим тредом она уничтожается: esp+16.
 eXeL@B —› Вопросы новичков —› Вопрос по изменению вывода функции через OllyDBG

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS