Сейчас на форуме: tyns777, bezumchik (+6 невидимых)

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

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

Создано: 31 декабря 2018 03:09 · Поправил: Gveon
· Личное сообщение · #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".

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

Спасибо.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

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

Code:
  1. ADD ESP,10

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

-----
2 оттенка серого




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

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

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




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

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

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

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


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.


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


Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

ClockMan

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

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



cfe1_31.12.2018_EXELAB.rU.tgz - move.7z

-----
vx





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

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

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

-----
Everything is relative...





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

Vamit

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

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

-----
vx





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

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

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

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

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

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

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


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




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

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

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

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

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


Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 01 января 2019 03:34
· Личное сообщение · #11

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

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


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 01 января 2019 03:38
· Личное сообщение · #12

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


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

-----
Give me a HANDLE and I will move the Earth.





Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

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

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

-----
Array[Login..Logout] of Life





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 01 января 2019 16:41
· Личное сообщение · #14

Kindly

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

Не может, так как сразу после чтения локальной переменной текущим тредом она уничтожается: esp+16.

-----
vx



 eXeL@B —› Вопросы новичков —› Вопрос по изменению вывода функции через OllyDBG
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати