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

Лекарство для 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 является самым мощным и самым развитым интерактивным дизассемблером, доступным на сегодняшний день. Основные пользователи нашего дизассемблера:

* антивирусные компании;

* специалисты по информационной безопасности;

* эксперты по программному обеспечению;

* а также разработчики программных защит.

Основная задача, превращение бинарного кода в читаемый текст программы, дополнена многими возможностями, уникальными для этой программы:

Назад на стр. 079-062-6  Содержание  Вперед на стр. 079-062-8