Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Готовим жульен с грибами и курицей

30.10.2008 | Категория: А еще я туда ем! | Автор: ManHunter

Готовим жульен

Жульен - одна из моих самых любимых горячих закусок. Готовить его можно из множества компонентов - курица, креветки, мясо, даже рыба. Рецепт простой, блюдо вкусное, одно плохо, что жульен очень быстро заканчивается :) Сегодня я расскажу как готовить традиционный жульен с грибами и курицей. Для приготовления потребуется 300 грамм куриного мяса, 400 грамм грибов, 200 грамм твердого сыра, 3 столовые ложки сметаны, 2 столовые ложки муки.

Читать статью целиком »
Просмотров: 55930 | Комментариев: 39

Создание прозрачных окон в Windows

29.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще один простой в реализации, но красивый эффект для ваших программ - прозрачные диалоговые окна. Для этого надо, чтобы диалоговое окно было прописано в ресурсах или создавалось с расширенным стилем WS_EX_LAYERED, а при его инициализации вызывалась функция SetLayeredWindowAttributes. Значение коэффициента прозрачности может быть от 0 (полностью прозрачное окно) до 255 (непрозрачное окно). Рекомендуется значение 240-245, при этом эффект прозрачности уже заметен, а содержимое окна еще легко читается и не сливается с перекрываемыми окнами. Этой же функцией можно динамически менять прозрачность уже созданного окна, например чтобы создать эффект его плавного появления или исчезновения.
  1. ; Сегмент кода
  2. section '.code' code readable executable
  3. ...
  4. ; Процедура обработчика окна
  5. proc DialogProc hwnddlg,msg,wparam,lparam
  6.         ...
  7.         ; Инициализация окна?
  8.         cmp     [msg], WM_INITDIALOG
  9.         je      wminitdialog
  10.         ; Закрытие окна?
  11.         cmp     [msg], WM_CLOSE
  12.         je      wmclose
  13.         ...
  14. wminitdialog:
  15.         ; Установить первоначальную прозрачность окна 245
  16.         invoke  SetLayeredWindowAttributes, [hwnddlg], 0, 245, LWA_ALPHA
  17.         ...
  18. wmclose:
  19.         ; Плавное исчезновение окна при его закрытии
  20.         mov     ecx,245
  21. fade_dialog:
  22.         push    ecx
  23.         ; Установка нового атрибта прозрачности
  24.         invoke  SetLayeredWindowAttributes, [hwnddlg], 0, ecx, LWA_ALPHA
  25.         ; Небольшая пауза
  26.         invoke  Sleep,2
  27.         pop     ecx
  28.         loop    fade_dialog
  29.         ...
  30.  
  31. ; Секция ресурсов
  32. section '.rsrc' resource data readable
  33.  
  34. ; Описание диалогового окна в ресурсах.
  35. ; В расширенных стилях должен быть прописан атрибут "WS_EX_LAYERED"
  36. dialog demo, 'Demo', 70, 70, 190, 175,\
  37.         WS_CAPTION + WS_POPUP + WS_SYSMENU + DS_MODALFRAME,\
  38.         WS_EX_LAYERED
  39.         ...
Не забывайте вызывать функцию SetLayeredWindowAttributes при инициализации диалогового окна со стилем WS_EX_LAYERED, иначе после открытия его вообще не будет видно. Также помните, что эффект прозрачности не поддерживается в Windows 9x. Пример программы с плавным появлением и исчезновением окна прилагается.

Читать статью целиком »
Просмотров: 10702 | Комментариев: 4

Деобфускация скриптов PHP и JavaScript

26.10.2008 | Категория: Темная сторона Силы | Автор: ManHunter
Одним из наиболее надежных на сегодняшний день способов защиты скриптов от изучения и модификации является обфускация.


Обфускация (от лат. obfuscare, "затенять, затемнять") - запутывание кода программы, то есть приведение исходного текста к виду, сохраняющему функциональность программы, но затрудняющему анализ, понимание алгоритмов работы и модификацию.


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

Как я уже и говорил, при деобфускации привести код в первоначальный вид невозможно. Но вполне можно "облагородить" его до такого состояния, когда можно без особого труда разобраться в алгоритме и внести необходимые изменения. Например, после деобфускации можно сломать защиту некоторых PHP-скриптов, убрать привязку JavaScript к домену, вырезать принудительную рекламу или еще что-нибудь подобное.

Читать статью целиком »
Просмотров: 34105 | Комментариев: 20

Плоды прогресса (приключенческая повесть)

21.10.2008 | Категория: Всякая всячина | Автор: ManHunter
Нашел на компе в залежах фидошных приколов такой вот текст. Литературной ценности он не представляет, но он интересен тем, что все слова в нем начинаются на букву "П". К сожалению, авторство неизвестно. Навеяло вот этой цитатой с баша.

Плоды прогресса
(приключенческая повесть)

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

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

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

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

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

- Подумай. Подарю полотно Пикассо, платиновую пепельницу, Пиночету представлю, - пообещал плантатор.



Читать статью целиком »
Просмотров: 6226 | Комментариев: 7

Работа с недокументированными API WHM и cPanel

20.10.2008 | Категория: Web-мастеру и не только | Автор: ManHunter
cPanel является одной из самых популярных коммерческих панелей управления аккаунтами на серверах виртуального хостинга. Все действия выполняются обычно через web-интерфейс, но для использования в ваших проектах авторами предоставляется API. К сожалению вообще никакой вменяемой документации разработчикам не предоставляется. Эту позорную отмазку на официальном сайте назвать технической документацией трудно, поэтому при разработке очередного проекта пришлось создавать собственный класс для работы с cPanel. Попутно удалось реализовать несколько недокументированных функций и расширить функционал уже имеющихся.
  1. <?
  2. // -------------------------------------------------------------
  3. // Класс для работы с WHM/cPanel через API
  4. // (C) ManHunter / PCL
  5. // http://www.manhunter.ru
  6. // -------------------------------------------------------------
  7. class cpanel_class {
  8.   var $cpanelaccterr;
  9.   var $host;
  10.   var $user;
  11.   var $accesshash;
  12.   var $usessl;
  13.  
  14.   // -------------------------------------------------------------
  15.   // Изменить пароль на аккаунте
  16.   // Для выполнения нужна авторизация только с рутовым доступом
  17.   // $chuser - аккаунт на сервере
  18.   // $password - новый пароль
  19.   // -------------------------------------------------------------
  20.   function chgpassword ($chuser$password) {
  21.     if ($this->user!="root") {
  22.       $this->cpanelaccterr="Root privileges required";
  23.       return;
  24.     }
  25.     $result $this->whmreq("/scripts/passwd?user=${chuser}&password=${password}&password2=${password}");
  26.     $result=eregi_replace("[\n]{1,}","\n",strip_tags($result));
  27.     if ($this->cpanelaccterr != "") { return; }
  28.     if (strpos($result,"could not be changed")!==false) {
  29.       $this->cpanelaccterr=$result;
  30.       return;
  31.     }
  32.     return $result;
  33.   }
  34.  
  35.   // -------------------------------------------------------------
  36.   // Заблокировать аккаунт
  37.   // $suspenduser - аккаунт на сервере
  38.   // $reason - причина блокировки, сделано на перспективу,
  39.   //           фактически параметр панелью игнорируется
  40.   // -------------------------------------------------------------
  41.   function suspend ($suspenduser$reason="") {
  42.     $reason=str_replace(" ","+",$reason);
  43.     $result $this->whmreq("/scripts/remote_suspend?user=${suspenduser}&reason=${reason}");
  44.     if ($this->cpanelaccterr != "") { return; }
  45.     if (strpos($result,"Access Denied")!==false) {
  46.       $this->cpanelaccterr=$result;
  47.       return;
  48.     }
  49.     return $result;
  50.   }
  51.  
  52.   // -------------------------------------------------------------
  53.   // Разблокировать аккаунт
  54.   // $unsuspenduser - аккаунт на сервере
  55.   // -------------------------------------------------------------
  56.   function unsuspend ($unsuspenduser) {
  57.     $result $this->whmreq("/scripts/remote_unsuspend?user=${unsuspenduser}");
  58.     if ($this->cpanelaccterr != "") { return; }
  59.     if (strpos($result,"Access Denied")!==false) {
  60.       $this->cpanelaccterr=$result;
  61.       return;
  62.     }
  63.     return $result;
  64.   }
  65.  
  66.   // -------------------------------------------------------------
  67.   // Удалить аккаунт
  68.   // $killuser - аккаунт на сервере
  69.   // -------------------------------------------------------------
  70.   function killacct ($killuser) {
  71.     $result $this->whmreq("/scripts/killacct?user=${killuser}&nohtml=1");
  72.     if ($this->cpanelaccterr != "") { return; }
  73.     return $result;
  74.   }
  75.  
  76.   // -------------------------------------------------------------
  77.   // Показать версию WHM/cPanel
  78.   // -------------------------------------------------------------
  79.   function showversion () {
  80.     $result $this->whmreq("/scripts2/showversion");
  81.     if ($this->cpanelaccterr != "") { return; }
  82.     return $result;
  83.   }
  84.  
  85.   // -------------------------------------------------------------
  86.   // Перевести аккаунт на новый тарифный план
  87.   // $upuser - аккаунт на сервере
  88.   // $acctplan - новый тарифный план
  89.   // -------------------------------------------------------------
  90.   function update ($upuser$acctplan) {
  91.     $acctplan=str_replace(" ","+",$acctplan);
  92.     $result $this->whmreq("/scripts2/upacct?user=${upuser}&pkg=${acctplan}");
  93.     if ($this->cpanelaccterr != "") { return; }
  94.     return $result;
  95.   }
  96.  
  97.   // -------------------------------------------------------------
  98.   // Открыть новый аккаунт
  99.   // $acctdomain - домен
  100.   // $acctuser - логин для аккаунта
  101.   // $acctpass - пароль для аккаунта
  102.   // $acctplan - тарифный план
  103.   // $accemail - контактный email аккаунта
  104.   // $acccpmod - стиль cPanel по умолчанию
  105.   // -------------------------------------------------------------
  106.   function createacct ($acctdomain$acctuser$acctpass$acctplan$accemail,
  107.            $acccpmod="bluelagoon") {
  108.     if (!eregi("^[-a-z0-9\.]{4,}$",$acctdomain)) {
  109.       $this->cpanelaccterr="Invalid domain name";
  110.       return;
  111.     }
  112.     $acctplan=str_replace(" ","+",$acctplan);
  113.     $accemail=str_replace("@","%40",$accemail);
  114.     $result $this->whmreq("/scripts/wwwacct?remote=1&nohtml=1&username=${acctuser}&password=${acctpass}&domain=${acctdomain}&plan=${acctplan}&contactemail=${accemail}&cpmod=${acccpmod}");
  115.     if ($this->cpanelaccterr != "") { return; }
  116.     return $result;
  117.   }
  118.  
  119.   // -------------------------------------------------------------
  120.   // Показать список имеющихся на сервере аккаунтов
  121.   // -------------------------------------------------------------
  122.   function listaccts () {
  123.     $result $this->whmreq("/scripts2/listaccts?nohtml=1&viewall=1");
  124.     if ($this->cpanelaccterr != "") { return; }
  125.  
  126.     $page split("\n",$result);
  127.     foreach ($page as $line) {
  128.       list($acct,$contents) = split("="$line);
  129.       if ($acct != "") {
  130.         $allc split(","$contents);
  131.         $accts[$acct] = $allc;
  132.       }
  133.     }
  134.     return($accts);
  135.   }
  136.  
  137.   // -------------------------------------------------------------
  138.   // Показать список заведенных на сервере тарифных планов
  139.   // -------------------------------------------------------------
  140.   function listpkgs () {
  141.     $result $this->whmreq("/scripts/remote_listpkg");
  142.     if ($this->cpanelaccterr != "") { return; }
  143.  
  144.     $page split("\n",$result);
  145.     foreach ($page as $line) {
  146.       list($pkg,$contents) = split("="$line);
  147.       if ($pkg != "") {
  148.         $allc split(","$contents);
  149.         $pkgs[$pkg] = $allc;
  150.       }
  151.     }
  152.     return($pkgs);
  153.   }
  154.  
  155.   // -------------------------------------------------------------
  156.   // Запрос к WHM/cPanel. Используется только для работы внутри
  157.   // класса, извне вызываться не должен
  158.   // -------------------------------------------------------------
  159.   function whmreq ($request) {
  160.     $cleanaccesshash preg_replace("'(\r|\n)'","",$this->accesshash);
  161.     $authstr $this->user ":" $cleanaccesshash;
  162.     $this->cpanelaccterr "";
  163.  
  164.     if (function_exists("curl_init")) {
  165.       $ch curl_init();
  166.       if ($this->usessl) {
  167.         curl_setopt($chCURLOPT_SSL_VERIFYPEER,0);                
  168.         curl_setopt($chCURLOPT_SSL_VERIFYHOST,0);
  169.         curl_setopt($chCURLOPT_URL"https://".$this->host.":2087" $request);
  170.       }
  171.       else {
  172.         curl_setopt($chCURLOPT_URL"http://".$this->host.":2086" $request);
  173.       }
  174.       curl_setopt($chCURLOPT_HEADER0);
  175.       curl_setopt($chCURLOPT_RETURNTRANSFER,1);
  176.       $curlheaders[0] = "Authorization: WHM $authstr";
  177.       curl_setopt($ch,CURLOPT_HTTPHEADER,$curlheaders);
  178.       $data=curl_exec ($ch);
  179.       curl_close ($ch);
  180.     }
  181.     elseif (function_exists("socket_create")) {
  182.       if ($this->usessl) {
  183.         $this->cpanelaccterr "SSL Support requires curl";
  184.         return;
  185.       }
  186.       $service_port 2086;
  187.       $address gethostbyname($this->host);
  188.       $socket socket_create (AF_INETSOCK_STREAM0);
  189.       if ($socket 0) {
  190.         $this->cpanelaccterr "socket_create() failed";
  191.         return;
  192.       }
  193.       $result socket_connect ($socket$address$service_port);
  194.       if ($result 0) {
  195.         $this->cpanelaccterr "socket_connect() failed";
  196.         return;
  197.       }
  198.       $in "GET $request HTTP/1.0\n";
  199.       socket_write($socket,$in,strlen($in));    
  200.       $in "Connection: close\n";
  201.       socket_write($socket,$in,strlen($in));    
  202.       $in "Authorization: WHM $authstr\n\n\n";
  203.       socket_write($socket,$in,strlen($in));    
  204.  
  205.       $inheader 1;
  206.       while(($buf socket_read($socket512)) != false) {
  207.         if (!$inheader) {
  208.           $data .= $buf;
  209.         }
  210.         if (preg_match("'\r\n\r\n$'s"$buf)) {
  211.           $inheader 0;
  212.         }
  213.         if (preg_match("'\n\n$'s"$buf)) {
  214.           $inheader 0;
  215.         }
  216.         if (preg_match("'\r\n$'s"$buf)) {
  217.           $inheader 0;
  218.         }
  219.       }
  220.     }
  221.     else {
  222.       $this->cpanelaccterr "php not compiled with --enable-sockets OR curl";
  223.       return;
  224.     }
  225.     return $data;    
  226.   }
  227. }
  228. ?>
Для работы с этими функциями требуется доступ с правами администратора, и только для chgpassword требуется рутовый доступ. PHP должен быть собран с модулем curl или enable-sockets. При наличии навыков класс можно легко расширять другими функциями, доступными через web-интерфейс WHM/cPanel.

Читать статью целиком »
Просмотров: 5753 | Комментариев: 9

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2022
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.16 сек. / MySQL: 2 (0.056 сек.) / Память: 5 Mb
Наверх