![]() |
![]() |
![]() |
- Вступление CyberPozion уже публиковал статью о APP`98 v1.70 в журнале TopDevice onli- ne, это было только началом. В статье использовались исследования CyberPoi- zon'а (руководителя исследований) и mongoose. CyberPoizon [cPz] - исследования APP`98 v1.96 mongoose [mng] - написание утилиты, мелкие исследования - Об антивирусе [cpz] Антивирус довольно новый, поэтому совершенно естествено, что он недорабо- тан. Мне было интересно посмотреть на его устойчивость. Результаты работы пе- ред Вами. Хотелось бы выразить признательность господину Каримову, за то, что он постоянно улучшает антивирус. Я желаю ему успехов в продвижении своего продукта на отечественный и зарубежный рынок. Осталось лишь добавить, что последущие версии продукта, я попытаюсь не обойти своим вниманием. [mng] Ранее я никогда не занимался исследованием антивирусов, тем более ревизо- вор. Когда-то давно я пользовался Adinf'ом и мне он не особенно нравился, т.к мои черви (в то время файловые) легко его обходили. AP98 так же можно легко обойти, он содержит множество недоработок. Несмотря на все это на моей машине стоит копия антивируса. - Регистрационный ключ Регистрационный ключ должен находиться в каталоге APP'98 и обязательно должен иметь расширение "KEY". Формат ключа: смещение длина содержимое 000h [000] 07bh [123] Нули (00h) 07bh [124] 001h [001] Символ 0D6h 07ch [125] 050h [080] Нули (00h) 0cch [204] 007h [007] Дата годности ключа в аscii, например 11/07/2003, следующие два символа любые 0d8h [216] 001h [001] Размер регистрационного имяни 0d9h [217] 01bh [027] Регистрационное имя, максимальный размер 25 байт, следующие 2 символа любые 0f4h [244] 001h [001] Размер серийного номера 0f5h [245] 063h [099] Серийный номер, максимальный размер 25 байт остальные 74 символа любые 158h [344] 001h [001] Размер строки "поддержки" ;] 159h [345] 068h [104] Строка "поддержки" ;], максимальный размер 103 байта Данные с ДАТЫ ГОДНОСТИ КЛЮЧА (0cch) по РАЗМЕР СТРОКИ "ПОДДЕРЖКИ" (не вклю- чая РСП, 158h) зашифрованны комбинацией: xor al,2/ror al,1/not al, что бы рас- шифровать, используйте комбинацию: mov cx,(размер строки поддержки-дата годности ключа) lea si,offset дата годности ключа push si pop di ; si=di decrypt_cycle: lodsb ; byte from [si], to al not al ; rol al,1 ; decryption instructions xor al,2 ; stosb ; byte from al, to [di] loop decrypt_cycle - Конфигурационный файл "AP98.CFG" Конфигурационный файл не зашифрован. Из него были убраны сигнатуры и оп- ция работы с диском через IDE. смещение длина содержимое 06Bh [107] 001h [001] Чтение через IDE 071h [113] 001h [001] Проверка диска A (0-No,1-Yes) 074h [116] 001h [001] Создание log файла (0-No,1-Yes) 075h [117] 004h [004] Адрес обработчика int 13h 279h [633] 002h [002] Кол-во дисков в системе 27Bh [635] 001h [001] Проверка Flash Bios (0-No,1-Yes) - Таблица "AP98.TB1" смещение длина содержимое 273h [627] 256h [512] копия MBR Таблица "AP98F.TBL" Разработчики убрали сигнатуры из начала таблицы, но так и не вставили функцию позволяющую задавать пользователю произвольное имя таблиц, и мы спо- койно можем искать файл "AP98F.TBL". В данной таблице хранятся данные о проверяемых файлах, она зашифрованна, но расшифровывается довольно просто: mov cx,размер таблицы lea si,таблица push si pop di ; si=di decrypt_cycle: lodsb ; byte from [si], to al not al ; ror al,1 ; (de)cryption instructions xor al,2 ; stosb ; byte from al, to [di] loop decrypt_cycle [cPz] В отладчике это выглядит, примерно, так: 3A85:4B49 7F1D JG 4B68 3A85:4B4B A36AC8 MOV [C86A],AX 3A85:4B4E EB04 JMP 4B54 3A85:4B50 FF066AC8 INC [WORD C86A] 3A85:4B54 FF366AC8 PUSH [WORD C86A] 3A85:4B58 E8C1F6 CALL 421C ; [!] Самое интересное 3A85:4B5B 9AC10C3A40 CALL FAR 403A:0CC1 3A85:4B60 A16AC8 MOV AX,[C86A] 3A85:4B63 3B46FE CMP AX,[BP-02] 3A85:4B66 75E8 JNE 4B50 3A85:4B68 E9C702 JMP 4E32 Далее входим в call 421C и трассируем до такого участка: 3A85:4249 E805E3 CALL 2551 ; [!] Вот здесь 3A85:424C E8F1EF CALL 3240 3A85:424F E8FBE7 CALL 2A4D 3A85:4252 E812EA CALL 2C67 3A85:4255 E8B5EA CALL 2D0D 3A85:4258 E8F3EB CALL 2E4E 3A85:425B E84CF0 CALL 32AA 3A85:425E E800F1 CALL 3361 3A85:4261 833E6AC801 CMP [WORD C86A],01 3A85:4266 7503 JNE 426B 3A85:4268 E821ED CALL 2F8C Вся работа с таблицами начинается в отмеченном вызове, входим в процедуру и просто заходим во все вызовы. Там будет и проверка ключа, и работа с фай- лом. Но нас интересует это: 28FE:28C3 680002 PUSH 0200 28FE:28C6 9AC3004B37 CALL FAR 374B:00C3 ; [!] Вот тут 28FE:28CB BF62BC MOV DI,BC62 28FE:28CE 1E PUSH DS 28FE:28CF 57 PUSH DI 28FE:28D0 9A5639D745 CALL FAR 45D7:3956 28FE:28D5 BF62BC MOV DI,BC62 28FE:28D8 1E PUSH DS 28FE:28D9 57 PUSH DI 28FE:28DA 6A02 PUSH 02 28FE:28DC 9A9B003B45 CALL FAR 453B:009B 28FE:28E1 BF4F25 MOV DI,254F Входим в процедуру и трассируем до: 48D2:00DE AC LODSB 48D2:00DF F6D0 NOT AL ; 48D2:00E1 D0C0 ROL AL,1 ; собственно расшифровка 48D2:00E3 3402 XOR AL,02 ; 48D2:00E5 AA STOSB 48D2:00E6 E2F6 LOOP 00DE 48D2:00E8 1F POP DS 48D2:00E9 C9 LEAVE 48D2:00EA CA0600 RETF 0006 Кстати, для зашифровки файлов (конфигурационного файлов и таблиц) нужно использовать последовательность команд xor al,2/ror al,1/not al. Таблица сос- тоит из записей, размер одной записи (одна запись соответствует данным об од- ном файле) 86 байт. Формат таблицы следующий: смещение длина содержимое 000h [000] 001h [001] Длина пути к файлу 001h [001] Путь к файлу (размер по смещению 000h) 051h [081] 004h [004] Размер файла 055h [085] 002h [002] CRC16 X) Мне непонятно, только одно, почему если в "FILES.DAT" после каталога ука- зываешь маску "*.*", то база каталога будет содержать не только записи о фай- лах, но и записи о каталогах "." и "..". X) article by CyberPozion, mongoose [MY AS 2K] |
||
![]() |
![]() |
![]() |