книги хакеры / журнал хакер / 128_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 |
|
|
|||
>> coding |
|
|
to |
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
РАЗНООБРАЗИЕ
SOCKS’ОВ
ДЛЯ ФАНАТИКОВ АСЬКИ ДАЖЕ ЗУБНУЮ ПАСТУ ВЫПУСКАЮТ
РАНЬШЕ ШИФРОВАНИЕБЫЛО ВЕСЕЛЕЕ
нравитсяsocks-серверотXavier Lagraula. Онпредставляетсобойнабор скриптов, основнымисредикоторыхявляютсяPySocks.py (главнаяпрограмма) иsocks.conf (конфиг). Зайдемвконфигивыставимдвапараметра:
OSCAR. НЕПРОТОКОЛ! ПИТОН ДЛЯ БЛОНДИНОК
bind_address : 127.000.000.001 bind_port : 1080
ЗдесьмыопределяемIP-шникипорт,накоторомбудетвисетьsocks-сервер. ТеперьможнозапуститьPySocks.py ипопробоватьеговработе. Кстати, при запускесервератынаверняказаметилчерноеконсольноеокошко, которое портитвнешнийвидтвоейновойWindows7? Чтобыубратьего, изменирасширениефайлаPySocks сpy наpyw.
Затемнайдемместовнедрениянашегокода. Дляэтогонужнознать, чтодля чтенияданныхссокетаестьфункцияrecv. ЕслимыоткроемфайлPySocks. py ипопробуемпоискатьназваниефункции, тосразуженайдемследующий код(безвыделенногожирнымшрифтом):
data = readable_sock.recv(self.server)
if data:
if readable_sock == client_sock: my_type = 1
else: my_type = 2
data = my_hack.my_hack(my_type,data)
writeableslist[0].send(data) if readable_sock == client_sock:
octets_out += len(data) else:
octets_in += len(data)
else:
raise Connection_Closed
Этоткодчитаетданныесодногосокетаизаписываетихвдругой. Именнов этотучастокмыиприсунемсвойкод(онкакразвыделен). Здесьпозначениюclient_sock мыузнаем, вкакуюсторонуидетинформация, ипередаемее
внашуфункциюmy_hack. Онабудетнаходитьсяводноименноммодуле. То есть, вседанныепосленашеговнедренияначнутпроходитьчерезmy_hack,
вкотороммы, соответственно, иполучимполнуювластьнадинформацией. Минимальныйвариантмодуляmy_hack.py, которыйдолженразмещатьсяв каталогесостальнымифайламиsocks-сервера, таков:
def my_hack(type,data): return data
Каквидим, этафункция(my_hack) лишьвозвращаетто, чтоейпередали, и поэтомуникакневлияетнаsocks-сервер.
XÀÊÅÐ 08 /128/ 09 |
099 |
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
C |
E |
|
|
|
|
||||
|
|
|
X |
|
|
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
|
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
P |
|
|
|
|
|
NOW! |
o |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||||
++++ BUY |
>>m |
|
|
|
|||||||||
|
|
|
coding |
||||||||||
w Click |
to |
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||
w |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
||
|
|
|
|
|
-xcha |
|
|
|
|
|
|
||
++++ |
|
|
|
|
|
|
|
|
|||||
++++ |
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
++++ |
|
|
|
|
HTTP://WWW |
|
|
||||||
|
|
|
|
|
|
|
|
links
•Официальное описаниепротокола
++++аськи: dev.aol.com/ aim/oscar.
•Сайтбиблио-
++++текидляDESшифрования: sourceforge.net/ projects/pydes.
++++
• Написанныйна
Python’e socks-
сервер, которыймы
++++модифицируем: sourceforge.net/ projects/pysocks.
++++
|
|
|
|
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 |
|
|
|
|
OSCAR
OSCAR—открытый,нонесвободныйсетевойпротокол,обеспечивающийобмен мгновеннымии оффлайновымитекстовыми сообщениями.ВданныймоментиспользуетсядлядвухсистемкомпанииAOL(сейчасTimeWarner):ICQиAIM.AOLоткрыласпецификациипротокола5марта2008года иразрешиласозданиеальтернативныхклиентов.Конечноже,небезограничений.
++++ |
DVD |
dvd
++++• Надискевожиданиитебяпокоятся полныескрипты написанногоsocks-
++++серверасподробнымикомментариямиот автора.
• Бездемонстрацион-
++++ноговидеоятебяне оставлю— смотриего
снашегодиска!
++++
INFO
++ ++
info
SOCKS — сетевой
++++протокол, который позволяетклиентсервернымприложениямпрозрачно
++++использоватьсервисызамежсетевыми экранами(файр-
волами). «SOCKS»
++++— этосокращениеот
«SOCKetS» (сокеты,
гнезда).
НАПИСАНИЕСКРИПТА ВNETBEANS’Е
ШИФРОВАНИЕ
Дляреализациифункциишифрованияянашелчудесныймодуль
—pyDes.py,сделанныйдобрымирукамичеловекапоимениTodd Whiteman.Дляшифрованияилирасшифровкиспомощьюмодуля нужносоздатьобъектипередатьемупарольиустановитьпараметр padmode=pyDes.PAD_PKCS5.Дальшевсепросто—используем функциюencryptдляшифрованияиdecryptдлярасшифровки. Нижеприведенпримердвухфункций, которыеупрощаютпро- цессшифровки-дешифровки. Этифункциимыпозжебудем использоватьдляшифрованиясообщенийаськи:
import pyDes
#функция для шифрования def encode(password,data):
k = pyDes.des(pass,
padmode = pyDes.PAD_PKCS5) return k.encrypt(data)
#функция для расшифровки
def decode(password,data): k = pyDes.des(pass,
padmode=pyDes.PAD_PKCS5) return k.decrypt(data)
МыиспользуемDES-шифрование, ноэтотмодультакже поддерживаетнадежный3DES. АеслизахочешьиспользоватьAES, тотутямогупосоветоватьиспользоватьPython Cryptography Toolkit.
ПРОТОКОЛАСЬКИ
Самыйсложныймомент— разобратьсяспротоколомаськи. Я честноначалвкуриватьвдокументациюидажепрочелпару страниц, нозатеммотивацияиссякла, ябросилтеориюиперешелкизучениюпротоколаметодомпробиошибок.
Дляанализапротоколасохранимнесколькосообщений. Тут подойдеттакойкодвнашейфункцииmy_hack:
#если исходящее соединение if type == 1:
file = open('q.txt.', 'w+') file.write(data) file.close()
Припросмотресохраненныхсообщенийсталоясно, чтово всехнихвначалеидет0x2a02, далее— 2 байта(число, которое увеличиваетсянаединицуприкаждомследующемобмене даннымиссервером). Следующимиидут2 байта, которые обозначаютдлинувсегоблокаданных, безучетапервых6 байт. Послезаголовкаидетблокданных; дляисходящихсообщений онвсегданачинаетсяс0x00040006.
Вблокеданныхважнымполемявляетсябайтсномером26.
Внемсодержитсяразмерномерааськи. Размерномеразапомнимобязательно, ведьприрасчетеостальныхсмещений нужноучитыватьдлинуномера. Словопоадресу39 помещаетвсеберазмерсообщения+ 4 байта. Самосообщение начинаетсясадреса45 + длина_номерааськи. Теперьунас
++++ |
100 |
XÀÊÅÐ 08 /128/ 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 |
|
|
|||
>> coding |
|
|
to |
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
ПРОЦЕССОТЛАДКИ КОДАВNETBEANS’Е
достаточноинформации, чтобысчитатьсообщениедляпоследующего шифрования:
if type == 1:
# отбираем только исходящие сообщения аськи if data[0:2] == '\x2a\x02'
and data[6:10] == '\x00\x04\x00\x06':
#определяем длину номера аськи len_num = ord(data[26])
#определяем длину сообщения
len_msg = ord(data[39+len_num])*256 +ord(data[40+len_num])-4
# читаем сообщение
msg = data[45+len_num:45+len_num+len_msg]
Итак, чтоздесьпроисходит? Мыотбираемтолькоисходящиесообщения, определяемдлинуномерааськи, длинусообщенияисамосообщение. Теперьсообщениенужнозашифроватьиподготовитькотправке, закодируя еговbase64 ииспользуявстроенныймодульbase64, чтобыизбавитьсяот спецсимволов, которыемоглипоявитьсяпришифрованииDES иповлиять напередачусообщения:
enc_msg = encode(pass, msg)
enc_msg = base64.encodestring(enc_msg)
Сообщениеполностьюготовоквнедрению! Теперьмыможемзаменить исходноесообщениеназашифрованное. Послеэтогонужноподкорректироватьполя, которыеотвечаютзаразмерсообщения, ведьбезнихсервер посчитает, чтоэтоошибочноесообщениеинепропуститего.
# определяем длину сообщения len_enc_msg = len(enc_msg)+4 len_num_1 = chr(len_enc_msg / 256) len_num_2 = chr(len_enc_msg % 256)
# создаем исходящий пакет данных data = data[0:39+len_num] + len_num_1
+len_num_2 + ‘\x00\x02\x00\x00’
+enc_msg + data[45+len_num+len_msg:]
Осталосьлишьподкорректировать5-йи6-йбайт, которыеотвечаютзаразмервсегопакетаданных:
#определяем длину пакета данных len_all = len(data)-6
len_all_1 = chr(len_all / 256) len_all_2 = chr(len_all % 256)
#формируем полностью готовый к отправке пакет data = data[0:4]+len_all_1 + len_all_2 + data[6:]
Здесьмыиспользуемвторуюитретьюстрочки(делениеивзятиеостаткаот деления), чтобыпреобразоватьчислоиздесятичногозначениявhex.
Наэтомчасть, посвященнаяисходящимсообщениям, завершена. Дешифровочнуюмыприводитьздесьинебудем. Во-первых, тысможешьнаписать всесамостоятельно, интуитивноориентируясьнапредыдущийкод, авовторых, ееможнопростосписатьизисходниканадиске.
ОТНЮДЬНЕМИФ
Мырассмотрелинесколькоинтересныхпримеров, которыенаглядно демонстрируют, чтопрокачкаобычныхпрограммспомощьюсокс-сервера
— вовсенемиф. Правда, вразделе, посвященномпрокачкебраузера, мы некоснулисьситуации, когдаемуприходитсяработатьпоhttps. Ситуация довольносложная, ирешениевстатьенепоместится, поэтомуяограничусь намекомнаскрипт, позволяющийобходитьограничение. Имяемуsslstrip, и онбылописанв12-мномеренашегожурнала.
Кстати,мывсеждемоттебяобратнойсвязи!Чтотебеинтересно?Какиетемы тынампредложишьраскрыть?Мы—твоирабы,приказывай,повинуемся:). Конечно,идейунассЛозовскимещевагон,нохотелосьбыиметьпредставлениеотом,чтоинтересноименнотебе.Ждемписем:spirt40@gmail.com!z
XÀÊÅÐ 08 /128/ 09 |
101 |
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
E |
|
|
|
|
|
|
|
||||
|
|
|
X |
|
|
|
|
|
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
|
|
|
|
|||
|
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|||||
++++ BUY |
>>m |
coding |
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|||||||||
w Click |
to |
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
||
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
++++
++++
++++
++++
++++АЛЕКСАНДР ЭККЕРТ
/ALEKSANDR-EHKKERT@RAMBLER.RU/
++++ПРОАКТИВНОЕ
++++ДИЛДОДЛЯ
++++ВИРУСОПИСАТЕЛЕЙ
++++Низкоуровневаязащитаотвредоносного
кодавдомашнихусловиях
|
|
|
|
|
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 |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
++++
++++
++ ++
Вэтойстатьеречьпойдетотом, как, имеяподрукойWinDDK иобладаянекоторыминавыкамипрограммирования, можнозакороткий сроксоорудитьвполнеприличнуютулзу, защищающуюсистемные файлыипроцессыWindows отинтимногообщениясвирусами.
|
|
АНАЧАЛОСЬВСЕСCONFICKER’A |
гость. Однаконаэтотразмненеповезло. Всеначалосьстого, чтонис |
|
|
||
|
|
Да-да, червь, которыйзаразилсвыше10 млн. компьютеровповсемусвету, |
того, ниссегосошибкойзаписипамятиначалвылетатьsvchost.exe. Для |
++++необошелсторонойимоюмашину. Рискнувызватьбурюэмоцийвсвой стабильноработающеймашины— исключительнаяредкость. Этосразу
|
|
адрессосторонывоспитанных«продвинутых» пользователей— яне |
менянасторожило, побудивпрошерститькомпнапредметподозрительных |
|
|
|
пользуюсьантивирусами, предпочитаяобходитьсясобственнымисилами |
файловизаписейвреестре. Ядаженесомневался, чтозаразаявилась |
|
|
|
исоблюдаяправилаличнойгигиены. Вслучаезараженияявылавливаю |
посредствомавтозапускасзараженнойфлешки(умнаямысльотключить |
|
++++ |
заразусамостоятельно, неприбегаякпомощиантивирусногософта. Поче- |
автозапусксUSB-носителей, пришла, каквсегда, опосля). |
||
|
|
муясчитаюантивирусыплохойзатеей? Ответнаэтотфилософскийвопрос |
Впроцессеорганизованногопоисказаразыподозрительныхехе’шниковяв |
|
|
|
ищивкнигемногоуважаемогоКрисаКасперски«Запискиисследователя |
системенеобнаружил.Этонавеломенянамысльонекоейdll,незаметнопод- |
|
|
|
компьютерныхвирусов» вглаве«Почемуантивирусысталиплохойидеей». |
груженнойводинизсистемныхпроцессов.Подумано-сделано,иприосмотре |
|
++++ |
||||
Ясеговыводамиабсолютносогласен. |
директорииsystem32искомаяdll-кабылалокализована.Удалениеоказалось |
|||
|
|
Врезультате, несмотрянато, чтояобычносижуподадминскимаккаунтом |
невозможнодажевбезопасномрежиме,чтоговорилоотом,чтоонауспешно |
|
|
|
(правильно, ачегомелочиться?) вирусынамоемрабочемкомпе— редкий |
грузитсяводинизосновныхсистемныхпроцессов—svchost.exe. |
++++ |
102 |
XÀÊÅÐ 08 /128/ 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 |
|
|
|||
>> coding |
|
|
to |
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
СИСТЕМНЫЕ ФУНКЦИИПЕРЕХВАЧЕНЫВИРУСОМ |
|
|
ВооружившисьутилитамиотSysinternals, япостаралсяпроанализиро- |
этогопоказалосьмало, иярешилнаскоруюрукунаваятьнечтобольшее, |
|
ватьдействиязаразы. Иобнаружил, чтоdll-каскрываетсебяизсписка |
посколькунадежнозащититьсистемныефайлыперехватомоднойтолько |
|
загруженныхвадресноепространствопроцессовпутемпатчадвусвязного |
LdrLoadDll врядливозможно. Впорывевдохновенияядобавилпере- |
|
спискавPEB’e (подробноэтатехникаописанавмоейжестатьевмайском |
хваттакихсистемныхвызовов, какNtOpenProcess, NtWriteVirtualMemory |
|
z, поэтомупросмотрщикитипаPETools здесьнепомогут. Непомоглаиути- |
иNtReadVirtualMemory иещепарочкидругих. Врезультате, получилась |
|
литкаListDlls отSysinternals, позволяющаяпросмотретьвсезагруженные |
самопальнаяпроактивнаязащитасистемныхпроцессов. Можнодобавить |
|
впроцессбиблиотеки. ИтолькомаленькаятулзаHandleViewer показала |
ограничениедоступакреестру, нотакойцелияпередсобойнеставил. |
|
хендлlepujmlx.dll, загруженныйвsvchost.exe. Этабиблиотека, какпотом |
Изначальноможнобыло, конечно, найтихендлзловреднойбиблиотеки |
|
выяснилось, создавалалевыезаписивреестре, позволяющиеейвыжить |
ипонемувыгрузитьеечерезFreeLibrary, номнепоказалось, чтоэтого |
|
всистеме. |
недостаточно. Чемпостоянноискатьивыгружатьизпроцессаневестьот- |
|
Какследствиеработыэтойзаразы, яполучилперехватнесколькихси- |
кудавзявшуюсябиблиотеку, прощесделатьтак, чтобыонатудавообщене |
|
стемныхфункцийвntdll.dll, атакжефункцийдляработысинтернетом, что |
грузилась. |
|
приводилоктотальномуобломуприпопыткепосещениясайтов, посвя- |
Этиммыизаймемся. Кактызнаешь, загрузкаdll вадресноепространство |
|
щенныхкомпьютернойбезопасности. Мелочь, анеприятно. Мегамощная |
чужогопроцессаобычнопроисходитчерезвызовCreateRemoteThread. |
|
|
|
|
вещь— RKUnhooker — показалапоявившиесявсистемеперехваты. |
Примернотак: |
|
Промучившисьнесколькоднейсбесплатнымиутилитамиотизвестных |
|
|
антивирусныхбрендов, выпущенныхспециальнодляудаленияConficker’a |
hProcess = OpenProcess(...); |
|
(типаKidoKiller ОтKAV илиEConfickerRemover отESET), япришелквыводу, |
LibFileRemote = (PWSTR) VirtualAllocEx(hProcess...); |
|
чтокардинальныхрешенийниодноизопробованныхсредствнепред- |
WriteProcessMemory(hProcess, LibFileRemote, ...); |
|
лагает, посколькунатотмоментониограничивалисьудалениемlepujmlx. |
PTHREAD_START_ROUTINE fnThreadRtn = |
|
dll ипарочкидругихфайлов, атакже— чисткойреестра. Всеэтохозяйство |
(PTHREAD_START_ROUTINE) GetProcAddress( |
|
работалотольковтечениепервогочаса, затемисторияповторялась— не- |
GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); |
|
известныйпроцессмаппилвsvchost.exe вышеуказаннуюlepujmlx.dll, и |
|
|
системавновьвозвращаласькзараженномусостоянию. |
hThread = CreateRemoteThread(hProcess, NULL, 0, |
|
Перезагрузкавбезопасномрежиметожепроблемынерешила— dll все |
fnThreadRtn, LibFileRemote, 0, NULL); |
|
равноподгружаласьвsvchost.exe иудалитьеебылоневозможно. |
|
|
|
|
|
ЧитатьманыобочисткесистемыотConficker’a, которыеможновизобилии |
LdrLoadDll всвоюочередьсводитсякнеэкспортируемымвызовам |
|
найтинабескрайнихпросторахинтернета, нехотелось; устанавливатьтя- |
LdrpLoadModule иLdrAttachProcess, которыепростопроецируютзагружае- |
|
желуюартиллериюввидеантивирусногопакета— темболее. Воттогда-то |
муюбиблиотекувадресноепространствоцелевогопроцесса. |
|
мнеипришлавголовумысльнаписатьчто-тотипасобственнойпроактив- |
Отлично, теперьпостараемсямаксимальноосложнитьжизньвсякимвиру- |
|
ки, защищающейсистемныефайлыипроцессыотвнедренияпостороннего |
сописателямизаставимсистемусоветоватьсяснамиприпопыткезагрузки |
|
кода. |
стороннихбиблиотек. |
САМСЕБЕАНТИВИРУС
Решениенапрашивалосьсамособой: все, чтонужносделать, — запретитьзагрузкустороннихdll всистемныепроцессы. Легчевсегоэто осуществитьпутемперехватасистемнойфункцииLoadLibrary или, чтоеще лучше, LdrLoadDll. Этивещияреализовалввидедрайвера, однакомне
СТАВИМПОДКОНТРОЛЬЗАГРУЗКУDLL
Главнуюсмысловуюнагрузкувнашемкоденесетперехватсистемной функцииLdrLoadDll, аосновнойпроблемой, стоящейпереднами, будет определениеадреса функцииLdrLoadDll втаблицеэкспортаntdll.dll. Вusermode этапроблемарешаетсянетрудно— достаточнонайтиntdll.
XÀÊÅÐ 08 /128/ 09 |
103 |
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
- |
|
|
|
|
|
d |
|
|
|
|
|
|
|
|
|
|
|||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
||
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
|
P |
|
|
|
|
|
NOW! |
|
o |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
++++ BUY |
|
>>m |
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
coding |
|
|
|
|
|
|
|
|
|||||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
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 |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
++++
++++ HTTP://WWW
links
•Длясовершенст-
++++вованиянавыков ковырянияядра Windows рекомендую кпосещениюфорумы
++++наrsdn.ru иwasm.ru.
•Многоважной иинтереснойинфы
опрограммировании
++++ядраWin содержится наntkernel.com.
++++
++++ |
INFO |
++ ++ info
Отключитьавтозапусквсехсменных носителейвWindows
++++можно, добавив вветкуреестра
HKEY_CURRENT_
USER\Software\
++++Microsoft\Windows\
CurrentVersion\
Policies\Explorer
ключ«NoDriveType
++++AutoRun» созначением0xff.
RKUNHOOKER ПОКАЗЫВАЕТУСТАНОВЛЕННЫЕ ДРАЙВЕРОМХУКИ НАSSDT
dll надискеиперехватитьеечерезвызовыOpenFile/ CreateSection/MapViewOfSection. Тожесамое, ноужепо-
средствомвызовааналогичныхядерныхфункций, можно сделатьвядре. Такимвотнехитрымобразоммысможемконтролироватьзагрузкубиблиотеквовсепроцессывсистеме (естественно, ведьntdll.dll поумолчаниюподгружаетсяво всепроцессы):
DWORD GetDllFunctionAddress( char* lpFunctionName, PUNICODE_STRING pDllName)
{
ZwOpenFile(...); ZwCreateSection(...); ZwMapViewOfSection(...);
...
dosheader = (IMAGE_DOS_HEADER *)hMod; //здесь мы парсим экспортную таблицу
...
for(i = 0;
i < pExportTable-> NumberOfFunctions; i++)
{
functionName = (char*)( (BYTE*)hMod + arrayOfFunctionNames[x]);
functionOrdinal = arrayOfFunctionOrdinals[x] + Base — 1;
functionAddress = (DWORD)( (BYTE*)hMod + arrayOfFunctionAddresses
[functionOrdinal]);
if (RtlCompareString(&ntFunctionName, &ntFunctionNameSearch, TRUE) == 0) return functionAddress;
}
return 0;
}
Драйвер, реализующийэтотперехватLdrLoadDll, тынайдешьнанашемдиске.
Существуетещеодин, неслишкомкрасивыйиэлегантный
способ. ОнпозволяетпроконтролироватьLdrLoadDll, но ужевконкретномпроцессе. Таккакмынаходимсявядре, тояненашелничеголучше, чемсделатьследующее. Вы-
зовомKeAttachProcess аттачимсявsvchost.exe инаходим PEB (Process Environment Block; какэтосделать, ятакже писалвмайскомz). Аужечерезнегополучаемуказатель наLDR_DATA_TABLE_ENTRY, которыйсодержиттакое поле, какModuleBaseAddress.
Идеятакова: найдемпоименибиблиотекиntdll.dll адрес еезагрузкивsvchost’e. Потом, используяэтотадрес, пропарсимтаблицуэкспортанапредметадресафункции LdrLoadDll. Итолькозатемподменимегонавызовсвоей функцииmyLdrLoadDll, котораябудетотслеживатьипресекатьзагрузкузловредныхбиблиотек. Неслишкомудобнои элегантно, новполнеработоспособно. Еслизнаешьспособ лучше— напиши, обсудим.
Итак, получаем:
Находимадресспроецированной вцелевойпроцессntdll.dll
ZwQueryInformationProcess(
NtCurrentProcess(), ProcessBasicInformation, &ProcInfo, sizeof(PROCESS_BASIC_INFORMATION), &Size);
pPeb = ProcInfo.PebBaseAddress; //хотя можно просто так: pPeb (PEB*)0x7FFDF000;
PPEB_LDR_DATA Ldr = pPeb->Ldr;
PLIST_ENTRY InitialEntry =
Ldr -> InitializationOrder.Flink;
PLDR_DATA_TABLE_ENTRY LdrDataTableEntry =
CONTAINING_RECORD( InitialEntry,
LDR_DATA_TABLE_ENTRY,
InitializationOrder);
PLIST_ENTRY LoadOrderListHead =
LdrDataTableEntry->LoadOrder.Blink;
Далеенамостаетсятолькопропарситьполученныйсписок напредметименибиблиотекииадресаеезагрузки.
++++ |
104 |
XÀÊÅÐ 08 /128/ 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 |
|
|
|||
>> coding |
|
|
to |
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
НАШАПРОАКТИВНАЯЗАЩИТА ВДЕЙСТВИИ
ПЕРЕХВАТФУНКЦИЙДЛЯРАБОТЫ СВИРТУАЛЬНОЙПАМЯТЬЮ
Такихфункцийнесколько— ZwWriteVirtualMemory, ZwReadVirtualMemory, ZwOpenProcess, ZwDuplicateObject, ZwQueryInformationProcess иZwProtectVirtualMemory. Эти системныефункцииявляютсяосновнымиприманипуляцияхсадреснымпространствомпроцесса. Наихперехватеи отслеживанииихвызовапостроенаработавсякойуважающейсебяпроактивнойзащиты. Необойдемэтисистемные вызовыимы. Сейчасяпокажу, какподручнымисредствами организоватьконтрольихвызовов. Естьдваспособа: перехватитьвUsermode иливядре, пофиксивнепосредственно таблицуэкспортаntdll.dll, илипоступитькакнастоящие профессионалы— найтиKeServiceDescriptorTable (только неспрашивай, чтоэтотакое, атоявтеберазочаруюсь). Сам перехватможносделатьлибоподменойадресавызова, либоспласингомфункции.
ПЕРЕХВАТKESTACKATTACHPROCESS
Нуинапоследок, дляуспокоениясовести, можнореализоватьперехватядернойфункцииKeAttachProcess или,
какрекомендуетMicrosoft, KeStackAttachProcess, чтобы предотвратитьинжекткодаилиманипуляцииспамятьюиз ядра. Вызовэтойфункциииздрайвераобеспечиваетаттач самогодрайверакадресномупространствуцелевогопроцессаиисполнениеегокода.
ЭтафункциянеэкспортируетсяизSSDT ичтобыее перехватить, нужнолибопропарситьтаблицуэкспортаядра, либовызватьтакуюнехитруюядерную функцию, какMmGetSystemRoutineAddress. Оней,
кстати, оченьчастозабывают: PVOID func_addres = MmGetSystemRoutineAddress( &ApiNameUnicode ). Функ-
циявернетнамееадрес. Чтоснимделать, думаю, тыуже знаешь. Частобывает, чтосамыевкусныеиинтересные функцииядраWindows простонеэкспортируются. Вэтом случаеMmGetSystemRoutineAddress вернетNULL.
ОТМЕТАЯВОЗРАЖЕНИЯ
Предвижумассувопросовивозражений: мол, проблему можнорешитьдругими, болеелегкимипутями. Возможно. Номнехотелосьсоздатьнекоеуниверсальноерешение, позволяющееобеспечитьзащитусистемныхпроцессовот
ТАСАМАЯDLL-КА
внедренияпостороннегокода. Стоитдобавить, чтосуществуетещеоднодостаточнонетривиальноеиэлегантное решение, нацеленноенаконтрольпроцессоввсистеме. Речьидетоперехватетакойсистемнойфункции, как NtAdjustPrivilegesToken. Онаиспользуетсядляполучения привилегийотладки, иконтроляеевызоваиногдабывает достаточнодляблокировкидоступаксистемнымпроцессам. Уверен, чтопослепрочтениястатьи, тылегкосможешь реализоватьэтуидеюсам.
В конце хочу еще раз напомнить, что программирование в ядре сродни собиранию «кубика-рубика» в темноте
— из-за затруднений с отладкой драйвера. Поэтому на первых порах тебе не раз придется лицезреть BSOD. Ну а для его анализа и, как правило, отладки драйвера, нужен WinDBG и какой-нибудь ядерный отладчик.
Я, к примеру, пользуюсь Immunity debugger’om, что,
впрочем, дело вкуса. Удачного компилирования и да пребудет с тобой Сила! z
DVD |
dvd
Надискетынайдешь сорцыдрайверов, реализующихперехват основныхсистемных функций, тулзыибонусныедоки, которые помогуттебевпрограммировании.
XÀÊÅÐ 08 /128/ 09 |
105 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
>>m |
|
||||
w Click |
to |
|
|
|
|
phreaking |
|||||
|
|
|
|
|
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
||
|
|
|
df |
|
|
n |
e |
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
АНАТОЛИЙ «LOCKDOG» ЗИМИН / LINE3D@YANDEX.RU / |
ТВОЙ |
ЭЛЕКТРОННЫЙ |
ДРУГ |
Создаемроботавдомашнихусловиях |
|
|
|
|
|
|
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 |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Собратьпростогороботаможетлюбой, ктоумеетправильнодержать паяльникврукахидляэтогоненужноглубокихзнаний(хотяониине помешают). Любительскоероботостроениемалоотличаетсяотсхемотехники, толькогораздоинтереснее, потомучтотутзатронутытакие области, какмеханикаипрограммирование. Всекомпонентылегко-
доступныистоятнетакуждорого.
>> phreaking
ПРОГРЕССНЕСТОИТНАМЕСТЕ
Чтотакоеробот? Вбольшинствеслучаев— этоавтоматическоеустройство, котороереагируетнакакие-либодействияокружающейсреды. Роботымогутуправлятьсячеловекомиливыполнятьзаранеезапрограммированныедействия. Обычнонароботерасполагаютразнообразныедатчики(расстояния, углаповорота, ускорения), видеокамеры
иманипуляторы. Электроннаячастьсостоитизмикроконтроллера(МК)
—микросхемы, вкоторуюзаключеныпроцессор, тактовыйгенератор, различнаяпериферия, оперативнаяипостояннаяпамять. Вмиресуществуетогромноеколичестворазнообразныхмикроконтроллеровдля разныхобластейпримененияиснимиможнособиратьмощныхроботов. ДлялюбительскихпроектовширокоеприменениенашлимикроконтроллерыAVR. Насегодняонинаиболеедоступны, ивинтернетеможно найтимногопримеровнаосновеэтихМК. Чтобыработатьсмикроконтроллерами, тебенужноуметьпрограммироватьнаассемблереилина C++ ииметьначальныезнаниявцифровойианалоговойэлектронике. В нашемпроектемыбудемиспользоватьC++. ПрограммированиедляМК малоотличаетсяотпрограммированиянакомпьютере: синтаксисязыка такойже, большинствофункцийпрактическиничемнеотличаются, а новыедовольнолегкоосвоитьиимиудобнопользоваться.
ЗАКУПАЕМСЯМАТЕРИАЛАМИ
Нашроботдолженуметьобъезжатьпрепятствия, тоестьповторять нормальноеповедениебольшинстваживотныхвприроде. Все, чтонам потребуетсядляпостройкитакогоробота, можнонайтиврадиотехническихмагазинах. Давайрешим, какнашроботбудетпередвигаться. Самым удачнымвариантомясчитаюгусеницы, которыеприменяютсявтанках, потомучтогусеницыимеютбольшуюпроходимость, чемколесаиими
удобнееуправлять(дляповоротадостаточновращатьгусеницывразные стороны). Поэтомутебепонадобитсялюбойигрушечныйтанк, укоторого гусеницывращаютсянезависимодруготдруга. Такойтыможешькупить влюбоммагазинеигрушекпоразумнойцене. Отэтоготанканужнатолькоплатформасгусеницамиимоторысредукторами. Остальноеможно смелооткрутитьивыкинуть. Такженампотребуетсямикроконтроллер. МойвыборпалнаATmega16 — унегодостаточнопортовдляподключениядатчиковипериферии, ивообщеондовольноудобный. Ещенадо закупитьнемногорадиодеталей(списоктыувидишьвоврезке), приготовитьпаяльник, мультиметрипрямыеруки.
ПРАВИЛЬНОЕПИТАНИЕ— ЗАЛОГЗДОРОВЬЯ
Микроконтроллербудетвыполнятьфункции«мозга», ноначнеммынес него, астого, какправильнокормитьнашегоробота, потомучтонаэтом обычноошибаютсяначинающиероботостроители. Чтобыроботработал нормально, нужноиспользоватьстабилизаторнапряжения. ЯпредпочитаюмикросхемуL7805 — навыходеонавыдаетстабильноенапряжение 5В, котороеинужнонашемумикроконтроллеру. Нотаккакпадение напряжениянаэтоймикросхемесоставляетпорядка2,5 В, кнемунужно подавать, минимум, 7,5 В. Вместесстабилизаторомиспользуютсяэлектролитическиеконденсаторы, чтобысгладитьпульсациинапряжения. В цепьобязательновключаютдиод, длязащитыотпереполюсовки.
ДЕЛАЕМПЛАТУСМК
Теперьмыможемзанятьсянашиммикроконтроллером. КорпусуМК
— DIP (такудобнеепаять) иимеетсороквыводов. НабортуестьАЦП, ШИМ, USART имногоедругое, чтомыпокаиспользоватьнебудем. На дискетынайдешьвсюсхемуробота, такчтовэтомразделемыостано-
106 |
XÀÊÅÐ 08 /128/ 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 |
|
|
|||
phreakingw |
|
|
to |
|
|
|
|
|
||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
МОЯПЛАТАУПРАВЛЕНИЯРОБОТОМ ТРИВАЖНЫХКОМПОНЕНТАРОБОТОТЕХНИКИ
СХЕМАДРАЙВЕРАДВИГАТЕЛЕЙ
ВАРИАНТУСТАНОВКИДАТЧИКОВНАРОБОТА
вимсятольконаобвязкесамогоМК. Рассмотримнескольковажных узлов. ВыводRESET (9-аяногаМК) подтянутрезисторомR1 к«плюсу» источникапитания. Этонужноделатьобязательно, иначетвойМКможет непреднамеренносбрасыватьсяили, прощеговоря— глючить. Также желательной, нонеобязательноймеройявляетсяподключениеRESET’а черезкерамическийконденсаторC1 к«земле». Насхеметыможешь увидетьэлектролитна1000 мкФ, — онспасаетотпроваловнапряжения приработедвигателей, чтотожеблагоприятноскажетсянаработемикроконтроллера. КварцевыйрезонаторX1 иконденсаторыC2, C3 нужно располагатькакможноближеквыводамXTAL1 иXTAL2.
Отом, какпрошиватьМК, ярассказыватьнебуду, — обэтомтыможешь прочитатьвинтернете. ПисатьпрограммумыбудемнаC++. Вкачестве средыпрограммированияявыбралCodeVisionAVR. Этасредаудобна новичкам, потомучтоимеетвстроенныймастерсозданиякода.
УПРАВЛЕНИЕДВИГАТЕЛЯМИ
Неменееважнымкомпонентомвнашемроботебудетдрайвердвигателей. Никогдаинивкоемслучаенеподключайдвигателинапрямую кМК! Вообще, мощныминагрузкаминельзяуправлятьсмикроконтроллеранапрямую, иначеонсгорит. Пользуйсяключевымитранзисторами. Длянашегослучаяестьспециальнаямикросхема— L293D. Вподобныхнесложныхпроектахвсегдастарайсяиспользовать именноэтумикросхемусиндексом«D», таккаконаимеетвстроенныедиодыдлязащитыотперегрузок. Ейоченьлегкоуправлятьи еепростодостатьврадиотехническихмагазинах. Выпускаетсяона вдвухкорпусах— DIP иSOIC. МыбудемиспользоватьвкорпусеDIP из-заудобствамонтажанаплате. L293D имеетраздельноепитание двигателейилогики, поэтомусамумикросхемумыбудемпитатьот стабилизатора(входVSS), адвигатели— напрямуюотаккумуляторов
(входVS). L293D выдерживаетнагрузку600 мАнакаждыйканал, аэтих каналовунеедва. Тоесть, кодноймикросхемеможноподключить двадвигателя. Но, чтобыперестраховаться, мыобъединимканалы,
|
|
|
XÀÊÅÐ 08 /128/ 09 |
107 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
|
|
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
>>m |
|
|||
w Click |
to |
|
|
|
phreaking |
|||||
|
|
|
|
|||||||
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 |
|
|
|
|
НЕОБХОДИМЫЕ
КОМПОНЕНТЫ
Вотсписоктого, чтотебе |
мкФх16Вх2 шт. |
ПРИНЦИПРАБОТЫДАТЧИКАПРЕПЯТСТВИЯ |
нужноприобрести: |
• диод1N4001 или1N4004 |
|
• ATmega16 вкорпусеDIP-40 |
• кварцевыйрезонаторна |
|
• L7805 вкорпусеTO-220 |
16 МГц |
|
• L293D вкорпусеDIP-16 х2 |
• ИК-диоды: подойдутлюбые |
|
шт. |
вколичестведвухштук |
|
• резисторымощностью0,25 |
• фототранзисторы, тоже лю- |
|
Втноминалами: 10 кОмх1 шт., |
бые, но реагирующие только |
|
220 Омх4 шт. |
на длину волны ик-лучей |
|
• конденсаторыкерамичес- |
Адреса магазинов, в которых |
|
кие: 0.1 мкФ, 1 мкФ, 22 пФ |
ты можешь все это купить, |
|
• конденсаторыэлектролити- |
нетрудно найти в интернете |
|
ческие: 1000 мкФх16 В, 220 |
— или напиши мне на почту. |
|
СХЕМАВКЛЮЧЕНИЯДАТЧИКОВ
СХЕМАСТАБИЛИЗАТОРАНАПРЯЖЕНИЯ
итогдапотребуетсяпоодноймикренакаждыйдвигатель. Отсюда следует, чтоL293D сможетвыдержать1.2 А. Чтобыэтогодобиться, нужно объединитьногимикры, какпоказанонасхеме. Микросхемаработает следующимобразом: когданаIN1 иIN2 подаетсялогический«0», ана IN3 иIN4 — логическаяединица, тодвигательвращаетсяводнусторону. Аеслиинвертироватьсигналы— податьлогическийноль, тодвигатель начнетвращатьсявдругую. ВыводыEN1 иEN2 отвечаютзавключение каждогоканала. Ихмысоединяемиподключаемк«плюсу» питания отстабилизатора. Таккакмикросхемагреетсявовремяработы, а установкарадиаторовнаэтоттипкорпусапроблематична, тоотвод теплаобеспечиваетсяногамиGND — ихлучшераспаиватьнаширокой контактнойплощадке. Вотивсе, чтонапервоевремятебенужнознать одрайверахдвигателей.
ДАТЧИКИПРЕПЯТСТВИЙ
Чтобынашроботмогориентироватьсяиневрезалсявовсеподряд, мыустановимнанегодваинфракрасныхдатчика. Простейшийдатчик состоитизик-диода, которыйизлучаетвинфракрасномспектре, ифототранзистора, которыйбудетприниматьсигналсик-диода. Принцип такой: когдапереддатчикомнетпреграды, тоик-лучинепопадаютна фототранзистор, ионнеоткрывается. Еслипереддатчикомпрепятствие, толучиотнегоотражаютсяипопадаютнатранзистор— тототкрывается, иначинаеттечьток. Недостатокдатчиковвтом, чтоонимогут по-разномуреагироватьнаразличныеповерхностиинезащищеныот помех— отпостороннихсигналовдругихустройствдатчикслучайно можетсработать. Отпомехзащититмодулированиесигнала, нопокамы этимзаморачиватьсянебудем. Дляначалаиэтогохватит. Нарисункеты увидишь, какправильнорасположитьэлементыдатчика, анасхеме— ихправильноевключение.
ПРОШИВКАРОБОТА
Чтобыоживитьробота, длянегонужнонаписатьпрошивку, тоесть программу, котораябыснималапоказаниясдатчиковиуправляла двигателями. Мояпрограмманаиболеепроста: несодержитсложных конструкцийивсембудетпонятна. Вотэтидвестрокиподключают заголовочныефайлыдлянашегомикроконтроллераикомандыдля формированиязадержек:
« ЧТОБЫ ОЖИВИТЬ РОБОТА, ДЛЯ НЕГО НУЖНО НАПИСАТЬ ПРОШИВКУ, ТО ЕСТЬ ПРОГРАММУ, КОТОРАЯ БЫ СНИМАЛА ПОКАЗАНИЯ С ДАТЧИКОВ И УПРАВЛЯЛА ДВИГАТЕЛЯМИ».
#include <mega16.h> #include <delay.h>
Нижеследующиестрокиусловные, потомучтозначенияPORTC зависят оттого, кактыподключилдрайвердвигателейксвоемумикроконтроллеру:
108 |
XÀÊÅÐ 08 /128/ 09 |