Loader

Тема в разделе "WASM.BEGINNERS", создана пользователем Nextor, 5 дек 2008.

  1. Nextor

    Nextor New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2008
    Сообщения:
    122
    Ребята, помогите пожалуйста написать лоадер для проги, хочу написать именно на ASMе,
    я не прошу исходник, хочу освоить все сам, подскажите пожалуйста, где найти нужную информацию.
     
  2. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Nextor
    Гавно-вопрос. Ты, главное, спроси поконкретнее...
     
  3. Nextor

    Nextor New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2008
    Сообщения:
    122
    В разделе RESEARCH моя тема "Онлайн патч" только хочу все сделать сам, со скриптами не прокатывает я уже запарился...
     
  4. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Nextor
    Не писал подобных утилит, но глянув на твой код
    http://wasm.ru/forum/viewtopic.php?pid=280810#p280810
    подумалось следующее: где гарантия того, что ты меняешь байты до того, как по ним пройдется программа?
    Я бы попробовал создавать суспенд-процесс, менять байты, и далее вызывать ResumeThread..
    Ну и соответсвенно перед изменением проверять то-ли ты меняешь, как тебе уже советовали.
    Проверь, я могу ошибаться, тк подобную задачу на практике не решал.
     
  5. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    Nextor
    1. запускаешь процесс, который собираешся патчить (CreateProcess())
    2. размораживаешь процесс (ResumeThread()). Если прога запакованая, то этот шаг обязателен (прога же должна сама себя распаковать). Но и с незапакованными лучше тоже размораживать процесс сразу.
    3. Собственно патчинг. Читаешь нужное место (ReadProcessMemory()), сравниваешь с байтами, которые должны там быть. Но обычно байты сразу не совпадут (особенно если прога запакованная) - поэтому надо организовать некоторый цикл попыток. Всего обычно устанавливают несколько тысяч попыток, причем перед каждой делается небольшая задержка (лучше ее сделать "внутри" процесса (напр. циклическим декрементом регистра с какого то значения (я на celeron-800 устанавливал 2000) до нуля) а не вызывать Sleep() итп). Когда байты совпали - пишем чепрез WriteProcessMemory(), можно еще задать права перед этим через VirtualProtectEx(). Если попытки закончились - то значит обрабатываемая прога не та.
    4. Закрываешь процесс

    p.s. Если тебе это нужно для конкретной цели, а не для спортивного интереса, то зря ты не хочешь использовать генераторы патчей (имею ввиду в первую очередь hpatch и rpp, другие не пробовал) - тебе лишь нужно указать что патчить, сколько попыток, когда размораживать процесс - все остальное они сделают за тебя.
     
  6. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    meduza Нагородил огород )) Особенно, вот это понравилось :
    и это..
    жжешь ))
     
  7. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    я имел ввиду, что если попытки чтения+сравнения исчерпались, то скорее всего (но не обязательно так!) программа не та, которая должна быть, например другая версия итп.

    Имел ввиду закрытие хэндла процесса и потока (CloseHandle(pinfo.hProcess); CloseHandle(pinfo.hThread)). Думал это очевидно.
     
  8. _Aspire

    _Aspire New Member

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

    Если прога запакована/криптована -
    почему бы не суспендить поток в цикле получая его контекст, сравнивая eip с нужным смещением и потом уже патчить...
     
  9. Nextor

    Nextor New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2008
    Сообщения:
    122
    meduza
    Я думаю, может засунуть оригинал и модифицированную прогу в шестнадцатиричный редактор, сравнить байтики по всем адресам (т.е. и изменившимся) и не заморачиваться а по результатам сравнения написать скрипт.



    Но теперь для меня дело чести - написать самому Loader на ASMе.
     
  10. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    _Aspire
    можно, но я старался описать более общий случай. Иногда в программе нужно что-то пропатчить до ее разморозки, это редко бывает, но бывает. Вот например кусочек rpp'шнрого скрипта с таким случаем:
    Код (Text):
    1. p=57d31b/00/02:  ;asprot fix :d kill anti loader
    2. R:  ; resume process
    3. P=40FC1c/55,8b,ec/b0,01,c3:  ;reg crack
    Если такого не надо, то конечно можно указать флаг "размороженности" еще при запуске через CreateProcess().
    (см. предыдущий абзац). Добавлю, что в редких случаях размораживать прогу приходится только под конец, перед закрытием хэндлов.
    можно и так, я указал простейший вариант. Раньше у меня было увлечение "крекингом" и я всегда писал лодеры указанным способом.

    Nextor
    не совсем понял. Сначала нужно конечно сравнить оригинал и модиф. программу. Потом патчить нужные адреса.
     
  11. Nextor

    Nextor New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2008
    Сообщения:
    122
    meduza
    У меня какраз путаница получилась из-за OllyDbg, она как-то непонятно отображиет байтики по нужным адресам - я не могу понять как это сначало 005948BC а потом сразу 005948BE но в шестнадцатеричном редакторе я не смотрел.
     
  12. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    наверно инструкция двухбайтовая
     
  13. Nextor

    Nextor New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2008
    Сообщения:
    122
    да именно с этим проблема