Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Эффективный патчинг

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-мэйкер сделает по этому сценарию лоадер, который можно будет запустить с чувством собственного достоинства.

Назад на стр. 057-040-4  Содержание  Вперед на стр. 057-040-6