Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #94, ОКТЯБРЬ 2006 г.

Иммунитет к троянам

BUG(O)R

Хакер, номер #094, стр. 094-086-3


00660E86 70 72 6F 74 65 63 74 2E 64 6C 6C 00 ASCII "protect.dll",0

После имени также впишем название наших двух функций, они нам понадобятся совсем скоро:

00660E92 45 6E 63 72 79 70 74 00 ASCII "Encrypt",0

00660E9A 44 65 63 72 79 70 74 00 ASCII "Decrypt",0

По адресу 00660EB2 (куда мы прыгнули с EP) пишем следующий код:

; Сохраняем все регистры в стеке, чтобы потом

; не было проблем с последующим выполнением программы

00660EB2 PUSHAD

; /FileName = "protect.dll" Кладем в стек параметр,

; указатель на строку с именем dll

00660EB3 PUSH qip.00660E86

00660EB8 CALL 00407804 ; LoadLibraryA

;Результат сохраняем по адресу 660EA2 (адрес произвольнaй)

00660EBD MOV DWORD PTR DS:[660EA2],EAX

Теперь, когда мы подгрузили dll, надо узнать адреса функций с помощью API GetProcAddress. Ее адрес — внутри нашего процесса. Ты можешь найти его аналогично, как и адрес LoadLibrary. Вызывать ее мы будем так: CALL 00401384):

; Кладем в качестве первого параметра имя функции

00660EC2 PUSH qip.00660E92

; В качестве второго результата, который нам вернула LoadLibrary.

; Это базовый адрес нашей dll в памяти.

00660EC7 PUSH EAX

; Узнаем, наконец, адрес функции

00660EC8 CALL 00401384

; И сохраняем результат

00660ECD MOV DWORD PTR DS:[660EA6],EAX

Аналогичная ситуация и с функцикей Decrypt:

00660ED2 PUSH qip.00660E9A

00660ED7 PUSH DWORD PTR DS:[660EA2]

00660EDD CALL 00401384;

00660EE2 MOV DWORD PTR DS:[660EAA],EAX

На данный момент в памяти qip.exe находится наша dll. Мы узнали адреса функций — самое время продолжить выполнение программы. Для этого нам надо восстановить все регистры командой popad, выполнить три команды, которые были перезатерты нашим прыжком в область с нулями, и сделать прыжок на код, который следует за командой JMP qip.00660EB2

;Восстанавливаем первоначальное состояние регистров

00660EE7 POPAD

00660EE8 PUSH EBP

; Следующие три команды затерлись в результате вставления

; команды JMP 00660EB2 на место оригинальной EP. Мы должны их выполнить.

00660EE9 MOV EBP,ESP

00660EEB ADD ESP,-10

; Прыгаем на адрес 00660A56. Это адрес команды, следующей за прыжком в область нулей.

00660EEE JMP qip.00660A56

Теперь сохраняем все изменения в файл qip.exe (как это делать, я описал выше).

Известно, что зашифрованный пароль хранится в ini-файле, в параметре NPass. Путь до ini-файла определяется следующим образом:

%Dir_Of_QIP%\Users\%UIN%\Config.ini

Специально для наших экспериментов я зарегистрировал номер icq и установил пароль PaSsWwOrD. Зашифрованный вариант выглядит так: NPass=ShwCtaR8aV4=.

Теперь я хотел бы сделать небольшое отступление и поговорить о процедурах Encrypt и Decrypt. Исходники с комментариями ты можешь посмотреть на диске. А здесь я просто хотел бы сказать, что использую в этих функциях алгоритм простой табличной замены или алгоритм сдвига. Каждый символ в результате кодирования или декодирования смещается на 7 значений, только при зашифровке данных на 7 значений вниз, а при расшифровке — вверх. То есть, например, символ «9» становится символом «2», а символ «я» становится символом «щ». Это простой алгоритм, его реализация на ассемблере занимает не больше 10-ти строчек кода, отсюда и размер нашей dll - 1248 байт. Ты вправе использовать свой алгоритм, но при этом желательно соблюдать два условия:

Назад на стр. 094-086-2  Содержание  Вперед на стр. 094-086-4