JS-морфер на Пітоні

9 Лютого 2011

Написав 2 місяця назад статтю в журнал Хакер. За останні 2 роки моїх статей було опубліковано близько 10, але лише десь 5-ть добре вийшли, і ця стаття відноситься до тих 5ти.

JS-морфер vs Тьма сигнатурная

Создаем гениально простой морфер на Python'е

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

Веб-модулю объявим мы войну! Что б навсегда нам уничтожить тьму!

О созданиях темной силы

Веб-модуль Антивирусов Тьмы сейчас зачастую работает на двух уровнях - на сетевом и на уровне браузера. Первый уровень это когда антивирус пропускает весь трафик на 80-ом порту через свои сигнатуры. Обход этого возможен через простое шифрование JavaScript'а тем же XORом. Второй уровень работает через встраивание тулбаров во все браузеры. Это дает возможность тьме посылать на сигнатурный чек JavaScript после окончания его расшифровки в браузере и делает криптование бесполезным. Наиболее опасный тулбар антивирей в Internet Explorer'е, ведь он дает полный контроль над страницей. Еще ко второму уровню относится эмуляция запуска скрипта внутри антивируса. Но на данный момент эта эмуляция настолько примитивная и бажная, что не хочется ребенка обижать. Да и эмуляция вообще тупиковая ветвь эволюции по многих причинах.

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

Далі...

Як писати резюме

5 Листопада 2010

Постійно слухаю Будама, який живе в Штатах і постійно записує підкасти про свій життевий досвід й розміщає їх на http://americhka.us/. Так ось в нього є дуже круті підкасти про те як складати резюме - я їх частенько згадую. По роду своєї діяльності в день як мінімум одне резюме доводиться читати і частенько просто хочеться плакати ). Тож вирішив написати декілька своїх рекоменадцій:

  • Якщо ви йдете на програміста, то не пишіть що знаєте Photoshop, чи Word чи інше те що зовсім не має справи до програмування.
  • Не пишіть що знаєте українську мову. Це й так розуміється для нормальної людини.
  • Ніколи, ніколи не присилайне резюме в форматі PDF. Краще текстового формата ще не придумали. Особливо цим грішать випусники ХІРЕ, бо їм це розповідаюсь якісь викладачі, що не наймали на роботу нікого ніколи в житті.
  • Не пишіть свій повний адрес з домом і квартирою, не збираюсь я вам в гості. Вкажіть лише район, чи вулицю, типу Харків, пр. Перемоги.
  • Не треба писати яку школу ви закінчили. Вистачить лише університет і спеціальність.
  • Не пишіть особисті якості. Ну це ж смішно коли пишуть розумний, компанійський, вмію співати...
  • Обов'язково перерахуйте проекти в яких брали участь. Навіть якщо ваш вклад невеликий в проекті, або якщо це якась домашня сторінка - все одно напишіть.
  • Дайте посилання на ваш код на якихось репозиторіях.
  • Не треба намагатися писати велике резюме. Хай краще це буде півсторінки та вони будуть конкретні і по справі!
І нехай HR за вами ганаються, а не ви за ними! :)

Продовжив робити блог на Пітоні і все записав для вас на відео. І виявилось що вже записано 3 години. За цей час було додано темплейт, РСС, перегляд головної сторінки, окремих сторінок і інше. Ще мабудь 2-3 години і Друпал повністю заміню на написаний двіжок.

PS1: код - http://bitbucket.org/presidentua/blog
PS2: відео нижче, або на сторінці - http://www.youtube.com/user/iamspiritua

Далі...

Привіт Друзі!

Скрінкасти гарна штука, та в них не зовсім правильно відображається реальний процес програмування. Скрінкаст показує якийсь результат і розповідає про цей результат. Реальне програмування зовсім інше, я в день перериваю десятки блогів, постійно працюю с різноматінтими технологіями, і рідко памятаю якісь конструкції. Моє програмування це в більшості контр-копі зі старих моїх проектів чи з Гугла. Зі сторони це можливо здається неправильно, чи просто занадто просто, але при тому об'ємі інформації що є зараз це на мою думку єдиний вихід. Та я знайшов заміну скрінкастам, який не матиме тих проблем, хоча буде мати інші проблеми.

Дивлячись стріми з чемпіонатів по СтарКрафт2 подумав чому б не стрімати процес програмування. Звичайно це не так цікаво як СтарКрафт2, але надіюсь такі стрими допоможуть комусь.

Спочатку стріми буду писати оффлайн і викладати на ютубі, а якщо вони прийдуться вам до вподоби, то можна б зробити онлайн стріми з чатом, де буде можливість як задати запитання, так і уточнити незрозумілі речі.

Щодо тем, то найближий час буду стрімати наступне:
1. Написання блогу на Джанго, імопорт записів до нього з Друпала, і налаштування все на серваку.
2. Написання міні-сервісу по онлайн генерації MAC-адресів на http://flask.pocoo.org/
3. Написання плагіна для Хрома по збереженню паролів.

Під час стрімів я наврядчи буду чітко щось розповідати, принаймі на перших стрімах - досить складно одночасно думати й розповідати ). Тож при перегляді вмикайте свою улуюблену музику. Проблема стріму - час, хоча з технологіями перемотки відео, або збільшення його швидкості - це не суттєво.

Перед лінками на відео маленька питання, хто їде на конфу по Пітону в Київ 23 і 24 числа? Напишіть будь-ласка. Якщо їдете з Харкова - буде прикольно разом в поїзді обговорити цікаві Пітонські проблеми. А хто буде на самій конфі, то також напишіть мені - обміняємося телефонтами - там стусимо.

Далі...

Колись давненько я писав маленький пост про IE8 і приватність. Згодом на основі нього вийшла статтейка в Хакері


Штирлиц-Режим и новый Ослик

Исследования приватного режима Internet Explorer 8

Отгадайте старую, но вечную загадку: "Штука, а в ней дыра, а в дыре дыра, а в дыре еще одна дыра"... Конечно же, вы абсолютно правы - это Internet Explorer. И сегодня мы в этом убедимся.

Я обожаю MicroSoft - честное слово пионера. Всегда юзал винду, и сейчас даже лицензию купил на семерку. Но у меня сложилось такое чувство, что умные люди в Майкрософте пишут Windows, а кого Бог немножко обделил - тот отправляется писать "самый крутой" браузер, такой, что даже круче чем Игорь Крутой. Они уже этот IE пишут 15 лет, а как было фигней, так ею и осталось. Мы пропустим исследования динозавров IE 6 и 7 - там и без нас ребята постоянно находят баги. А посмотрим на "венец совершенства" на славный Internet Explorer 8. Хватит лирики, вперед к исследованию!

Далі...

Ручной Wave Робот

8 Березня 2010

Моя стаття з січневого випуску Хакера про wave. Хоча зараз ажіотаж трішки з Хвилі зійшов, але гадаю цей сервій ще буде розвиватися.

Ручной Wave Робот

Написание робота на Python'е для Google Wave

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

Google Wave получил хороший пиар, и думаю в сим мире не сыскать того, кто не слышал о нем (не считая, соседа Толика, который в запое;)). Хотя этот пиар может даже немножко повредил Волне, поскольку привозносил сие творение как убийца почты, форумов, и чуть ли не всего интернета. Как для меня же, Волна это достаточно классно сделанная IRC с кульным API. С помощью которого мы можем создавать любые гаджеты и, что более интересно, любых роботов, которые могут расширять возможности Wave под любые нужды. И наличие этого API поднимает планку Волне очень высоко. Так что с нашей стороны было бы огромнейшей ошибкой не рассказать тебе о программировании Волны. А мы же почти идеальны и не допускаем ошибок ;)

Далі...

Вибачаюсь, вибачаюсь, вибачаюсь (.

В недавній статті щодо штучного інтелекту я зробив маленьку помилку в прогі, яка давала змогу мені вигравати. Бага була в тому що він не навчався на помилка, а лише навчався на перемегах, що було не досить ефективно. Тож тепер можу вам показати скриптик, який майже НЕПЕРЕМОЖНИЙ!

Оце кусок який відповідає за логіку: class Game(object): memory = one_game = {} def __init__(self, sticks_count): self.sticks_count = sticks_count for _ in xrange(self.sticks_count+1): self.memory[_] = {1:1, 2:1, 3:1} def finish_lose(self): self.memory[ min(self.one_game) ][self.one_game[ min(self.one_game) ]] -= 1 def one_move(self, stick): ch = [] for i in self.memory[stick]: for _ in xrange(self.memory[stick][i]): ch.append(i) if not ch: return 1 self.one_game[stick] = random.choice( ch ) return self.one_game[stick]

Далі...

Ви напевно знаєте такий тип змінних як static, які містяться в функціях і їхнє значення зберігається між викликами функцій. Якщо згадувати пенсіонера С, то приклад буде такий:

function example1(void) { static int A = 1; A++; print('A = '+A); } example1(); >> A = 2 example1(); >> A = 3 example1(); >> A = 4

Думаю цей код працювати не буде через моє незнання С, але суть показує. І повертаючись до мого любимого Python'а - в ньому таких статичних методів в функціях немає, і замість того треба юзати класи: class S(object): a = 1 def example2(): S.a += 1 print "a = "%(S.a) example2() >> a = 2 example2() >> a = 3 example2() >> a = 4

Я постійно використовую таку функціональність, але незнав до недавнього часу особливість, що варта була декількох годин відладки коду. Отже, хай ви класи і їхні властивості будете використовувати як "ключ"(флажок) для неповторення функціоналу. Наприклад так: class S(object): was_run_example2 = False def example2() if not S.was_run_example2: print "PRINT ONLY ONE" example2() >> PRINT ONLY ONE example2() example2() example2()

Тепер ми прийшли до суті, мій модуль для логування в Пітоні використовує приблизно таку систему(хоча код набагато там кращий:) ), щоб налаштовувати логування лише раз. Але нещодавно виявилось, що почали дублюватися логи, тобто якимось чином ця система не працювала і код налаштування логування викликався 2 рази. Довго я не міг зрозуміти навіть приблизну причину, і тестував все методом "наукового тика" - постійно коментуючи різні участки кода і дивлячись чи було дублювання чи ні. Нарешті виявилось, що якщо цю функцію інклудити по різному в Пітоні, то для Пітона це буде два різні файли і різні обьєкти з різними значеннями полів обьєкту: include example2 from utils include example2 from project.utils include example2

Звичайно в одному файлі так не напишете, але якщо це багатомодульна система, то досить легко завантажити в якийсь момент її по іншому і в результаті з'явиться помилка яку не так і легко знайти.

Надіюсь що ви не будете наступати на ці граблі, як я наступив )

Логування в Python

24 Грудня 2009

Перед тим як зайти в глибоке святкування Нового Року вирішив написати два поста, один технічний, а інший про результати 2009 року. Тож щодо технічного, то одна з найважливішої функції в будь-якій системі - є її моніторинг - можливість бачити що де й як проходить, чи бувають помилки і якщо так, то де саме. Поскільки я програмую на Пітоні й Джанго, то мова буде саме про цею парочку.

Отще в Пітоні є чудернатський модуль logging, що дає можливість логувати різні за типом події. Найпростіша робота з ним це: import logging logging.info('info message') logging.error('error messaqge')

Найпростіший спосіб, але я його не юзаю, бо не дуже прикольно працювати зі стандартним потоком повідомлень, а краще юзати окремий, щоб чужі модуля не могли до нього нічого писати: import logging log = logging.getLogger('log') log.error('error messaqge')

Тепер в нас є власний потік повідомленнів, але крім того що він є, його треба й виводити кудись, зберігати, то для цього на нього навішуються різні обробники. Ось наприклад навісим, що все виводилось в консоль: formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") stream_handler = logging.StreamHandler(sys.stdout) stream_handler.setFormatter(formatter) stream_handler.setLevel(logging.DEBUG) log.addHandler(stream_handler)

Далі...

Я низько кланяюсь Гугловським маркетологам. Це ж нада було звичайну річ так круто пропіарить. Так голосно кричати про Google Wave. Саме цю "чудову" штуку вони охрестили вбивцею почти, чатів, форумів і всього-всього іншого - я навіть дивуюсь, чому не сказали що Вейв вб'є весь інтернет. Хоча якщо подивитись детальніше, то вони зробили аналог IRC, що працює в Вебі і має прикольний API - ото й все. Немає в ньому нічого нового, нічого революційного. Хоча це не значить, що Вейв поганий... Він прикольний - якщо його правильно використовувати. І про саме правильно використання поговоримо...

Нашій групі Ukrainian Security Community(UASC) постійно доводиться обговорювати різні цікаві штучки, і спочатку для таких конференцій використовували IRC, потім Скайп, а зараз зупинилися саме на Вейві. Бо для обговорень в малому колі людей - Вейв поки що кращий. Раніше в нас кожного тижня був черговий, що приймав всю почтову кореспондецію і вирішував всі питання з нею пов'язані. Але зараз це в минулому - з Вейвом за декілька годин був накиданий робот, що приймає пошту і публікує її на Вейві, де вже ми разом можемо її обговорити. Це набагато класніше.

Логіка роботи Робота наступна:

Далі...
 
 
 
Роман Хоменко aka PresidentUA
mail/jabber: spirt40@gmail.com