Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги хакеры / журнал хакер / специальные выпуски / Специальный выпуск 56_Optimized

.pdf
Скачиваний:
17
Добавлен:
20.04.2024
Размер:
11.84 Mб
Скачать

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

60

CODING & HACKING

ТЕЛЕФОНОДОБЫВАЮЩИЙКОМБАЙН

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

Tony (tony@MadTanks.com)

 

w

 

 

 

 

 

 

 

o

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ÍÜ Ã È

-xcha

 

 

 

 

ТЕЛЕФОНОДОБЫВАЮЩИЙ

 

 

 

 

 

 

 

 

 

Ä Å

 

 

 

 

 

 

 

КОМБАЙН

 

Í Û Å

 

 

 

 

 

 

 

РУКОВОДСТВО ПО АВТОМАТИЗИРОВАННОМУ СОЗДАНИЮ

 

Ë Ü

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SMS-СПАМЛИСТА

 

Á È

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ì Î

 

 

 

 

 

 

 

юбой из нас наверняка находил в своем почтовом ящике рекламу увеличителя объема бюста. Эпопея email-спама

 

 

 

 

 

 

 

 

Ëдлится уже много лет, но прогресс не стоит на месте, и теперь эту прелесть можно получить не слезая с горшка

 

 

 

 

 

 

 

 

 

 

 

(некоторые организмы продолжают ваять SMS-поэмы даже там).

 

 

 

 

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

 

 

 

 

ПРОНУМЕРОВАНЫЙ Â ÌÈÐ

Итак, ты хочешь разослать по SMS рекламу революционных

прокладок с перышками, и тебе нужна база номеров мобильных телефонов. Оказывается, сделать такую базу не так уж сложно - было бы желание. В разных странах используют разные способы кодирования и записи телефонных номеров. У нас есть существенное ограничение: правильный номер должен состоять из 11-ти цифр: +7СССXXXXXXX. "+7" - это код нашей страны, ССС – три цифры кода оператора связи, и последние семь цифр - код абонента сети. Иногда пишут вместо "+7" цифру "8", что обозначает код выхода на междугороднюю линию. Вроде бы все просто, только есть одно жирное НО. Нет четкого следования стандартам записи номера: один и тот же номер может быть записан чертовски большим количеством способов, а в каком виде он хранится в файле - это вообще отдельная песня в четырех куплетах. Поэтому основной задачей поиска является анализ строки, содержащей номер телефона.

ХРАНИТЕ НОМЕРА В СБЕРБАНКЕ

Где пользователь может сохранить свой номер и номера телефонов своих друзей? В асе, почтовом клиенте, органайзере и кеше браузера. Но для того чтобы туда забраться, тебе придется попотеть, да и улов с одного клиента будет мал. Предпочтительнее вариант оптового поиска: службы знакомств, кадровые агентства и всевозможные сайты вакансий, газеты бесплатных объявлений и прочие места, где люди по собственному желанию (!) оставляют контактную информацию. Для поиска номеров можно использовать даже спам: там также может быть указан номер мобильного телефона. Твоя месть распространителю таблеток для похудания будет страшна. Не стоит забывать и о любителях халявы: сайт с бесплатными полифо-

ническими мелодиями от продюсеров "Бригады" и аналогичными картинками обеспечит тебе постоянный приток номеров. SMS-чаты, игры и анекдоты доставляются на указанный номер телефона, а о том, что их номера прямиком попадают в список рассылки, халявщикам лучше не знать. Прямо сей- час ты можешь попробовать наиболее простой способ добывания мобильных номеров. Скачай себе на диск один из сайтов с вакансиями (например, телепортом) и натрави на него программу, прилагающуюся к этой статье.

ИНСТРУМЕНТАРИЙ

Печально, но весь инструментарий для удаленной добычи номеров тебе придется писать самостоятельно. Правда, принципы работы у всех этих программ одинаковы, и они реализованы в утилите CellFinder. Что можно сделать с помощью этой утилиты? Просканировать любые файлы на предмет наличия в них записей с номерами мобильных телефонов. Номе-

Федеральные номера - найти проще, чем песок в пустыне

ра могут быть записаны в любом виде и с любыми разделителями. Номер должен начинаться на "+7" или "8", то есть должен быть записан либо в международном, либо в федеральном формате. Забегая вперед, скажу, что даже недалекий пользователь, совсем не напрягаясь, сможет масштабировать функциональность CellFinder по своему усмотрению. Программе в командной строке указываются три параметра: путь, по которому лежат файлы для сканирования, имя файла, в котором будет сохраняться список найденных телефонов, и опция, которая предписывает искать номера только в текстовых файлах. По умол- чанию сканируются все файлы в указанном каталоге и подкаталогах. "Хорошо, - скажешь ты, - а если я хочу просканировать машину другого че- ловека на предмет поиска номеров?"

Номер мобильника - в международном формате

Номер мобильника - в федеральном формате

ХАКЕРСПЕЦ 07(56) 2005

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

df-xchan

 

 

o

 

ПОИСК КЛЮЧЕВЫХ СИМВОЛОВ

 

.

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

//В векторе context находится содержимое файла vector<char>::const_iterator it, end;

it = context.begin(); end = context.end();

//Итерируемся по файлу в прямом направлении while( 1 )

{

//До тех пор, пока в нем находятся символы ‘8’ it = find(it, end, '8');

if( it==end )

break;

//Анализируем ту часть текста, где предположительно находится телефон ParsePhone( string( it, 32 ) );

//Продолжаем поиск в оставшейся части текста ++it;

}

Тогда придется писать троянец, кото-

не все подряд, а лишь те файлы, ко-

рый очень незаметно для пользова-

торые могут содержать номера теле-

теля будет сканировать его файлы

фонов. Еще, как вариант, можно поп-

(скажем почту, каталог аськи и кеш

робовать написать на php или perl

браузера). "Незаметно" означает,

сценарий, который работает авто-

что ты должен считывать каждый

номно и сканирует сайты с залежами

файл небольшими частями (скажем

номеров. Алгоритм поиска в этом

по 1024 байта), делая между кажды-

случае также ничем не отличается

ми шагами чтения паузу от десятков

от двух предыдущих случаев.

до сотни миллисекунд. Если ты счи-

 

 

 

тываешь файлы большими кусками

АЛГОРИТМ ПОИСКА

(или целиком), то лучше делать секу-

 

 

Теперь абстрагируемся от того,

 

 

 

 

ндную паузу. И считывать, конечно,

где искать номера телефонов, и бу-

Необходимо анализировать найденный кусок массива, длина которого составляет 32 байта и в котором через разделители записан номер.

АНАЛИЗ СТРОКИ, СОДЕРЖАЩЕЙ НОМЕР ТЕЛЕФОНА

//Выбираем из текста токены, разделяемые следующими сепараторами: "-;|() .:<>/\\,". string number;//Найденный номер телефона

typedef tokenizer<char_separator<char> > tTokenizer;

char_separator<char> separators("-;|() .:<>/\\,");//Возможные разделители между цифрами tTokenizer tokens(context, separators);//Создаем токены

//Итерируемся по всем найденным токенам

for (tTokenizer::iterator it=tokens.begin(); it!=tokens.end(); ++it)

{

//Если количество последовательно записанных цифр в номере перевалило за 11, значит, номер собран if( number.length()>=11 )

break;

//Проверяем, состоит ли токен только из цифр if( isDigit(*it) )

number += *it; else

return;

}

//Добавляем собранный номер телефона в предварительный список mCellList.push_back( number );

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

61

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

Ä Å Í Ü Ã È

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ì Î Á È Ë Ü Í Û Å

 

Анализировать такой номер можно только с помощью таблицы кодов операторов

дем считать, что у нас на диске уже лежит куча файлов, в которых записаны номера телефонов. Более того, чтобы не путать мух с котлетами, будем считать, что на вход нашему алгоритму попадает массив, в котором лежит содержимое файла. Первый шаг, который нам предстоит сделать - это найти в массиве места, где могут встречаться ключевые символы "8" или "+7". Код, который выполняет эту работу, смотри в листинге "Поиск ключевых символов".

Далее необходимо анализировать найденный кусок массива, длина которого составляет 32 байта и в котором через разделители записан номер. Почему я сделал такое допущение? В номере телефона всего 11 цифр, и вряд ли каждая цифра отделяется от соседних цифр большим количеством разделителей. Теперь мы должны вытащить из этих 32-х байтов десять цифр, идущих сразу после ключевых символов. Все остальные цифры игнорируются. Если найдено десять цифр, то это номер телефона, который нужно занести в предварительный список. Соответствующий код найдешь в листинге "Анализ строки, содержащей номер телефона". Анализ заключается в разделении строки

на токены – куски текста, между кото- »

А вот это, скорее всего, простой телефонный номер

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

Ì Î Á È Ë Ü Í Û Å

 

 

 

 

 

 

 

62 CODING & HACKING ТЕЛЕФОНОДОБЫВАЮЩИЙКОМБАЙН

рыми записаны разделители. Если в строке записан действительно телефонный номер, то токен будет состоять исключительно из цифр. Эти два шага (поиск и анализ) составляют первичный поиск номеров телефонов, или первичный фильтр.

После отработки этих шагов мы имеем громадный список телефонов операторов сотовой связи, междугородних стационарных телефонов, нестандартных номеров с количеством цифр, не равным 11-ти. И тут нужна вторичная фильтрация номеров: отбросить все номера, в которых больше или меньше 11-ти цифр, и простые междугородние телефоны. Если с нестандартными все понятно, то как нам определить, является номер мобильным или нет? Все очень просто: первые три цифры после ключевых символов являются кодом операторов мобильной связи. Количество кодов ограниченно, и их можно найти здесь:

http://mobilephone.pochta.ru/pages/def.htm.

ПРОГРАММА CELLFINDER

РЕГИСТРАЦИЯ ФИЛЬТРОВ

cFinder::cFinder()

{

//Регистрируем фильтры поиска номеров mFilterList.push_back( new cInternationalFilter ); mFilterList.push_back( new cFederalFilter );

}

Диаграмма классов CellFinder

 

 

 

 

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

 

 

 

 

Когда я начинал работу над этой программой, я четко представлял себе, что номер телефона может быть записан в любом виде и любом формате. Кроме того, задуманная мной программа должна была уметь работать с текстовыми и бинарными фай-

Проблемные номера отсекаются только по количеству цифр и коду оператора

Обычный номер, записанный в международном формате

лами произвольной длины. Понятно, что невозможно объять необъятное. Но можно разработать средство, легко позволяющее модифицировать себя и добавлять новую функциональность. В нашем случае это возможность добавлять новые фильтры, которые способны анализировать такие записи номеров, которые я не учел. Такая задача элегантно решается с помощью паттерна "Стратегия", который позволяет легко определять и использовать различные схемы поведения объектов [3].

Абстрактный класс iFilter определяет интерфейс фильтров телефонных номеров. Любой фильтр должен реализовывать этот интерфейс. Пока реализовано два фильтра, которые ищут номера, записанные в международном и федеральном формате в текстовом виде, то есть записаны ко-

Проблемные номера: верхний находится просто, а нижний указан без ключевых символов

ды символов цифр. Фильтры реализованы в классах cFederalNumberFilter и cInternationalNumberFilter. На вход фильтрам подается содержимое файла в виде массива байт: vector<char>. На выходе получается несортированный список найденных номеров. Работой программы управляет класс cFinder, который отвечает ЗА:

инстанцирование фильтров;

итерирование по всем файлам в указанном каталоге и его подкаталогах;

загрузку файлов в память;

обработку этих данных фильтрами и вторичную фильтрацию.

Под вторичной фильтрацией понимается отбрасывание нестандартных и междугородних телефонных номеров, сортировка массива, отбрасывание повторяющихся номеров. Если тебе хочется добавить свой собственный фильтр, то необходимо сделать следующие телодвижения: создать класс, реализующий интерфейс iFilter, и зарегистрировать этот класс в менеджере cFinder так, как это сделано в листинге "Регистрация фильтров".

Изменить процесс вторичной фильтрации телефонов можно с помощью метода cFinder::PostFilter(). На входе эта функция принимает только что найденный список телефонов, из этого списка она вырезает телефоны,

КЛОНДАЙК НОМЕРОВ ТЕЛЕФОНОВ

www.job.ru

www.rabota.ru

www.izrukvruki.ru

www.flirt.ru

ХАКЕРСПЕЦ 07(56) 2005

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

df

 

 

n

 

 

o

 

РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА

 

.

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

-xcha

 

e

 

 

 

 

 

 

 

 

 

 

 

 

Бьерн Страуструп. Язык программирования С++. Скотт Мейерс. Эффективное использование STL.

Гамма, Хелм, Джонсон, Влиссидес. Паттерны проектирования.

количество цифр в которых отлично от 11. Кроме того, она записывает все номера в международном формате (с использованием ключевых символов "+7"). После этого вызывается метод cFinder::CheckOperatorCode(), который проверяет три цифры после ключе- вых символов, и если они не являются кодом оператора, номер игнорируется. Правда, здесь я немного поленился и посчитал, что коды всех операторов начинаются с девятки, но ты можешь проверить все три цифры на их соответствие кодам операторов нашей необъятной.

ПОДВОДНЫЕ КАМНИ

На нашем диске ты можешь найти две версии исходных кодов программы (CellFinder, другая CellFinder STLPort). Они отличаются друг от друга лишь совместимостью с различными реализациями STL. Первая программа нормально компилируется любым компилятором языка C++ на платформе Win32. Вторая также компилируется любым компилятором, но не с любой реализацией STL. Штатная реализация STL MSVC++ 6.0 наотрез отказалась компилироваться с этим кодом, пришлось подставить STLPort (www.stlport.org). Все дело в итераторах буферизованного ввода, при помощи которых я читаю

файлы. Подробнее эта тема рассмотрена в [2] (Совет 29). Не забудь, чтобы у тебя использовался не штатный STL. Необходимо указать его путь в настройках компилятора перед путем к штатному (см. на рис. "Настройки компилятора").

//Этот код никогда не откомпилируется со стандартным STL MSVC++ 6.0

ifstream file( string(pathName+"\\"+findData.cFileName).c_str() ); istreambuf_iterator<char> dataBegin(file); istreambuf_iterator<char> dataEnd;

fileData.clear();

fileData.insert( fileData.begin(), dataBegin, dataEnd );

Для разбиения строки с номером телефона на токены я использую контейнер Tokenizer из библиотеки Boost (www.boost.org). Чтобы исходные коды программы откомпилировались, необходимо установить у себя эту библиотеку и настроить на нее свой компилятор - указать соответствующие пути для заголовочных и экспортных файлов. Boost - весьма мощная библиотека контейнеров, которые Комитет по стандартизации не решился включить в список стандартных контейнеров по тем или иным причинам, когда принимал стандарт STL. Поэтому их и объединили в отдельную библиотеку.

Те два фильтра, которые сейчас используются в CellFinder, работают как с текстовыми, так и с бинарными файлами.

Можно расслабляться – программа сама найдет за тебя все номера

63

Настройки компилятора

UNICODE

Те два фильтра, которые сейчас используются в CellFinder, работают как с текстовыми, так и с бинарными файлами. Главное - чтобы номер телефона был записан в текстовом формате (кодами символов). Эта программа обнаруживает номера телефонов в любых html-файлах. Также с ее помощью я находил номера в файлах, создаваемых The Bat и Outlook. Фильтры работают с любой MBCS-ко- дировкой (multibyte-chacter), поскольку коды символов цифр и разделителей меньше 128 (0x80). Если твои файлы сохранены в UNCIODE, необходимо учесть это в фильтре. Еще посоветую использовать wstring вместо string и преобразовывать входное для фильтра содержимое файла из vector<char> в vector<short>. Не забывай перед кавычками в строках ставить символ "L".

//MBCS

string context("Содержимое файла"); char_separator<char> separators("-;|() .:<>/\\,"); vector<char> fileData;

//UNICODE

wstring context(L"Содержимое файла"); char_separator<short> separators(L"-;|() .:<>/\\,"); vector<short> fileData;

ПОРТИРОВАНИЕ ПРОГРАММЫ

Код CellFinder кросс-платформен- ный, за одним небольшим исключением: итерации по файлам и подкаталогам указанного каталога реализуются с использованием функций Win32 API. Если ты хочешь портировать программу в Linux или любую другую не M$-ось, то, конечно, придется переписать код поиска файлов.

searchContext = FindFirstFile(string(pathName+"\\*").c_str(), &findData); while( FindNextFile( searchContext, &findData ) )

{

}

На этой торжественной ноте мы заканчиваем наш рассказ. Напоминаю, что все сказанное - в чисто образовательных целях, не применяй эти знания на практике. E

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

Click

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

-x cha

 

Ä Å Í Ü Ã È

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ì Î Á È Ë Ü Í Û Å

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

Ì Î Á È Ë Ü Í Û Å

 

 

 

 

 

 

 

64 CODING & HACKING РАЗВЛЕКУХАДЛЯКОДЕРА

Denis Mingulov (denis@mingulov.com; ICQ 119841948; www.mingulov.com)

РАЗВЛЕКУХА ДЛЯ КОДЕРА

СОЗДАНИЕ ТЕЛЕФОННОЙ ИГРЫ НА КОНКРЕТНОМ ПРИМЕРЕ

Âэтой статье мы расскажем, как происходит создание игры для мобильного телефона. В чем-то похоже на извращения игровых кодеров-одиночек конца 80-х, чем-то отличается от них. Главное то, что это популярно и

нравится нашим пользователям :).

 

 

 

 

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

 

 

 

 

 

Ä

ля начала определим-

 

ся, какую игру мы хо-

 

 

 

тим написать, какие

 

 

 

 

возможности будем ис-

 

 

 

пользовать, как взаи-

модействовать с игроком - в общем, что хочется получить в итоге? Для начала предлагаю выбрать какую-ни- будь аркаду, как представителя наиболее популярного жанра мобильных игр. Существует много специальных примеров, которые можно использовать, чтобы создать собственный вариант. Проще всего - использовать их для изучения, возможно, сделать чтонибудь базой будущей программы. Если желаешь собственной игре максимальной аудитории, пиши ее на Java 2 Micro Edition (J2ME), которую поддерживают большинство современных телефонов.

ЖЕСТОКИЕ ТРЕБОВАНИЯ

Для начала нам необходимо загрузить и установить Java 2 SE SDK 1.4.2 с сайта java.sun.com, а также J2ME MIDP API - оно есть, например, в Sun J2ME WTK. Как вариант, можешь взять Nokia Developers Suite for J2ME последней версии. Кроме того, желательно быть знакомым хотя бы с основами программирования на Java. Больше ничего не требуется, код программы можно писать в любом текстовом редакторе.

СТРУКТУРА ПРОГРАММЫ

Аркада. Простейшая выглядит так: глубокий космос, командир космического корабля, вооруженного ракетами класса "Космос-Космос", лавирует между астероидам разного размера, разрушая их до мельчайшей пыли и очищая окружающее пространство.

Какую структуру программы выбрать? Независимую, готовую к замене отдельных частей. Другими словами, будем работать с блоками. Посмотри на этот листинг:

public class Game extends MIDlet implements CommandListener;

public class Field extends Canvas implements Runnable; public class Slideshow extends TimerTask;

Профайлер - оптимизация программы

public class Geometry extends Object; public class Pool extends Object; public class Explosion extends Object;

public abstract class Mobile extends Object; public class Asteroid extends Mobile; public class Rocket extends Mobile;

public class Ship extends Mobile;

public class Scores;

Здесь:

Game - собственно мидлет, меню, формы и т.д.

Field - игровое поле, действие. Slideshow - различные экраны игры

(например лучшие результаты, управление).

Geometry - отдельный класс для различных вычислений.

Pool - хранилище всех объектов, находящихся на поле.

Explosion - взрыв после разрушения астероида.

Mobile - абстрактный класс для перемещаемого объекта, который может оказаться на игровом поле.

Запуск отладки с помощью WebSphere Studio Device Developer

ХАКЕРСПЕЦ 07(56) 2005

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

df-xchan

 

.c

 

ПОКАЗ СТАТИЧЕСКОГО ЭКРАНА

 

 

p

 

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

/* пример прорисовки титульного экрана

Используемые значения из Field: пытаемся получить шрифты с соответствующими атрибутами (маленький обычный и большой жирный):

public static Font smallFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL); public static Font bigFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE);

На самом деле в зависимости от реализации J2ME на устройстве, они могут оказаться одним и тем же шрифтом.

В текущем объекте вычисляем высоту этих шрифтов (для отрисовки по высоте): private static int _smallFontHeight;

private static int _bigFontHeight; static {

_smallFontHeight = Field.smallFont.getHeight();; _bigFontHeight = Field.bigFont.getHeight();

}

*/

public static void drawTitleScreen(Graphics g) { g.setColor(0x00000000); // выставляем черный цвет g.setFont(Field.bigFont); // выбираем толстый шрифт

// Рассчитываем x для вывода отцентрированной строки _asteroid

int x = (Mobile.width - Field.bigFont.stringWidth(_asteroid)) %26gt;%26gt; 1; // Также рассчитываем положение строки по вертикали

int y = ((Mobile.height - ((_bigFontHeight + _smallFontHeight) %26lt;%26lt; 1)) %26gt;%26gt; 1) + _bigFontHeight;

//и выводим строки на экран (название программы) g.drawString(_asteroid, x, y, Graphics.BOTTOM|Graphics.LEFT);

x = (Mobile.width - Field.bigFont.stringWidth(_field)) %26gt;%26gt; 1; g.drawString(_field, x, y + _bigFontHeight, Graphics.BOTTOM|Graphics.LEFT);

//меняем цвет и выводим те же самые строчки со сдвигом на один пиксел влево-вниз (фактически оттеняем выведенный текст).

g.setColor(0x008080FF);

x = ((Mobile.width - Field.bigFont.stringWidth(_asteroid)) %26gt;%26gt; 1) - 1; y += 1;

g.drawString(_asteroid, x, y, Graphics.BOTTOM|Graphics.LEFT);

x = ((Mobile.width - Field.bigFont.stringWidth(_field)) %26gt;%26gt; 1) - 1; y += _bigFontHeight;

g.drawString(_field, x, y, Graphics.BOTTOM|Graphics.LEFT);

//дальше выводим версию и информацию об авторе программы без "спецэффектов"

y += _smallFontHeight; g.setColor(0x00000000); g.setFont(Field.smallFont);

x = (Mobile.width - Field.smallFont.stringWidth(_byjfd)) %26gt;%26gt; 1; g.drawString(_byjfd, x, y, Graphics.BOTTOM|Graphics.LEFT);

y += _smallFontHeight;

x = (Mobile.width - Field.smallFont.stringWidth(_version)) %26gt;%26gt; 1; g.drawString(_version, x, y, Graphics.BOTTOM|Graphics.LEFT);

}

Об астероиде нужно знать его размер и положение в пространстве (в двухмерном простейшем представлении - как он наклонен относительно базовой фигуры).

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

65

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

Ä Å Í Ü Ã È

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ì Î Á È Ë Ü Í Û Å

 

 

 

 

 

 

 

 

 

 

 

 

 

Теперь информации достаточно - можно начать реализовывать первую версию игры (и не самую элементарную!), основываясь на этом плане.

Разберемся в деталях того, что нужно знать в каждом объекте. Любой движущийся элемент на экране - космические координаты и скорость движения. Об астероиде нужно знать его размер и положение в пространстве (в двухмерном простейшем представлении - как он наклонен относительно базовой фигуры). О ракете - направление ее движения, а также то, какое расстояние она уже пролетела (возможно, скоро она исчезнет). О косми- ческом корабле – опять же, его положение в космическом пространстве. Пока хватит.

БАЗОВАЯ ВЕРСИЯ

Что же делать в мидлете? Определить поведение программы. Запустить таймер, инициализировать генератор случайных чисел, создать все нужные объекты и установить меню программы. И приведу такой жестокий программный код (для краткости инициализация показана в той же строке):

public static Random random = new Random();

 

public static Field field = new Field();

 

public static Display display = Display.getDisplay(this);

 

private static Command _exitCommand = new

 

Command("Exit", Command.EXIT, 1);

 

field.addCommand(_exitCommand);

 

field.setCommandListener(this);

»

private static Displayable _currentDisplayable = field;

примера на- чального приложения используется Asteroid Zone от JeanFrancois Doue, распространяемая по лицезии GNU General Public License версии 2 (или выше).

По возможности используй буферизацию вывода на экран.

Asteroid, Rocket и Ship - астероид, запущенная ракета и сам космический корабль.

Scores - отдельный класс для сохранения информации о высших результатах, полученных в игре.

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

Ì Î Á È Ë Ü Í Û Å

 

 

 

 

 

 

 

Исходники программы ты можешь найти на нашем диске.

Если планируется сделать доступной игру на любых мобильных устройствах, нужно портировать ее для них (Symbian, Windows Mobile, BREW и т.д.).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P

 

 

 

 

 

NOW!

o

 

66

CODING & HACKING

РАЗВЛЕКУХАДЛЯКОДЕРА

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ

 

 

 

w

 

df

 

 

n

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

.c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

public static Timer timer = new Timer();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-x cha

 

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

display.setCurrent(displayable);

 

 

Желаешь поддержки виброзвонка и прочих наворотов?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Переопределяем pauseApp(),

 

Заведем отдельный класс для всех специальных эффектов и соз-

 

 

 

 

 

 

 

 

 

 

 

дадим его в зависимости от типа телефона.

 

 

 

 

 

 

 

 

 

 

 

 

 

destroyApp(boolean unconditional) è

 

 

 

 

 

 

 

 

 

 

 

 

 

startApp() (кстати, не забудь самосто-

Например:

class

GameEffects

ñ

методами

boolean

 

 

 

 

 

 

 

 

 

 

ятельно очистить за собой весь мусор

 

hasSoundCapability() и boolean hasVibrationCapability() для провер-

 

 

 

 

 

 

 

 

 

 

в случае выхода из приложения).

 

ки с return false по умолчанию.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В основном игровом цикле обяза-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

А вот пример для

Nokia

 

 

 

- äëÿ

вибры com.nokia.mid.ui.

 

 

 

 

 

 

 

 

 

 

тельно определим размеры доступно-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DeviceControl.stopVibra() è

DeviceControl.startVibra(100,

300)

 

 

 

 

 

 

 

 

 

 

го экрана и отрисуем все пропорцио-

 

 

 

 

 

 

 

 

 

 

 

нально так, чтобы дисплей всегда был

 

(100% вибрации на 300 миллисекунд). Для звука же

 

 

 

 

 

 

 

 

 

 

занят изображением полностью. По

 

com.nokia.mid.sound.Sound:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

возможности нужно использовать бу-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

феризацию: _buffer =

 

class NokiaGameEffects extends GameEffects

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Image.createImage(Mobile.width,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

com.nokia.mid.sound.Sound sound;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Mobile.height), а при прорисовке в

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

paint(Graphics g) сначала выбираем

 

// bytes - набор для проигрыша

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Graphics gr = (_buffer != null) ?

 

sound = new Sound(bytes, Sound.FORMAT_TONE);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

_buffer.getGraphics() : g, а после всех

 

sound.setGain(128); // громкость

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

действий - g.drawImage(_buffer, 0, 0,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sound.play(1); // 1 öèêë

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Graphics.TOP|Graphics.LEFT). Впрочем,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

проверка здесь не помешает: не ис-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пользуй offline screen, если телефон

 

Для того чтобы использовать действительно динамическую иници-

 

 

 

 

 

 

 

 

 

 

сам выполняет все необходимые

 

ализацию игры, при запуске нужно будет сделать вот так:

 

 

 

 

 

 

 

 

 

 

 

 

действия (DoubleBuffer). Изначально

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

нужно стремиться к тому, чтобы мо-

 

try

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

бильные объекты были простейшие –

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

обычные линии.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Перейдем к игровому циклу. Вот

 

Class.forName("com.nokia.mid.sound.Sound");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

длинный список того, что нужно про-

 

Class.forName("com.nokia.mid.ui.DeviceControl");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

контролировать:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

выяснить, попала ли какая-нибудь

 

// Если нет исключений, можно использовать эти API.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ракета в астероиды, и осуществить

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Class clas = Class.forName("NokiaGameEffects");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

взрыв;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

отследить перемещение асте-

 

return (GameEffects) clas.newInstance();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

роидов;

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

сделать то же с перемещением

 

catch (Exception e)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ракет;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

предусмотреть поворот и движе-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

// Использовать заглушку.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ние корабля;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

проверить, не погиб ли корабль;

 

return new GameEffects();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

досмотреть отображение текуще-

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

го состояния на экране сотового (нуж-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

но нарисовать фоновый экран, теку-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

щие очки и уровень игры, все астеро-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

иды, ракеты и космический корабль

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

или же вообще экран зала славы,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

например).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Для управления просто запоминай

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

нажатую клавишу и обрабатывай ее в

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

главном цикле.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Если выполнено все технически не-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

обходимое кодирование, то базовая

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

версия игры, которая будет идти на

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

большинстве сотовых телефонов, вы-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Трассировка приложения с помощью WebSphere

 

полняя заданные тобой функции, уже

 

получена.

 

ПОСТЕПЕННОЕ РАЗВИТИЕ

 

 

 

Посмотреть информацию о воз-

 

 

 

 

 

 

 

можности добавления к игре различ-

Nokia 770 Internet Tablet тоже поддерживает J2ME

ных зависимых от устройства приблу-

 

 

 

 

дов ты можешь на врезке "Дополнительные возможности". Но вначале лучше оценить и решить, что развивать дальше: общие возможности программы, ее структуру или же различные игровые аспекты.

ХАКЕРСПЕЦ 07(56) 2005

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

df

 

 

n

 

 

o

 

ОСНОВНЫЕ МОДЕЛИ МОБИЛЬНЫХ ТЕЛЕФОНОВ С J2ME

 

.

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

-xcha

 

e

 

 

 

 

 

 

 

 

 

 

 

 

Если ты хочешь провести тестирование на эмуляторах или на реальных устройствах, то ниже приведен ряд моделей с различной функциональностью:

Nokia 3100 - MIDP1.0/CLDC1.0 (типичный представитель) Nokia 6021 - MIDP2.0/CLDC1.1 (тоже типичный)

Nokia 6230i - MIDP2.0/CLDC1.1 (много дополнительных API)

Nokia 6630/6680 или Nokia 7710 - MIDP2.0/CLDC1.1/CDC (high-end) Siemens M55 - MIDP1.0/CLDC1.0 (для мидлетов память не ограничи- вает)

Siemens M65 - MIDP2.0/CLDC1.1 (есть новые API, Java 3D)

Sony Ericsson T610 - MIDP1.0/CLDC1.0 (довольно старый, как и Siemens M55)

Sony Ericsson K500i - MIDP2.0/CLDC1.1 (новые API)

Samsung C100, X100 - MIDP1.0/CLDC1.0 (очень распространен, хотя довольно неудобен для программиста)

67

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

Click

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

Ä Å Í Ü Ã È

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ì Î Á È Ë Ü Í Û Å

 

 

Запуск мидлета на эмуляторе

Для начала нужно напрячь внимание и заметить, что практически везде корабль управляется плохо. Что можно сделать для исправления ситуации? Можно сохранять нажатые клавиши во внутренний массив и обрабатывать сразу все нажатые клавиши либо ускорять перерисовку после получения значимого сообщения о произошедшем событии.

Если посмотреть еще внимательнее, то обнаружится, что космос в игре никак не обозначен: вакуум, пустота.

Лучше добавить какой-нибудь фон. Воспользуйся image = javax.microedition.lcdui.Image.createImage("/splash.p ng") (взять файл изображения) и при отрисовке просто нарисуй его.

Graphics g.drawImage(image, 0, 0, Graphics.TOP | Graphics.LEFT).

Точно так же и космический корабль, и астероиды, и ракеты можно заменить на спрайты. Стандартной функции поворота нет, да и наклон может выполняться долго, поэтому самый простой способ - завести несколько картинок для различных степеней поворота.

СОЗДАНИЕ ГОТОВОГО ПРОДУКТА

Сам процесс компиляции не отли- чается от обычного для Java-прог- рамм - запуск javac с правильным набором библиотек и списком файлов.

ССЫЛКИ ПО ТЕМЕ

Очень полезный сайт по Java (и J2ME) на русском языке: www.juga.ru

Основной сайт по Java: java.sun.com

Море информации по играм: www.gamasutra.com

От Nokia: все для разработчика: forum.nokia.com и Discussion

Board

Просто неплохой сайт для начинающих и не только: www.developer.com

SonyEricsson GameBoard EGB-10 - специальная панель для игр

Готовый JAR-файл отличается от обычной Java-программы тем, что в него добавлен манифест - различная информация о мидлете. Это файл META-INF\MANIFEST.MF, ниже представлены строки, минимально необходимые для него:

MIDlet-Name: Example - название программы MIDlet-Version: 1.0 - версия мидлета MIDlet-Vendor: Vendor - разработчик мидлета

MicroEdition-Profile: MIDP-1.0 - версия MID-профиля MicroEdition-Configuration: CLDC-1.0 - версия конфигурации

MIDlet-1: Example, icon.png, mypackage.Example - Имя, Иконка, Главный класс

Все это может быть сделано автоматически из какой-нибудь среды разработки. Обязательно заполняй все данные правильно.

РАСПРОСТРАНЕНИЕ

В результате у тебя есть готовая игра, которую ты хочешь сделать доступной для других людей. Продать саму программу целиком, распространять ее бесплатно или за деньги, позволить заплатить за нее с помощью платных SMS или по принципу Shareware – все по желанию. E

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

Ì Î Á È Ë Ü Í Û Å

 

 

 

 

 

 

 

68 CODING & HACKING ОХОТАНАГОЛУБОЙЗУБ

Крис Касперски ака мыщъх (no e-mail)

ОХОТА НА ГОЛУБОЙ ЗУБ

 

 

 

 

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

 

 

 

 

ПОДГОТОВКА И МЕТОДЫ АТАКИ

Ïоголовье bluetooth-устройств стремительно растет, обрушиваясь на рынок снежной лавиной. Реклама утверждает, что протокол передачи данных надежно защищен, но она легко расстреливается снайперской винтовкой с

расстояния в несколько километров. Хакеры уже давно ломают голубые зубы.

 

Ã

олубым зубом

 

(BlueTooth) оснащают-

 

 

 

ся сотовые телефоны,

 

 

 

 

наладонники, ноутбуки

 

 

 

и многие другие мо-

бильные устройства, что делает его заманчивым объектом для взлома. Хакер может осуществлять несанкционированное подключение к устройству, перехватывать трафик, отслеживать перемещение жертвы в пространстве или устраивать полный DoS. Уже зафиксировано несколько случа- ев взлома влиятельных лиц, и с каждым днем интенсивность хакерства повышается. Разработчики Голубого Зуба делают морду тяпкой и сваливают всю ответственность на производителей оборудования, которые гдето что-то криво реализовали. Производители в свою очередь наезжают на пользователей, выбирающих предсказуемые PIN'ы, не выключающих голубой зуб после каждого сеанса передачи и т.д. В общем, виноватых не найдешь, а между тем количество BlueTooth-устройств уже исчисляется сотнями миллионов (!), и все говорит о том, что несколько следующих лет пройдут под знаменем Голубого Зуба, реальных конкурентов которому пока не видно.

Вездесущий голубой зуб

Джон Херинг с ружьем BlueSniper, позволяющим сканировать и взламывать Голубые зубы в радиусе нескольких километров

На Голубом Зубе собираются домашние и мелкокорпоративные локальные сети, голубой зуб встраивается в клавиатуры, мыши, принтеры, часы и даже системы управления автомобилем. А это уже серьезно! Зверски спланированная операция может привести не только к утечке конфиденциальных данных, но и че- ловеческим жертвам. Эта статья не призывает ломать, мы просто хотим показать, насколько небезопасен голубой зуб, а доверять ему или нет - пусть каждый решает сам!

СУЩНОСТЬ ГОЛУБОГО ЗУБА

Голубой зуб представляет собой устройство, работающее в диапазоне частот от 2400 до 2483,5 МГц (а вовсе не 2,4 МГц, как думают некоторые). На этой же частоте работают микроволновые печи, беспроводные сети стандарта 802.11b/g, радиотелефоны и многие другие устройства, агрессивно конфликтующие между собой. Для решения этой проблемы голубой зуб использует специальный алгоритм скачкообразной перестройки частоты.

Весь частотный диапазон "нарезается" на 79 каналов с шириной в 1 МГц, и каждые 625 мкс (1600 раз в секунду) происходит смена канала, выбираемого по псевдослучайному принципу. Каждая такая порция вещания образует time-slot (тайм-слот), для простоты называемый слотом. Передаваемые данные разбиваются на пакеты по 2745 бит, каждый из которых "размазывается" по нескольким тайм-сло- там (до пяти слотов максимум).

Устройства взаимодействуют по схеме master-slave (хозяин-раб или ведомое и ведущее устройство). Один мастер может иметь до семи рабов, мастер вещает в четных слотах, а рабы -

âнечетных.

Поддерживаются два типа связи:

асинхронный (ACL - asynchronous connectionless) и синхронный (SCO - synchronous connection oriented). Синхронный режим преимущественно используется для передачи речи, асинхронный - для обмена данными. Рас- четная пропускная способность канала в асинхронном режиме составляет 1 Мбит/с, при этом заголовки и другая

ХАКЕРСПЕЦ 07(56) 2005