Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Subj: F-PROT2.19______________________________



Вообще-то я не доверяю антивирусам... Как бы ни совершенствовался автома­тический поиск, но до ручного ему еще далеко. Я не полагаюсь на антивирусы, а ищу и отлавливаю "насекомых" сам. F-PROT запустил из чистого любопытства. Версия 2.19, ссылаясь на устарелость версии, бесцеремонно "выплевывает" меня в DOS! Да, наглый нынче народ стал. Ну что, будем лечить... Т.е. удалим проверку даты, а то лень переводить ее назад (да и глупо).

Нажимаю F3 и вижу (по отсутствию таблицы перемещаемых элементов), что файл явно упакован. Падчик лень делать (хотя я уже имел к этому времени готовый инструментарий, но я не сторонник падчиков), поэтому пытаюсь распа­ковать файл первым, что попадается под руку, — UNP, который сполна оправды­вает возложенные на него надежды.

Запускаю распакованный файл... Мда, контроль своей длины и 'System Halted' — загружайся, мол, с чистой дискетки. Пытаюсь использовать "дурацкий" прием, который проходит со многими антивирусами. Длина упакованного фай­ла — 109635, в шестнадцатиричном — Ох1АС43; пытаюсь найти в файле Ох43АС (надеюсь, понятно почему). Очень часто это проходит, но... не на этот раз. Жаль...

Гм, что бы еще сделать? Установить точку останова на 21h,f.3Dh (открытие файла)? Пробую... Увы, эффект нулевой. Как же еще можно вычислить длину файла? Через f.4Eh/f,4Fh — FindFirst/FindNext, но и это безрезультатно!

Что мы имеем? Мы испробовали все методы "от дурака". От вируса-дурака, от хакера-дурака. Следовательно, антивирус стоит чуточку выше! Это делает ему честь, но что же делать нам?! Вот тут главное не запаниковать и не растеряться. Из этой ситуации есть три выхода:

1) Просто трассировать программу, надеясь найти "Nag''-процедуру; но это настолько глупо, что бессмысленно рассматривать здесь.

2) Продолжить перебор попыток угадывания алгоритма определения длины файла. — Увы, это может слишком затянуться; кроме того, если он окажется чересчур нестандартным, мы рискуем потерять уйму времени без гарантии отыскать его. Мы и так потеряли пару минут, перебирая несколько очевидных вариантов...

3) "Zen-Method". Т.е. такой метод, когда мы не вникаем в механизм алгоритма, а просто локализуем относящийся к нему участок кода, который локально изучаем.

Что ж, пойдем третьим способом. Бесспорно, вызывая отладчик в "ругатель­ном" сообщении, мы одним из методов сможем определить точку вызова. Скажем, по стеку, хотя очень часто "Nag''-экран находится внутри интересующей нас процедуры, а не выделен в отдельную. За неимением лучшего выхода вызовем отладчик в "Nag''-экране. И... мы глубоко в BIOS. Аккуратно выберемся из нее, потом из DOS. Оттуда в системную библиотеку и наконец, в вызывающий этот экран код. Привожу фрагмент, на котором следует заострить внимание.

OOOID25C: В86400 movax,0064

OOOID25F: 50 push ax

OOOID260: IE push ds

OOOID261: B81C4E mov ax,4EIC

OOOID264: 50 push ax

OOOID265: 56 push si

OOOID266: 9A24007F25 call 257F:0024

OOOID26B: 83C408 add sp,0008

OOOID26E: 8B16283D mov dx,word ptr [3D28]

OOOID272: A1263D mov ax,[3D26]

OOOID275: 056800 add ax,0068

OOOID278: 83D200 adc dx,0000

OOOID27B: 3B56FE cmp dx,word ptr [bp-02]

OOOID27E: 753F jnz OOOID2BF

OOOID280: 3B46FC cmp ax,word ptr [bp-04)

OOOID283: 753A jnz OOOID2BF

OOOID285: A1343D mov ax,[3D34]

OOOID288: 3B06884E cmp ax,word ptr [4E88]

OOOID28C: 7531 jnz OOOID2BF

OOOID28E; 803EIC4E46 cmp byte ptr [4EIC),46

OOOID293: 752A jnz OOOID2BF

OOOID295: 803EID4E53 cmp byte ptr [4EID],53

OOOID29A: 7523 jnz OOOID2BF

OOOID29C: 833EE63800 cmp word ptr [38E6],0000

OOOID2AI: 753B jnz OOOID2DE

OOOID2A3: 8B16864E mov dx,word ptr [4E86]

OOOID2A7: A1844E mov ax,[4E84]

OOOID2AA: 050400 add ax, 0004

OOOID2AD: 83D200 adc dx,0000

OOOID2BO: 52 push dx

OOOID2BI: 50 push ax

OOOID2B2: 56 push si

OOOID2B3: 9A05008D07 call 078D:0005

OOOID2B8: 83C406 add sp,0006

OOOID2BB: OBCO or ax, ax

OOOID2BD: 751F jnz OOOID2DE

OOOID2BF: B80401 mov ax, 0104

OOOID2C2: 50 push ax

OOOID2C3: 9ABF04CFOF call OFCF:04BF

OOOID2C8: 59 pop ex

OOOID2C9; EBOO jmp OOOID2CB

OOOID2CB: 9A09005529 call 2955:0009; <=—Nag Proc OOOID2DO: 3DEIOO cmp ax,OOEI; <—мы здесь OOOID2D3: 75F6 jnz OOOID2CB

OOOID2D5: 33CO xor ax,ax

OOOID2D7: 50 push ax

OOOID2D8: 9AOIOOA129 call 29Al:0001

OOOID2DD: 59 pop ex

OOOID2DE: 81368A4EFFFF xor word ptr [4E8A],FFFF

OOOID2E4: 80368C4EFF xor byte ptr [4E8C],FF

OOOID2E9: 80368D4EFF xor byte ptr [4E8D],FF

OOOID2EE: 56 push si

OOOID2EF: 9A02009A2A call 2A9A:0002

OOOID2F4: 59 pop ex

OOOID2F5: 57 push di

OOOID2F6: 9A02009A2A call 2A9A:0002

OOOID2FB: 59 pop ex

OOOID2FC: 5F pop di

OOOID2FD: 5E pop si

OOOID2FE: 8BE5 mov sp,bp

OOOID300: 5D pop bp

OOOID30J: CB retf

Мы очутимся в строке OOOID2DO. Теперь посмотрим, как мог быть выполнен переход на "Nag''-экран... Ближайший условный переход, возможно, подходящий на эту роль, — это OOOID2BD:jnz OOOID2DE; проверка показывает, что переход на указанный адрес приводит к нормальному продолжению работы программы. В большинстве случаев замены 0х75 на ОхЕВ было бы достаточно, но не подсказы­вает ли вам интуиция, что сегодня этого будет мало? Жаль... действительно мало, и прога по-прежнему ругается и не запускается.

Посмотрите выше. Сколько разветвлений... мы, как сапер, должны все обезвредить, но для начала проанализируем их. Мы уже знаем, что переходы на строку ID2DE безопасны и должны быть заменены на безусловные. А остальные? Виднеется масса переходов на OOOID2BF. Легко проследить, что этот путь к "Nag''-экрану. Если выполняется цепочка сравнений с переходами на одну строку в случае несовпадения, то легко догадаться, что это такое... Итак, заменяем их на 0х9090, а также в строке OOOID2BD запишем безусловный переход. Опля! Это работает! Но... но что-то слишком много замен, вы не находите? Нельзя ли сделать меньше? Да, можно. Если мы в строке OOOID2CB запишем переход на ID2DE, т.е. в первой строке "nag''-кода сделаем переход к правильному выполне­нию программы, то это будет работать, хотя мы заменили всего два байта. И это гораздо предпочтительнее, потому что не заставляет шарить по всему коду в поисках всех условных переходов на "nag"... Но есть более красивое решение.

Находим первое сравнение и оттуда делаем jrnp на ID2DE... Так я и поступил, изменив всего один байт.

Наконец-то программа перестала реагировать на изменившуюся длину. Дол­жен сообщить, что это грязный и пошлый способ. Ибо теперь длина вообще не контролируется и при заражении вирусом программа об этом, увы, уже не сигнализирует. Желающие могут попробовать разобраться в алгоритме (благо код, выполняющий это, мы уже локализовали) и скорректировать новую длину файла.

Так, теперь проверка даты... Можно также было бы вызвать отладчик в "Nag''-экране, но это не лучший путь, не так ли? Логично, что программа должна опросить системную дату, чтобы узнать, насколько она устарела. Есть мало причин, которые могли бы заставить разработчика не использовать отличную от f.2Ah функцию операционной системы. В самом деле, остальные методы чреваты большей головной болью и меньшей совместимостью.

Ну что же, я свою ставку сделал, а вы как знаете! Опа! Сработало! Потрас-сировав самую малость, мы наталкиваемся на очень выразительный кусок кода.

00005СА7: 8956FE movwordptr [bp-02],dx

00005САА: BFBCOO mov di,OOBC

00005CAD: 3BF7 cmp si,di

00005CAF: 7DOC jnl 00005CBD

00005CBI: B81100 mov ax, 0011

00005CB4: 50 push ax

00005CB5: 9ABF04CFOF call OFCF:04BF; <—Nag Scr 00005CBA: 59 pop ex

00005CBB: EB41 jmp 00005CFE

00005CBD: 803E654EOO cmp byte ptr [4E65],00

00005CC2: 741F jz 00005CE3

00005CC4: A0654E mov al,[4E65]

00005CC7: 98 cbw

00005CC8: 03C7 add ax,di

00005CCA: 3BC6 cmp ax, si

00005CCC: 7D15 jnl 00005CE3

00005CCE: B84702 mov ax, 0247

00005CDI: 50 push ax

00005CD2: 9ABF04CFOF call OFCF:04BF

00005CD7: 59 pop ex

00005CD8: B80100 mov ax, 0001

00005CDB: 50 push ax

00005CDC: OE push cs

00005CDD: E8D4FE call 00005BB4

00005CEO: 59 pop ex

00005CEI: EBIB jmp 00005CFE

00005CE3: 833ED23800 cmp word ptr [38D2],0000

00005CE8: 7514 jnz 00005CFE

00005CEA: A0614E mov al, [4E61]

00005CED: 98 cbw

00005CEE: 03C7 add ax,di

00005CFO: 3BC6 cmp ax, si

00005CF2: 7DOA jnl 00005CFE

00005CF4: B81200 mov ax, 0012

00005CF7: 50 push ax

00005CF8: 9ABF04CFOF call OFCF:04BF

00005CFD: 59 pop ex


00005CFE: 833ED23800 cmpwordptr [38D2],0000

00005D03: 7515 jnz 00005DIA

00005D05: A0614E mov ai,[4E61]

00005D08: 98 cbw

00005D09: 0346FE add ax,word ptr [bp-02]

00005DOC: 3BC6 cmp ax, si

00005DOE: 7DOA jnl 00005DIA

00005DIO: B8F901 mov ax,OIF9

00005D13: 50 push ax

00005D14: 9ABF04CFOF call OFCF:04BF

00005D19: 59 pop ex

00005DIA: 5F pop di

00005DIB: 5E pop si

00005DIC: 8BE5 mov sp,bp

00005DIE: 5D pop bp

00005DIF: CB retf

He нужно быть чересчур опытным, чтобы догадаться, что call OFCF:04BF и есть та процедура, которая выводит ругательное сообщение; впрочем, это так же легко выяснить экспериментальным путем. Дальше, как говорится, дело техники. Мы находим все условные переходы, которые могли бы "шунтировать" эту процедуру и, судя по обстоятельствам, заменяем их. Как и следовало ожидать, проверка не одна. Причем проверяется даже такая экзотика, как некорректность системной даты... Сколько лишнего кода... А где оптимизация?

Даже беглый взгляд показывает, что не все "nag''-и приводят к выходу в DOS. Более "честный" вариант взлома — не выходить в DOS, а просто сообщить о "старости" и продолжить работу. Но это решать вам... Можно также "обновить" дату, но и это бессмысленно, ибо антивирус уже устарел. От того что он заругается, скажем, через месяц, смешно не будет. Пусть уж постоянно ругается (но в DOS не выходит, как все нормальные программы), либо вообще ничего не проверяет. Как видите, варианты есть.

Вот я и показал действие "Zen''-метода: когда мы, абсолютно не вникая в используемые антивирусом алгоримы, сумели добиться поставленных целей. Конечно, дальнейшие действия немыслимы хотя бы без поверхностного анализа, но главное сделано — измененная программа запускается!

А антивирус действительно ничего... Обширная база, неплохой эвристик (хотя с уймой ложных срабатываний), возможность собственноручного пополнения сигнатур... Конечно, по сравнению с Касперским это все детский лепет, хотя лично мне времени, потраченного на взлом, было не жалко — реакция антивируса на мою коллекцию вирусов меня достаточно позабавила и окупила время, затраченное на его "покусывание"...





Дата публикования: 2014-12-08; Прочитано: 245 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.016 с)...