Иммунитет к троянам BUG(O)R Хакер, номер #094, стр. 094-086-2 Ищем и избавляемся от проверки CRC ; Вызов процедуры, которая проверяет целостность файла 0062BA83 CALL qip.0062B9F8 ; Если файл девственно чист, то она вернет в AL TRUE или 1 0062BA88 TEST AL,AL 0062BA8A JNZ SHORT qip.0062BAA9 0062BA8C PUSH 0 0062BA8E MOV ECX,qip.0062BB4C ; ASCII "Bad qip.exe file" 0062BA93 MOV EDX,qip.0062BB60 ; ASCII "Sorry, qip.exe file is corrupted." 0062BA98 MOV EAX,DWORD PTR DS:[667C48] 0062BA9D MOV EAX,DWORD PTR DS:[EAX] ; Если же AL = 0, то выводим сообщение о том, что кто-то посигнул на целостность ; нашего файла, после чего программа завершается. 0062BA9F CALL qip.00487618 Нам нужно исправить условный переход JNZ на безусловный JMP, и тогда программа спокойно продолжит свое выполнение. Что ж, встаем на адрес 0062BA8A, нажимаем пробел и вписываем вместо JNZ команду JMP, после чего сохраняем изменения в exe-файле на винт: ПКМ > Copy To executable > All Modifications > Копировать все. Давай решим, куда мы будем записывать дополнительный код. Я думаю, что вполне подойдет конец секции кода, где с адреса 00660E86 идут нули (там их довольно прилично, нам хватит). Но, как правило, у секции кода атрибут Writeable не стоит, и просто так нам в нее писать никто не даст - программа просто упадет. Чтобы такого не произошло, грузим qip.exe в PETools, там выбираем Sections, на секции с именем «CODE» жмем правой кнопкой и выбираем «Edit Section Header», далее напротив поля «Characteristics» есть кнопочка, жмем еще и ставим галочку напротив «Writeable», сохраняем изменения. Все, наш файл теперь готов к любого рода издевательствам :). Чтобы сделать метод более универсальным, я принял решение написать dll, которая бы экспортировала две функции: «Encrypt» и «Decrypt». Каждая из функций принимает один параметр: lpData. Их действия и параметры, я думаю, понятны. Назовем библиотеку protect.dll и кинем в папку с QIP. Далее в начале программы мы подгрузим нашу dll в адресное пространство процесса qip.exe, определим адреса наших двух функций, и в местах, где qip считывает зашифрованный пароль из учетной записи, мы будем вызывать Decrypt, передавая в параметр lpData указатель на зашифрованный пароль, а в местах, где он будет сохранять пароль, мы будем вызывать Encrypt. Для наглядности покажу схемы, они принимают такой вид: [расшифрованный пароль] >> [действия программы] >> [protect.Encrypt] >> [зашифрованный пароль] Процесс расшифровки: [зашифрованный пароль] >> [protect.Decrypt] >> [действия программы по расшифровке] >> [расшифрованный пароль] Итак, грузим qip.exe в отладчик и делаем прыжок в область с нулями: 00660A50 JMP qip.00660EB2 Вначале нам надо вызвать LoadLibrary, но адреса этой функции мы не знаем. Чтобы его определить, делаем так: ПКМ > Search for > All intermoduler calls. В этом списке находим любой вызов этой API и смотрим, как он происходит: CALL 00407804. Отлично, точно так же мы и сделаем! В LoadLibrary в качестве параметра надо передать имя dll, давайте напишем это имя чуть выше адреса прыжка (00660EB2). Я сделал это по адресу: |