![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Вообще-то я не доверяю антивирусам... Как бы ни совершенствовался автоматический поиск, но до ручного ему еще далеко. Я не полагаюсь на антивирусы, а ищу и отлавливаю "насекомых" сам. 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!