Эффективный патчинг MC707 (mc707@mail.ru) Спецвыпуск: Хакер, номер #057, стр. 057-040-5 Но написание лоадера - занятие довольно неблагодарное. Мало того, что тут требуются знания работы ОС, основы управления памятью и умение программировать, так еще и результат может работать совершенно как ему заблагорассудится (глючить). Это связано с тем, что лоадер может модифицировать байты программы, когда протектор еще не распаковал основной код, что очень критично для стабильной работы программы. Скорее всего, программа просто упадет с критичной ошибкой. В связи с этим не советую увлекаться лоадерами. Правда, иногда деваться некуда, и проще написать загрузчик, чем возиться с другими методами. Есть несколько способов реализации лоадеров, я рассмотрю самый простой и распространенный. .data ; заголовок окна с сообщением об ошибке Msg db "Fatal Error", 0 ; сообщение об ошибке Error db "Program not found",0 ; имя файла программы program db "victim.exe",0 ; записываемый в память процесса байт write_buffer db 90h ; адрес, по которому будет ; осуществляться считывание/запись check_addr DWORD 401050h .data? ; переменная, в которую производится ; считывание байта процесса buffer dw ? ; структура информации о процессе process_info PROCESS_INFORMATION <> ; структура информации о параметрах ; создающегося процесса startup_info STARTUPINFO <> .code start: ;начало программы ; запускаем нужные нам программы. invoke CreateProcess,addr program, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE OR NORMAL_PRIORITY_CLASS, NULL, NULL, addr startup_info, addr process_info ;если результат выполнения равен 0, ; то программа не найдена и не запустилась .if eax == 0 ; информируем об ошибке invoke MessageBox, NULL, addr Error, addr Msg, MB_OK ; и выходим invoke ExitProcess,0 .endif ; главный цикл .while true ; считываем память процесса по ; адресу check_addr в буфер buffer размером в 1 байт invoke ReadProcessMemory, process_info.hProcess, check_addr, addr buffer, 1, NULL ; проверка на успешность считывания .if eax != 0 ; проверка на распакованность ; программы по этому адресу .if bufr != 00h ;ждем проверку целостности кода invoke Sleep,300 ; приостанавливаем процесс invoke SuspendThread, addr process_info.hThread ; записываем 1 байт write_buffer ; по адресу check_addr invoke WriteProcessMemory, process_info.hProcess, check_addr, addr write_buffer, 1, NULL ; продолжаем выполнение программы invoke ResumeThread, addr process_info.hThread ; закрываем хэндл процесса и ; завершаем свой процесс invoke CloseHandle, process_info.hThread invoke ExitProcess, 0 .endif .endif .endw ; конец кода end start Тут, я думаю, тебе все понятно. Просто запускаем процесс с помощью CreateProcess и модифицируем после некоторой паузы и нескольких проверок код программы, ответственный за регистрацию с помощью WriteProcessMemory. Кстати, по такому же принципу пишутся трейнеры к играм. На случай если писать лоадер очень лень, но очень нужно, существуют автоматизированные loader-мэйкеры, которые по специальному скрипту создают полноценный загрузчик. Останется лишь указать имя программы и то, по каким адресам и какие байты нужно модифицировать - все! Loader-мэйкер сделает по этому сценарию лоадер, который можно будет запустить с чувством собственного достоинства. |