Правка PE файла с OllyDbg

Тема в разделе "WASM.BEGINNERS", создана пользователем nop4, 7 фев 2012.

  1. nop4

    nop4 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    5
    Здравствуйте.
    Здесь (http://hacker-pro.net/thread/30531/p1.html) статья как вставить свой код в Pe файл.
    Удается в режиме отладки прописать свой код и он выполняется (olly 2.01 alpha 4 и некоторые пункты меню отличаются).
    Но при попытке сохранить пропатченый файл он оказывается неработоспособный т.к адреса которые я вписал во время выполнения (Push STRING_ADDR,Call MessageBoxA) сохраняется ровно такими как я и вписал (при новом запуске файла они уже не верны).В тоже время например первичный jmp в мою процедуру корректен при каждом новом запуске.
    Как сохранить корректными адреса где хранится строка и адреса вызываемых функций?
     
  2. Honorary_BoT

    Honorary_BoT New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    87
    Я когда не знал про импорт, релоки и прочую лабуду, просто искал в пределах данного модуля похожие вызовы и копипастил байты напрямую ))
     
  3. nop4

    nop4 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    5
    даже если скопировать,при сохранении и открытии адрес уже не валидный(
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    nop4
    Так происходит из-за того, что адрес строки абсолютный. Есть два варианта это побороть:

    1. Добавить релокации (relocations). Это может быть не очень простой путь, но в этом случае загрузчик при загрузке файла сам исправит адрес в инструкции.

    2. Обращаться к строке по относительному адресу. Это потребует добавить больше кода. Т.е. нужно вычислить адрес добавленной строки относительно начала файла, затем получить актуальный адрес загрузки модуля, сложить эти значения и использовать. PROFIT!!!111 Псевдокод для такой операции выглядит примерно так:

    call @f
    @@:
    pop ebx
    sub ebx, @b ;ebx содержит базовый адрес загрузки модуля
    lea eax, [ebx + StringOffset]
    push eax
    call MessageBoxA

    Возможно, нужны какие-то корректировки (исходный файл я не смотрел), но идея, надеюсь, ясна.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Проще разместить строку в самом коде и использовать стандартный приемчик с call в обход строки:
    call metka
    db "Hello, world!",0
    metka:
    ;здесь в стеке лежит адрес строки (как адрес возврата call)
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    leo
    А, да, так будет короче и проще.
     
  7. Honorary_BoT

    Honorary_BoT New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    87
    М, я думал, только указатель на функцию нужен
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mika0x65
    Шутки шутить изволите?
    nop4
    Кстати, к варианту "добавить релокации" можно присоседить вариант "удалить релокации". Если их нет, то модуль не будет менять адрес своей загрузки (хотя даже если они есть, адрес загрузки совсем не обязан меняться при каждом запуске).
     
  9. nop4

    nop4 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    5
    Спасибо!Но остался еще один баг - если файл открыть на другом компьютере он падает?Адрес USER32.MessageBoxA опять не валидный:dntknw:
    Для будущих поколений пригодится.
    В итоге применимо к http://hacker-pro.net/thread/30531/p1.html
    код выводе сообщения выглядит примерно так:
    Код (Text):
    1. >NOP
    2. CALL label
    3. ASCII "info",0
    4. label:
    5.  POP EAX
    6.  PUSH 0
    7.  PUSH EAX
    8.  PUSH EAX
    9.  PUSH 0
    10.  LEA EAX,DWORD PTR DS:[USER32.MessageBoxA]
    11.  CALL EAX                                 ;  USER32.MessageBoxA
    12. ;Здесь jmp туда откуда пришли
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    nop4, посмотри вот здесь, PE файл вызывающий MessageBox без всякого импорта, размер 97 байт, правда работать это на всей NT линейке не будет - писалось под XP
     
  11. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    Mikl___
    Там грязный хак использовался.

    nop4
    Олли не вкомпиливает импорт, она инструкцию с адресом конпилит. Нормально вручную впиливается дамп загрузчика модуля из памяти и сам образ.
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Indy?
    А что еще должно использоваться на околохакерском сайте? :)
     
  13. nop4

    nop4 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    5
    А вот это я не очень понимаю.Как вписать загрузчик модуля в тело редактируемой программы?К тому же там используются свои MessageBox и тд?
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    nop4
    А если там используются свои MessageBox -- тогда ссылки на них в секции импорт и нужно использовать, а вот если требуемых API-функций в теле жертвы не обнаружено, тогда и требуется найти их адреса в памяти
     
  15. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    nop4
    Загрузчик это код самодостаточный и базонезависимый. Он предоставляет некоторый функционал через вызов его начала. Вот и добавляем в модуль загрузчик, загружаемый образ и стаб для его вызова. Если места не хватает, то расшариваем последнюю секцию. Никаких импортов, никаких релоков. Хорошо и годно.
     
  16. nop4

    nop4 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2012
    Сообщения:
    5
    Спасибо за ответы.А есть возможность снабдить ответ какими-либо ссылками на эту тему? Что-то нашел, но не знаю то это и актуально ли сейчас.