2008-11-27

Torrent to XML

В azureus/vulze есть замечательная фишка - импорт и экспорт торрентов.
Интересно было поставить флажок private на торрент - не пересчитывая хеш многогигабайтной раздачи.
На самом деле это было просто - был нюанс - требовалось удалить строчку с infohash - она не входит в итоговый торрент-файл, но вызывает сообщение об изменении секции info.

Исходники не понравились, зато догадался поискать внимательнее в CPAN.
Итог - несколько скриптов на одном "движке".
1. Скрипт torrent2xml или toXML.pl
#!/usr/bin/perl

use strict;
use Convert::Bencode qw(bencode bdecode);

use XML::Dumper;
use MIME::Base64;

undef $/;
foreach our $ARG (@ARGV)
{
open ARG;binmode ARG;$_=;close ARG;

my $t = bdecode($_);

${$t}{'info'}{'pieces'}=encode_base64(${$t}{'info'}{'pieces'},'');

$_= pl2xml($t);
s/ memory_address="0x[\da-f]+"//g;
open OUT,'>'.$ARG.'.xml'; print OUT;close OUT;
}


2. Скрипт xml2torrent или toTo.pl
#!/usr/bin/perl

use strict;
use Convert::Bencode qw(bencode bdecode);

use XML::Dumper;
use MIME::Base64;

undef $/;
foreach our $ARG (@ARGV)
{
open ARG;$_=;close ARG;
my $t = xml2pl($_);
${$t}{'info'}{'pieces'}=decode_base64(${$t}{'info'}{'pieces'});

my $name=$ARG;
$name.='.torrent' unless $name=~s/\.xml$//;

rename $name,$name.'~' if -f $name && !-f $name.'~';

open OUT,'>'.$name;binmode OUT;syswrite OUT,bencode($t);close OUT;
}


3. Общий скрипт "издевательства" над torrent файлами - добавляйте функциональность какую хотите.
#!/usr/bin/perl

use strict;
use Convert::Bencode qw(bencode bdecode);

undef $/;
foreach our $ARG (@ARGV)
{
open ARG;binmode ARG;$_=;close ARG;

my $t = bdecode($_);
# printf "%s: Processing %u bytes\n",$ARG,length($_);
my $mod=0;

${$t}{'info'}{'private'}=1, $mod=1 if ${$t}{'info'}{'private'} ne '1';
foreach my $key qw/private azureus_properties/
{
delete(${$t}{$key}), $mod=1 if exists ${$t}{$key};
}
if ($mod)
{
rename $ARG,$ARG.'~' unless -f $ARG.'~';

open OUT,'>'.$ARG;binmode OUT;syswrite OUT,bencode($t);close OUT;
print "Modified: $ARG\n"
} else {print "Unchanged: $ARG\n"}
}

Данная реализация убирает ключи private, azureus_properties вне секции info,
и в секции info добавляет флаг private.

Можно менять url анонсера, комментарии менять и делать другие нужные вещи..
Да. Не забудьте поставить модуль:
cpan Convert::Bencode

Сейчас думаю как бы интегрировать в торренты tiger-hash (TTH из DC++) и вообще сделать считалку torrent файлов :)
Для души..

2008-09-02

Google Earth

Добил таки сабж.
Теперь карты егойные кешируются.
Стандартная процедура из убунты - редирект из сквида на апач.
Апач вызывает скрипт докачки если не находит нужной картинки.

Плохо, конечно, что не проверяются актуальность карт..
В принципе задача достаточно проста.
Это можно делать в фоне - когда траффик или дешёвый или бесплатный :)

Вроде капчу периодически вылезающую научился правильно обнаруживать и перенаправлять юзера на страницу распознования :)

Теперь со всех сайтов где юзается карта можно брать данные из кеша :)

Здорово. Правда и кеш расположен неоптимально - разбивка только по масштабу.
Зато я научился преобразовывать адрес картинки в формате xyz в формат tXXXX.
Главное было понять суть координат.

Начинается с "t" (z=0). Это понятно.
Каждое приближение увеличивает разрешение в 2 раза.
Итого 4 квадрата на каждое приближение. Квадраты называются по часовой стрелке - q,r,s,t;

Итого первое приближение:
tq, tr
tt, ts
Координаты xy такие: (z=1)
tq (x=0, y=0), tr (x=1, y=0), ts (x=1, y=1), tt(x=0,y=1).

Выбираем, например, квадрат tr.
Он разбивается на квадрат:
trq, trr
trt, trs
Координаты xy такие: (z=2)
trq (x=1<<1|0=2, y=0), trr (x=1<<1|1=3, y=0), trs (x=1<<1|1=3, y=1), trt (x=1<<1|0=2,y=1).

И так далее.

Как обычно - процедурки на перле чтобы это делать:

sub XY2T{my $r='';my ($x,$y,$z)=@_;
for (my $i=0;$i<$z;$i++){my $a=($y&1)<<1|($x&1);$x>>=1;$y>>=1;$_=$a.$_}
tr/0123/qrts/;"t$r"}

sub T2XY{my $r=$_[0];my ($x,$y,$z)=(0,0,length($r)-1);tr/qrts/0123/;
for (my $i=0;$i<$z;$i++){my $a=substr($r,$i+1,1);$x=$x*2+($a&1);$y=$y*2+($a>>1);}}

printf "Str: %s\n", XY2T(20007,10426,15);
printf "Dst: x=%u, y=%u, z=$u\n", T2XY('trtqsrrqtqsttrsr');
Вот вроде и всё что я хотел сказать :) А теперь домой.. По разведанным местам :)

2008-08-20

K3

Наконец то сабж побеждён. Только что закончил добавление последней фичи - жизненно необходимой для штатной работы всех последующих комплектов. Теперь прошивки ПЗУ читаются из блоков - и давно ожидаемый режим автоматического их обновления наконец то дописан.

Теперь дело осталось за малым - завтра отладить и решить наконец что за глюки творятся при калибровке. Надеюсь уже с утра мне расскажут что там с глюками в прошивке 12 комплекта - останется только отладить часть со считыванием ПЗУ.. Ура, товарищи! Скоро можно в отпуск.. Хотелось бы уже с прошлого понедельника - но не судьба..

ТМА01 оказалось в пролёте. Так что пока только спать - ибо давление уже давно не даёт голове спокойно наслаждаться победой. Спать - спать - спать. Ну может быть в бассейне ещё немного поплавать.. Ну или с женой чего замутить - если опять же будет у неё настроение :)
А пока до дома бы ещё доехать..

2008-07-21

Телефончик - настройки

Opera Mini, Bombus

Re: FAQ. КАК НАСТРОИТЬ GPRS-ИНТЕРНЕТ НА СИМЕНСАХ 55-60х МОДЕЛЕЙ


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

Судя по всему вам хочется интернет прямо с телефона. Думаю вам следует заполнить это:

1. Меню-Настройки-Передача данных-служба данных-"MMS,Wap" :
Данные CSD: ничего заполнять не надо
Данные GPRS: (галка стоит) :
Название: Int1
APN : wap
Имя : ничего заполнять не надо
Пароль: ничего заполнять не надо

2. Меню-Настройки-Передача данных-служба данных-"HTTP" :
Данные CSD: ничего заполнять не надо
Данные Gprs: (галка стоит) :
Название : MegaFon
APN : internet
Имя : ничего заполнять не надо
Пароль: ничего заполнять не надо
DNS1 : 000.000.000.000
DNS2 : 000.000.000.000

3. Меню-Интернет-Профили:
Название : MegaFon PRO
IP : 010.010.010.010
Порт : 9201
Стартовая страница : http://wap.megafonPRO.ru
Время работы GPRS : 5 минут
Время работы CSD : 30 секунд
Профиль соединения : Int1

4. Меню-Настройки-Передача данных-"HTTP-Профиль"
Провайдер : MegaFon
Время простоя : 300
Прокси отключен : Да
Прокси сервер : ничего заполнять не надо
Прокси порт : 8080
Имя польз. : ничего заполнять не надо
Пароль прокси : ничего заполнять не надо

Краткое пояснение. "Ничего заполнять не надо" означает, что данный пункт должен быть пуст. Группа настроек 1 и 3 обеспечивает работу встроенного браузера телефона, т.е. просмотр вап-страниц. При этом платить вы будете по расценкам вап-gprs согласно вашему тарифному плану (вероятно 2.5р/10кб). Группа 2 и 4 позволят выходить в интернет ява-приложеням (джим, опера-мини, и др.) с оплатой трафика по расценкам gprs-интернет согласно вашему тарифному плану (вероятно 7р/мб).

2008-07-02

SOCKS

Не так уж страшен чёрт, как его малюют.
Всё боялся этого слова. Как-то настраивал сабж через глобакс..

Оказывается всеми любимый ssh - его умеет делать нативно :)
ssh -D 0:1234 host
и мы имеем сокс :)

Ну и proxychains на него..
Правда, только socks4 - чё-то пятый не хотят..

2008-06-19

Code of Google

Вот. Теперь имеется такая штука - mcupdate. Велком :)

На McAfee глядючи

В принципе всё работает - обновления качаются ночью, теперь обновлений по 2 штуки (старые+новые).. Что-то иногда сбоит копирование (или создание файла) с заголовком license.txt - повторное ручное чтение всё проходит без сбоев. странно. Добавил отладки - посмотрим где порылась собака.

Формат шифрования пока не разобрал - то есть ни версию avv файлов не могу считать - ни расшифровать в линуксе epo файлы - ни зашифровать нигде их же.

Это к тому, что не получается (не копал если честно) никсом читать контрольные суммы в PkgCatalog.xml из cab архива. И уж тем более их создавать самому.

Последние наблюдения показывают, что cab файлы у них хитрые. Архиваторы принимают их на ура - а вот никсовый (грамотный) архиватор выдал предупреждение о мусоре в конце архива. Оказалось - там какая-то структура хиитрая.. Может её кто-то понимает для кабов.. Мкафя точно понимает - ибо матерится на чужие архивы недобрыми словами. Подпись там - точно говорю :)

Итак, что я вижу. Формат заголовка каба такой:

dd 'MSCF',  0,  dwCabSize, 0

Если скакнуть на его конец (seek dwCabSize, SEEK_SET), там окажется эта структурка.

dd dwSecSize(2ch), 'Network Associates Inc.', 0, 0, .., 0

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

dd 'TFU\0', dwSecSize(19ch) - это значит заголовок такой и размер секции дальше.

И в самом конце (ровно через 19с байт после этого заголовка) -

dd dwSecSize(2c) - и 2c байт остатка. После чего ничего уже нет.

Здоровая секция и последний кусок нечитабельны - и скорее всего и есть криптоданные. Приверженность НАИ pgp-sdk - подсказывает мне что есть в этом что-то от лукавого (то есть от Зиммермана)..

Будем копать дальше. Да, я не говорил, как оказывается сильно любит НАИ реестр :) Там много чего полезного можно почерпнуть.

Например так:

   @echo off
   set HOST=kad1
   reg add \\%HOST%\HKLM\SOFTWARE\McAfee\VSCore\NVP /v DetectionExclusions /t REG_MULTI_SZ /f /d RemAdm-RemoteAdmin\0RemAdm-PSKill
   reg query \\%HOST%\HKLM\SOFTWARE\McAfee\VSCore\NVP /v DetectionExclusions 

2008-06-02

Формат Zip

Для создания архивов пришлось реверснуть формат Zip :) Никаких сложностей не вызвало - только вот, к сожалению, в отличие от рара (там где формат и алгоритмы кодирования заголовков прописаны в документации) значение некоторых полей непросто угадать. Да и не требовалось пока. Целью данного исследования стали архивы avvdat-xxx.zip с обновлениями мкафи. Внутри файл с текстом лицензии на 4 килобайта и три файла avv*.dat положенных без сжатия (ибо шифр не ксор как было раньше - хоть немного, но они тогда жались - теперь файлы реальный мусор). Надо всего лишь скачать заголовки файлов - можно обойтись одной tcp сессией менее полукилобайта.

Качаем Range: -22, Получаем - размер файла и адрес заголовка. (22 байта)
Качаем Range: заголовок. Получаем список и адреса заголовков (около 200 байт).
Качаем Range: 0-74,ххх-ууу,ааа-ббб - (ещё 200 байт).

Собираем вместе заголовки (которые придут нам в chunked-encoding) и файлы - проверяем сумму. Проблема в том, что сумма есть внутри зашифрованного каба. Ну cabextract то в никсах есть - но вот расшифровать без вайна (не реверся алгоритм) не получится. Опять хостинг в пролёте.

Кстати, хостинг переехал на 6 фряху :) а то задолбали своей 4.11 - ничё не пускалось. Теперь 7zip должен ожить. Да. Вот интересно, а если солид архивы рара содержат один и тот же файл в начале.. Обновления консультанта можно было бы ещё уменьшить :)

Обновления переехали на шахту. Небольшая доработка скрипта McUpdate, parse, Delta.ini - и ещё один скрипт на шахте - пересчёта контрольных сумм файлов.
Придумать бы как заставить апдейтера скушать gem файл.. хм.

2008-05-29

Обновления McAfee-2

Получилось-получилось :)
Жестоко поиздевавшись над McScript с Олей и Идой (сильные такие дэвочки) удалось подсунуть "самодельную" gdeltaavv.ini (точнее сложно было заставить принять правильный PkgCatalog.xml) . Однако лазейка нашлась - есть момент, когда распакованный файлик из полностью проверенного (подписанного) архива лежит беззащитный на диске. Остаётся его заменить - и он воспримется как родной. Вчера я пытался поломать место, где проверяется этот архив - удалось заставить скушать мой неподписанный и незашифрованный cab вместо PkgCatalog.z - однако проверка подписей всё испортила. Вместо слома алгоритма подписей - всего лишь замена файла после распаковки. Не очень здорово - но для целей однократно "подсунуть" нужные обновления - вполне годится.

Теперь найденная в скайнете версия 4244 обновилась до 4292 - которая уже есть в актуальной базе обновлений. Почему-то ночью не докачались обновления с 4290 до 4305..
Что-то я намудрил откуда их брать. Остатки хотел взять от наишников.. Но не взялось. Надо логи ночной скачки посмотреть. Ладно. Пара исправлений в gdeltaavv.ini и теперь актуальная версия 4292 а не 4305 :) Дообновимся завтра штатными средствами.
В ini файле зачем-то убрали размер файлов - однако контрольная сумма та-же самая - старые алгоритмы работают :) Сплошное издевательство над crc32.
use String::CRC32;
sub validate($)
{
open S,'<'.$_[0];
binmode S;
my $sum=crc32(*S) ^ -1;
close(S);
sprintf "$_[0] %04X,%04X %i",$sum>>16,$sum&0xFFFF,$sum;
}

sub validate_ini($)
{
open S,'<'.$_[0];
binmode S;
my $sum=crc32(*S,-1) ^ -1;
close(S);
sprintf "%s=%u",$_[0],$sum;
}

Спасибо немцам за хорошую накопительную (просто историческую) базу обновлений :)
Будем ломать дальше. Блин, откуда брать DateTime в каталогах - два часа бился над алгоритмом преобразования из unix time в мелкософтовское время - (злой Перл не умеет понимать 64-битные целые числа - спасибо Руби не оплошал) - а оказалось зря. Наишники отдают вместо времени модификации файлов - текущее.. Так что время файлов - всего лишь - когда немцы обновлялись. Причём и web и ftp отдают текущее. ИИС, блин.

2008-05-28

Обновления McAfee

Странно. Зачем-то поменяли формат антивирусных баз.
Copyright (c) Network Associates Inc. Olympus
Copyright (c) McAfee DAT file
Если раньше базы назывались
clean.dat
scan.dat
names.dat
То теперь
avvclean.dat
avvnames.dat
avvscan.dat
И обновления - целые называются avvdat-5304.zip вместо dat-5304.zip а инкрементальные 53035304avv.gem вместо 53035304.upd. Ну да, неплохо. Инкрементальные апдейты в 2-3 раза меньше стали. Сами базы 22 метра вместо 28 - немного поужались.

Но. Теперь алгоритм шифрования, блин, заново придётся изучать.. Если я уже сам без участия утилит/библиотек McAfee накладывал обновления на базы (всего то надо было научиться расшифровывать и зашифровывать базы, конвертировать upd файлы в rtp и запускать библиотеку rtpatch) - умел версии баз сам смотреть из файлов.. Всё же это придётся заново придумывать.. Ужос. Нах.

Наработки (недоделанных) обновлений для 8.0 весьма пригодились. В 8.5 они вытащили алгоритмы шифрования в отдельную библиотеку (naisign.dll) из внутренностей McScript.exe за что им моё личное спасибо. Шутники - это же надо было придумать назвать точку входа шифровальщика naisign_Reserved.

Шифровальщики эти Мкафевцы (наишники?) ещё те :)
Ещё со времён LWI со страшным шифром их lws скриптов: [tratSrcS] - [dnEcrS].
Перловский скрипт расшифровывающий [ScrStart] - [ScrEnd] даже переписывать на Си не захотелось. Зато наделали внутри ранних lwi.exe и mcurial.dll кучу переполнений :) Трудное детство - сколько там remote code execution можно было наделать.. Ух. Совершенно детская была бы задача. Только неактуально..

Итак, пока научился расшифровывать .McS файлы (текстовые скрипты) и .z файлы - оказавшиеся .cab архивами xml файлов (консольная прога имеется).

Опять учиться надо накатывать обновления. Ну и неплохо было бы обратно шифровать кабы в z файлы. Уффф..

Да - ещё несколько ссылочек на память. forum.ru-board.com, ftp-updater, update.nai.com.

2008-05-21

Переводы GPL

Какая то беда с этими переводами. Перевёл для себя yakuake - попытался отправить - и понял, как тут всё запущено.. Сам механизм ещё куда ни шло. msgfmt и т.п. весьма неплохое и удобное решение. Но вот сообщения на английском очень уж любят менять. Судя по изменениям текстов в yakuake - как никак пришлось 4 версии перевести..

Есть куча команд переводчиков опенсурса. Гном, опеноффис, КДЕ, лаунчпад трудятся..

Нормальных утилит не видно (или я с ними пока не разобрался). Куда годится, например, отсутсвие централизованной базы данных переводов. Пусть базы будут локальными - но готовые глобальные базы доступные для скачивания и локальной работы - очень бы пригодились. Даже нормального словаря (хотя бы единого словаря терминов) пока не обнаружил..

Лаунчпад не даёт вятынуть всё - по запросу отдают только по одному файлу .po да и то на почту - жесть. И без рекомендаций.. Зеркало svn kde как то странно работает.
Надо будет попробовать вытянуть все рекомендации из лаунчпада моими методами :)

2008-05-19

Долбанный автозапуск

Злые трояны пишут свой автозапуск внутри:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2

Прокси

Накопанный текст для LWP - с проксями, отладкой и т.д.
#!/usr/bin/perl -w
use strict;

use LWP::Debug qw(+conns);
local $ENV{PERL_LWP_USE_HTTP_10} = 1;
# мало помогает - лучше запускать скрипт с этим параметром
use LWP::UserAgent;
use LWP::ConnCache;

my $ua = LWP::UserAgent->new();
$ua->conn_cache(LWP::ConnCache->new());

#$ua->env_proxy;
$ua->proxy('http','http://127.0.0.1:3128');
$ua->agent("Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5");
#my $response = $ua->get(
'http://www.perlmonks.org');
#$ua->mirror($url,$file);
#$ua->head($url);

Конфиги прокси для SVN^ ~/.subversion/servers
[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
http-proxy-host = cdit
http-proxy-port = 3128
http-proxy-username = gimly
http-proxy-password = pass
http-compression = yes
Пока всё.

Начало

Попробуем систематизировать то что делаю. Потерянный час на восстановления патча к Yakuake 2.8.1 по синхронизации заголовка распологает :)
Патч накладываем так:
apt-get source yakuake
cd yakuake-2.8.1;patch -p1 here.patch;cd ..
apt-get source -b yakuake
sudo dpkg -i yakuake_2.8.1-1ubuntu2_i386.deb

Собственно патч такой:
diff -ru yakuake-2.8.1/yakuake/src/main_window.cpp yakuake-2.8.1.new/yakuake/src/main_window.cpp
--- yakuake-2.8.1/yakuake/src/main_window.cpp 2008-01-17 19:53:33.000000000 +0300
+++ yakuake-2.8.1.new/yakuake/src/main_window.cpp 2008-05-19 12:10:41.000000000 +0400
@@ -839,6 +839,7 @@
void MainWindow::slotUpdateTitle(const QString& title)
{
title_bar->setTitleText(title);
+ slotRenameSession(selected_id, title);
}
Вот и всё что я хотел сказать :)