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