Ребята, помогите пожалуйста написать лоадер для проги, хочу написать именно на ASMе, я не прошу исходник, хочу освоить все сам, подскажите пожалуйста, где найти нужную информацию.
В разделе RESEARCH моя тема "Онлайн патч" только хочу все сделать сам, со скриптами не прокатывает я уже запарился...
Nextor Не писал подобных утилит, но глянув на твой код http://wasm.ru/forum/viewtopic.php?pid=280810#p280810 подумалось следующее: где гарантия того, что ты меняешь байты до того, как по ним пройдется программа? Я бы попробовал создавать суспенд-процесс, менять байты, и далее вызывать ResumeThread.. Ну и соответсвенно перед изменением проверять то-ли ты меняешь, как тебе уже советовали. Проверь, я могу ошибаться, тк подобную задачу на практике не решал.
Nextor 1. запускаешь процесс, который собираешся патчить (CreateProcess()) 2. размораживаешь процесс (ResumeThread()). Если прога запакованая, то этот шаг обязателен (прога же должна сама себя распаковать). Но и с незапакованными лучше тоже размораживать процесс сразу. 3. Собственно патчинг. Читаешь нужное место (ReadProcessMemory()), сравниваешь с байтами, которые должны там быть. Но обычно байты сразу не совпадут (особенно если прога запакованная) - поэтому надо организовать некоторый цикл попыток. Всего обычно устанавливают несколько тысяч попыток, причем перед каждой делается небольшая задержка (лучше ее сделать "внутри" процесса (напр. циклическим декрементом регистра с какого то значения (я на celeron-800 устанавливал 2000) до нуля) а не вызывать Sleep() итп). Когда байты совпали - пишем чепрез WriteProcessMemory(), можно еще задать права перед этим через VirtualProtectEx(). Если попытки закончились - то значит обрабатываемая прога не та. 4. Закрываешь процесс p.s. Если тебе это нужно для конкретной цели, а не для спортивного интереса, то зря ты не хочешь использовать генераторы патчей (имею ввиду в первую очередь hpatch и rpp, другие не пробовал) - тебе лишь нужно указать что патчить, сколько попыток, когда размораживать процесс - все остальное они сделают за тебя.
я имел ввиду, что если попытки чтения+сравнения исчерпались, то скорее всего (но не обязательно так!) программа не та, которая должна быть, например другая версия итп. Имел ввиду закрытие хэндла процесса и потока (CloseHandle(pinfo.hProcess); CloseHandle(pinfo.hThread)). Думал это очевидно.
Не знание того какую ерсию программы ты собирашься патчить, это результат того, что ты юзаешь Оттуда же и дальнейший, извигите, бред, который вы написали А просто с другим флагом запустить нельзя? ))) А если не запакованная - то не обязательный. Пускай так и висит себе замороженная ))) См. выше... Если прога запакована/криптована - почему бы не суспендить поток в цикле получая его контекст, сравнивая eip с нужным смещением и потом уже патчить...
meduza Я думаю, может засунуть оригинал и модифицированную прогу в шестнадцатиричный редактор, сравнить байтики по всем адресам (т.е. и изменившимся) и не заморачиваться а по результатам сравнения написать скрипт. Но теперь для меня дело чести - написать самому Loader на ASMе.
_Aspire можно, но я старался описать более общий случай. Иногда в программе нужно что-то пропатчить до ее разморозки, это редко бывает, но бывает. Вот например кусочек rpp'шнрого скрипта с таким случаем: Код (Text): p=57d31b/00/02: ;asprot fix :d kill anti loader R: ; resume process P=40FC1c/55,8b,ec/b0,01,c3: ;reg crack Если такого не надо, то конечно можно указать флаг "размороженности" еще при запуске через CreateProcess(). (см. предыдущий абзац). Добавлю, что в редких случаях размораживать прогу приходится только под конец, перед закрытием хэндлов. можно и так, я указал простейший вариант. Раньше у меня было увлечение "крекингом" и я всегда писал лодеры указанным способом. Nextor не совсем понял. Сначала нужно конечно сравнить оригинал и модиф. программу. Потом патчить нужные адреса.
meduza У меня какраз путаница получилась из-за OllyDbg, она как-то непонятно отображиет байтики по нужным адресам - я не могу понять как это сначало 005948BC а потом сразу 005948BE но в шестнадцатеричном редакторе я не смотрел.