Лекарство для CuteFTP EGOiST/TSRh (egoist_tsrh@bk.ru) Хакер, номер #079, стр. 079-062-7 [структура данных] places dd 03 imagebase dd 00400000h offsets dd 0046bc95h db 06 dd 0046c160h db 18 dd 0046c583h db 02 old_bytes db 0fh, 84h, 1bh, 04h, 00, 00 db 0fh, 85h, 73h, 02h, 00, 00, 8ah, 44h, 24h, 38h, 84h, 0c0h, 0fh, 84h, 0fdh, 03h, 00, 00 db 33h, 0c0h patch_bytes db 0e9h, 1ch, 04h, 00, 00, 90h db 33h, 0c0h, 90h, 90h, 90h, 90h, 90h, 90h, 90h, 90h, 84h, 0c0h, 0e9h, 0feh, 03h, 00, 00, 90h db 40h, 90h В offsets первое число — это сам оффсет, а второе — количество байт, которые нужно пропатчить там. В old_bytes находится массив оригинальных байт, а в patch_bytes — пропатченых, соответственно. Теперь осталось написать пару функций. Одна будет проверять байты, чтобы они совпадали с оригинальными. Таким же способом обычно проверяют версию ехе'шника. Вторая функция будет иметь почти такой же код, а ее отличие состоит в том, что она не сравнивает байты, а записывает их в файл — патчит. Файл открываем с помощью функции CreateFile, ее параметры можно узнать в справочнике. Потом проецируем файл на память при помощи CreateFileMapping и, когда нужно получить адрес в памяти, MapViewOfFile. Основной цикл проверки выглядит так: [цикл, проверяющий байты на совпадение с оригинальными] mov map, eax xor edi, edi xor esi, esi .while edi < places push edi lea eax, [offsets+edi*4] .if edi != 0 add eax, edi .endif movzx ebx, byte ptr[eax+4] lea ecx, [old_bytes] .if edi != 0 movzx edi, byte ptr[eax-1] add esi, edi .endif add ecx, esi mov edi, ebx mov eax, [eax] mov ebx, map sub eax, imagebase add ebx, eax .while edi != 0 movzx eax, byte ptr[ecx] cmp al, byte ptr[ebx] jz @F xor eax, eax jmp _exit @@: inc ecx inc ebx dec edi .endw pop edi inc edi .endw В цикле структура обрабатывается и оригинальные байтики сравниваются с теми, что в файле. Если они совпадают, возвращается единица. Чтобы эта функция заработала как патчер, нужно поменять cmp al, byte ptr[ebx] в цикле на mov byte ptr[ebx], al ну и, соответственно, джампы убрать, а также вместо lea ecx, [old_bytes], прописать patch_bytes. Вот и все. На этой мажорной ноте я позволю себе откланяться. Если будут вопросы, пиши — с удовольствием отвечу :). Interactive Disassembler IDA — наверное, самый мощный дизассемблер. Лучшее описание этого продукта представлено на сайте компании: «IDA Pro является самым мощным и самым развитым интерактивным дизассемблером, доступным на сегодняшний день. Основные пользователи нашего дизассемблера: * антивирусные компании; * специалисты по информационной безопасности; * эксперты по программному обеспечению; * а также разработчики программных защит. Основная задача, превращение бинарного кода в читаемый текст программы, дополнена многими возможностями, уникальными для этой программы: |