Программирование на C++

10 способов прострелить себе ногу

Создание веб приложений

В инете столько порнухи, что создается впечатление, что каждая женщина на Земле хотя бы раз в ней снималась...

Подпись для третьего не придумал

Американец изнасиловал лошадь, потому что думал, что у них родится кентавр

Помощь обездоленным якутам на дальнем севере

Благотворительность (на правах рекламы)

понедельник, 31 декабря 2012 г.

Топологическая сортировка+Поиск кратчайшего пути

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

Граф, который не содержит циклов, называется ациклическим.

Ориентированные ациклические графы используются для указания последовательности действия, где каждое действие зависит от других. Например: установка программ с помощью системы управления пакетами или сборка с помощью Makefil'ов. (wikipedie (c))

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


На рисунке представлена последовательность одевания утром. Первым делом идут носки (socks), потом трусы (undershorts) и самым последним идет пиджак у него время закрытия 4.

Для реализации топологической сортировки нам всего лишь нужно добавить в реализацию поиска в глубину глобальный стэк для вершин - stack<unsigned int> answer;
И! где мы красим вершину в черный после цикла, добавим добавление вершины в стек:

answer.push(u);
Теперь нам осталось всего лишь вывести стек) Вот и получили ответ.

Приложение: поиск кратчайшего пути в ациклическом графе.
Алгоритм выглядит так:

  1. Сначала делаем топологическую сортировку графа
  2. Для каждой вершины u в порядке топологической сортировки
    1. Для каждой смежной вершине v к вершине u
      1. Делаем релаксацию, т.е. запускаем старую добрую RELAX(u,v,w) 






Разложение Шеннона по таблице истинности

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

  1. Сначала мы берем СДНФ и разбиваем ее на конъюнкции
  2. Эти конъюнкции уже разбиваем на те, которые относятся к первой переменной разбиения, которая равна в таблице истинности единице, и те которым соответсвует 0.
  3. Запускаем процедуру декомпозиции
Сама идея процедуры очень проста, но реализовано все очень прожорливо, через вектора:
queue <int> variables - очередь, которая хранит в себе все переменные, которые мы выбрали для разбиения.
Мы разбиваем на конъюнкции , где xi=1 (plus) и xi=0 (minus) и смотрим 3 случая:
  1. Все вектора конъюнкций не пусты
  2. plus вектор пуст
  3. minus вектор пуст
В зависимости от этих случаев, мы вызываем рекурсивно снова функцию но уже для конъюнкций для новой переменной разложения (которую мы берем из очереди). Если следующей переменной для разложения нету возвращается окончательный ответ.

В общем на blogspote ограничение на 200 символов, так что по просьбе могу скинуть на хостинг проект.

Поиск в глубину у графа

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

  1. DFS(G) - нужна для инициализации всех переменных и цикла для прохода по всем вершинам
  2. DFS_VISIT(u) - где u - вершина, которую нужно посетить. Эта процедура обработки вершина, где проиходит окраска каждой вершины, обозначения времени открытия и закрытия вершины (закрытие - окраска в черный цвет, открытие - окраска в серый цвет).

DFS(G)

  1. Для каждой вершины u из множества вершин Графа
    1. Окрасить в белый цвет
  2. Инициализировать счетчик времени нулем
  3. Для каждой вершины u из множества вершин Графа
    1. Если вершина окрашена в белый, т.е. не пройдена
      1. Посетить ее, т.е. запустить процедуру DFS_VISIT(u)
DFS_VISIT(u)

  1. Окрасить вершину в серый цвет
  2. Увеличить счетчик времени time++
  3. Обозначить время открытия d[u]=time
  4. Для каждой вершины v смежной нашей вершине u
    1. Если вершина v окрашена в белый, т.е. не пройдена
      1. Обозначить u как вершину предшествующую вершине v
      2. Рекурсивно вызвать процедуру обработки для v: DFS_VISIT(v)
  5. Окрасить вершину u в черный цвет
  6. Обозначить время закрытия f[u]=time=time+1
Использующиеся данные:
Глобальная область видимости:
vector<unsigned int> color; //вектор цветов, 0 - белый, 1 - серый, 2 - черный
vector<unsigned int> predcessors; //вектор предшественников, если хотите построить дерево глубины
vector<unsigned int> d; //вектор к-ый хранит время открытия вершины
vector<unsigned int> f;  //вектор к-ый хранит время закрытия вершины
unsigned int timer; //таймер
ConnectionMatrix-матрица смежности графа

Реализация процедуры DFS:
void DFS (unsigned int NumOfVertices, double **ConnectionMatrix){
color.assign(NumOfVertices,0); //инициализация всех векторов
predcessors.resize(NumOfVertices);
d.resize(NumOfVertices);
f.resize(NumOfVertices);

timer=0; //обнуляем таймер
for (int u=0; u<NumOfVertices; u++){
if (color[u]==0) //если не пройденна - посетить
DFS_VISIT(u, ConnectionMatrix, NumOfVertices);
}
}
Реализация DFS_VISIT:
void DFS_VISIT(unsigned int u, double **ConnectionMatrix, unsigned int NumOfVertices){
color[u]=1; //теперь вершина окрашена в серый
timer++; //увеличим время
d[u]=timer; //время открытия
for (unsigned int v=0; v<NumOfVertices; v++){
if (ConnectionMatrix[u][v])
if (color[v]==0){
predcessors[v]=u;
DFS_VISIT(v, ConnectionMatrix, NumOfVertices); //рекурсивынй вызов для                       вершины v
}
}
color[u]=2; //покрасим в черный
f[u]=timer=timer+1; //обозначим время закрытия вершины u
}


воскресенье, 30 декабря 2012 г.

Поиск в ширину у графа

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

  • Суть данного алгоритма в том, что в процессе обхода мы идем вширь, то есть, перед тем, как приступить к поиску вершин на расстоянии k+1, мы выполняем обход всех вершин на расстоянии k.
  • Для отслеживания процесса обхода, мы окрашиваем вершины в белый, серый или черный цвета.
  • Сначала мы все вершины у нас белые, начальную вершину мы красим серым цветом, для обозначения окраса у нас есть вектор colors[numOfVertices]:
    1. color[i]=0 - белый цвет
    2. color[i]=1 - серый цвет
    3. color[i]=2 - черный цвет
  • Еще у нас есть вектор расстояний d[numOfVertices] - очень удобная штука, чтобы посмотреть, есть ли у нас какие нибудь несвязные вершины.
Алгоритм:
  1. Пока очередь не пуста:
    1. Взять первый элемент из очереди u
    2. Цикл для каждой связной с вершиной u вершиной (v)
      1. если у нас вершина v не окрашенная
        1. окрасит в серый
        2. пометить в векторе, что d[v]=d[u]+1
        3. добавить вершину в очередь
    3. Окрасить вершину u в черный цвет
Реализация:


void BFS(unsigned int NumOfVertices, double **ConnectionMatrix, unsigned int start, unsigned int target){
  //BFS algorithm
 if (target==start) return;
 const double INFINITY=1E10;
 unsigned int u=start;
 //0-white, grey-1, black-2
 vector  d (NumOfVertices,INFINITY); //вектор расстояний
 d[start]=0;
 vector  color(NumOfVertices,0); //вектор закраски
 color[start]=1;
 vector  predcessors (NumOfVertices);
 predcessors[start]=-1;
 queue  q;
 q.push(start);
 while (!q.empty()) {
  u=q.front();
  q.pop();
  for (int v=0; v< NumOfVertices; v++) {
   if (color[v]==0&&ConnectionMatrix[u][v]) {
    color[v]=1;
    d[v]=d[u]+1;
    predcessors[v]=u;
    q.push(v);
   }
  }
  color[start]=2;
 }
 cout< path;
 for (int cur=target; cur!=-1; cur=predcessors[cur])
  path.push_back (cur);
 reverse (path.begin(), path.end());
 cout << "Path from " << start << " to " << target << ": ";
 for (size_t i=0; i

суббота, 29 декабря 2012 г.

Алгоритм Форда-Беллмана. Реализация на С++

Алгоритм Форда-Беллмана применяется для нахождения кратчайшего пути от одной вершины до всех остальных во взвешенном графе.
Главное его преимущество перед алгоритмом Дейкстры в том, что он способен работать с отрицательными весами, НО имеет главный минус в производительности-работает за O(|V| × |E|), так как инициализация матрицы занимает время O(V) и на каждый проход надо V(E).

Случай 1: Граф без отрицательного цикла.

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

Итак, все действующие лица:



  • Переменная numOfVertices обозначает количество вершин в графе.
  • Переменная start нужна для обозначения номера начальной вершины.
  • Вектор расстояний d[numOfVertices] который имеет размер такой же как и количество вершин в графе (numOfVertices), он хранит в себе ВСЕ КРАТЧАЙШИЕ РАССТОЯНИЯ от нашей стартовой вершины до ВСЕХ ДРУГИХ.
  • Структура Edge (Ребро) для описания ребра, ясно, что ребро связывает вершину u с вершиной v и имеет вес w.
struct Edge {

 unsigned int u;

 unsigned int v;

 double w;

};

  •  Будем использовать вектор для хранения ребер vector<Edge>EdgeList, так как к вектору удобно обращаться по индексу;
  •  Переменная const double INFINITY=1E+10 для инициализации расстояний в начале работы функции.
  • Введем функцию релаксации ребер Relax (unsigned int index, vector <double> &d) для того, чтобы алгоритм был более понятен, какой кусок кода за что отвечает. index-индекс текущего ребра, d - вектор расстояний.

void Relax (unsigned int index, vector <double> &d){

 if (d[EdgeList[index].v]>d[EdgeList[index].u]+EdgeList[index].w){

d[EdgeList[index].v]=d[EdgeList[index].u]+EdgeList[index].w;

}

}
          Процесс релаксации ребра заключается в проверке ребра на то, можно ли улучшить путь из вершины u в v.
Примеры с картиночками можно почитать у Кормена на странице 670.
Сам алгоритм состоит в том, чтобы:
  1. Cначала инициализируем все расстояния бесконечными величинами, а расстояние стартовой вершины нулем.
  2. Цикл for для каждой вершины
    1. Вложенный цикл где для каждого ребра идет процесс релаксации
  3. Вывод расстояний
Простейшая неоптимизированная реализация:

void Bellman_Ford_Shortest_Path(double start, unsigned int numOfVertices){

 vector<double> d (numOfVertices, INFINITY);

 d[start]=0;

 for (unsigned int i=0; i<numOfVertices-1; i++){

  for (unsigned int j=0; j<EdgeList.size();j++){

   Relax(j,d);//РЕЛАКСАЦИЯ РЕБРА

  }

 }

 for (int i=0; i<d.size(); i++){

  if (d[i]<INFINITY){ //ЕСЛИ ЕСТЬ ПУТЬ

   cout<<"vertex "<< i+1 <<") "<<d[i]<<endl;

  }

  else cout<<"vertex "<< i+1 <<") "<<"No way to this vertex"<<endl;

 }

}

Брр. тега <code> На блогспоте не вижу, очень неудобно внедрять код.

          среда, 5 декабря 2012 г.

          Создание установщика для консольного приложения в vs 2010

          Собственно, наступило время, когда приходится писать не простые вузовские лабораторные по программированию, а приложению рассчитанные на пользователя.
          Одна из важнейших вещей - это развертывание приложения. Можно сделать это по разному : с помощью WinRar'a, обычный перенос файлов на жесткий диск и так далее. Но многим удобнее использовать обычный установщик, например формата msi, так как не каждый имеет на компьютере WinRar (да-да, странно в наши дни), а в другом способе может быть очень много файлов, что в некоторых случаях неудобно переносить на компьютер, поэтому установщик очень удобен и в этой статье я расскажу как его создать.
          Для примера создам простейший Console application project (имя проекта HelloWorld) с файлом HelloWorld.cpp :)
          #include "stdafx.h"
          #include <iostream>
          int _tmain(int argc, _TCHAR* argv[]) {
          std::cout<<"HelloWorld";
          return 0;
          }
          Далее создадим новый проект из шаблона New Project-->Other Project Types-->Setup and Deployment-->Visual Studio Installer-->Setup Project
          Назовем его HelloWorldInstaller. Я его поместил в D:\Labs\2sem
          Получили результат.


          Нажимаем правой клавишей в окне Solution Explorer на SolutionHelloWorldInstaller выбираем в всплывающем окне Add-->Existing Project и ищем папку нашего проекта HelloWorld и ищем файл с форматом vcxproj. Выбираем его. Все! Он добавился.
          Далее в Solution Explorer щелкаем правой клавишей на HelloWorldInstaller. Выбираем Add-->Project Output.
          На экране появилось окно. Выбираем наш проект HelloWorld в списке проектов. Пункт Primary Output позволяет добавить все .dll и .exe файлы (которые были построены) из проекта.

          Нажимаете ОК. Теперь постройте проект (Build).
          Ура! Мы получили готовый msi файл и установщик. Дело сделано.

          пятница, 16 ноября 2012 г.

          Google - лучший друг хакера


          Google - лучший друг хакера

          Перепост с : http://bozza.ru

          За последние несколько лет появилось множество статей, которые предупреждают о том, что хакеры (или cracker'ы, если хотите) используют поисковую систему google для получения доступа к файлам, к которым, по идее, они доступа иметь не должны. То, что я расскажу вам, возможно, кто-то уже давно использует в своих целях, но мне всегда было интересно самому узнать, как это работает. В 2001 году, James Middleton написал статью для vnunet.com, в которой шла речь об использовании хакерами специальных слов в поисковой машине google, для нахождения важной банковской информации:
          "В сообщении, находившемся в одной из security конференций было сказано, что введя 'Index of / +banques +filetype:xls' в строку поиска, в конечном счете можно было заполучить важные / секретные таблицы Excel из Французских банков. Та же самая технология может быть использована для поиска файлов с паролями"[1]
          В другой статье, которая появилась на wired.com, рассказывается, как Adrian Lamo, хакер часто попадающий в сводки компьютерных преступлений, использовал Google, чтобы получить доступ к web сайтам крупных корпораций.
          "Например, введя фразу "Select a database to view" - обычная фраза, используемая в FileMaker Pro database interface" - Google выдает примерно 200 ссылок, большинство из которых ведут на страницу с доступом к FileMaker для всех пользователей."[2]
          Подобные статьи продолжали и продолжали появляться в internet. Правительственные и Военные сайты Соединенных Штатов были тоже уязвимы, потому что скрипты используемые админами, можно было легко найти с помощью google. Медицинские карты, личные записи - все могло неожиданно оказаться в руках пользователей этой поисковой системы. Но в статьях никогда не было описано, как можно использовать Google в "таких" целях. Даже пример строки, которую вводил хакер не предоставлялся широкой аудитории. После того, как я последний раз прочитал подобную статью, я решил, что пора самому во всем разобраться - действительно ли google позволяет делать все то, о чем так много раз упоминалось в различных докладах. Следующий текст является результатом моих исследований.
          Теория
          На самом деле, теория очень проста. Чтобы получить интересующую вас информацию, вам нужно попробовать представить, в каких файлах эта информация может находиться, а затем просто попытаться их найти. (Например, попробуйте поискать *.xls файлы). Или же вы можете избрать более интересный подход - подумать, какой софтустановленный на атакуемой машине, предоставляет возможность выполнять нужные вам задачи, затем ввести критические/опасные файлы этого программного обеспечения в строку поиска. Примером может послужить система управления содержанием сайта (content management system). Вам нужно исследовать эту систему, выяснить, какие файлы она в себя включает, а затем воспользоваться google. Но вернемся к примеру о базе данных, рассмотренном чуть выше. Вы знаете, что строка "view database" находится на тех web страницах, которые не должны быть вам доступны. Следовательно, вам остается только найти страницы, в которых содержится данная строка или же узнать, что, например, опция "view database" ссылается на страницу "viewdbase.htm", то есть ее и надо будет ввести в строку поиска.
          Самое главное - четко поставить перед собой цель и знать, что вы хотите найти. Только после этого вы можете воспользоваться Google.
          Опции поиска Google
          Специальные типы файлов: *.xls, *.doc, *.pdf *.ps *.ppt *.rtf
          Google позволяет искать специальные типы файлов, то есть, как результат поиска, вы получаете не html-страницы (web сайты), а, например, файл Microsoft Excel. Вот что нужно ввести в строку поиска:
          Filetype:xls (для файлов excel) или filetype:doc для файлов Word.
          Наверное, будет интереснее найти файлы *.db и *.mdb. Можно поискать и другие типы файлов. Первое, что приходит на ум - *.cfg или *.pwd, *.dat файлы и т. п. Сначала подумайте, какие файлы могут содержать ценную информацию.
          Inurl
          Еще одна полезная опция при поиске - inurl: опция, которая позволяет искать заданные слова в url. Это дает вам возможность искать нужные каталоги.
          Пример: inurl:admin Результатом поиска станут web-сайты, у которых в url имеется слово "admin".
          Index of
          Опция "index of" тоже не до конца продумана разработчиками google, но нам она очень пригодится. Если вы используете опцию "index of", то как результат, google вам покажет листинг директории на сервере. Вот пример:
          "index of" admin или index.of.admin В результате вы получите листинг множества директорий 'admin'.
          Site
          Опция "site" позволяет показывать результаты поиска только по определенному домену или сайту. Например, вы можете искать как на всех .com или .box.sk или .nl сайтах, так и только на одном сайте. Будет очень интересно поискать на военных и правительственных сайтах. Вот пример строки поиска:
          Site:mil или site:gov
          Site:neworder.box.sk "board"
          Intitle
          Intitle - еще одна интересная опция. Она позволяет вам искать html файлы, в заголовке которых присутствует нужное вам слово или комбинация слов. Строка поиска при этом будет выглядеть так: intitle:здесь_слово. Вы можете узнать, какие слова присутствуют в заголовке, скажем, той же системы управления содержанием сайта, а затем искать эти слова в google, используя при этом опцию Intitle. В результате, вы получите доступ к подобным системам на других сайтах.
          Link
          Опция Link позволяет вам узнать, на каких web страницах есть ссылка на указанный вами сайт. Как описано в книге 'Hacking Exposed Third Edition' (Секреты Хакеров Третье Издание), эту опцию мы также можем использовать в своих целях.
          Комбинируем опции при поиске
          Все вышеупомянутые опции могли быть, а могли и не быть вам известны. В любом случае, используя их, мы получим интересный результат. Факт остается фактом - свою магическую силу google проявляет тогда, когда мы начинаем комбинировать друг с другом эти опции. Например, можете попробовать поискать это:
          inurl:nasa.gov filetype:xls "restricted" или это: site:mil filetype:xls "password" или может быть это: site:mil "index of" admin
          (Эти примеры я взял из головы и не знаю, выдаст ли google что-нибудь интересное. Вам необходимо найти такое сочетание опций, чтобы получить ожидаемый результат).
          Примеры; Практический Материал
          Специальные типы файлов: *.xls, *.doc, *.pdf *.ps *.ppt *.rtf
          Для начала, попробуйте поискать те файлы, в которых, вы думаете, находится интересующая вас информация. Для меня очевидным выбором стали следующие вещи:
          Password, passwords, pwd, account, accounts, userid, uid, login, logins, secret, secrets. Конечно, все эти слова я искал с расширением *.doc, *.xls и *.db
          Вот и появились первые интересные результаты, особенно, если искать файлы с расширением *.db. Правда, пароли я также находил и в *.doc файлах.
          http://www.doc.state.ok.us/Spreadsheets/private%20prison%20survey%20for%20web.xls
          http://www.bmo.com/investorrelations/current/current/suppnew/private.xls
          http://www.nescaum.org/Greenhouse/Private/Participant_List.xls
          http://www.dscr.dla.mil/aviationinvest/attendance_5Apr01.xls
          http://web.nps.navy.mil/~drdolk/is3301/PART_IS3301.XLS
          Admin.cfg
          Admin.cfg, в большинстве случаев, конфигурационный файл админа. Многие разработчики софта также используют имена типа "config", "admin" или "setup". Часто такие файлы содержат чувствительную информацию и поэтому они не должны быть доступны большинству людей. Я попытался поискать файл admin.cfg, используя следующую строку поиска:
          inurl:admin.cfg "index of"
          В результате, google выдала множество файлов, среди которых были очень интересные ;). Я, например, нашел файл: http://www.alternetwebdesign.com/cgi-bin/directimi/admin.cfg, в котором находились пароли Один пароль был от базы данных, которая находилась по адресу: http://www.alternetwebdesign.com/cgi-bin/directimi/database.cgi?admin.cfg. В базе данных находилась конфиденциальная информация клиентов этой компании. Я решил связаться с этой компанией и рассказать об уязвимости. Люди там оказались дружелюбные и сказали, что в ближайшее время постараются залатать брешь.
          Webadmin
          Некоторое время назад, когда я работал над этой статьей, я зашел на web сайт:
          http://wacker-welt.de/webadmin/
          Там было написано, что "webadmin" позволяет удаленно редактировать содержимое web сайта, загружать файлы и т.д. Главная страничка центра управления (control center) webadmin называется "webeditor.php". Очевидно, что следующим моим шагом стало посещение google и использование опции 'inurl', чтобы найти страницы webeditor.php. Вот, что я ввел в строке поиска:
          inurl:webeditor.php
          и вот, что я нашел:
          http://orbyonline.com/php/webeditor.php
          http://www-user.tu-chemnitz.de/~hkri/Neuer%20Ordner/webeditor.php
          http://artematrix.org/webeditor/webeditor.php
          http://www.directinfo.hu/kapu/webeditor.php
          Ко всем этим файлам доступ был неограничен, а все потому, что владельцы сайтов не потрудились поставить (правильно) защиту, используя .htaccess. Подобная ошибка позволяет абсолютно любому пользователю интернета заменять web страницы на сервере, а, следовательно, и дефейсить сайт. Возможность загружать свои файлы дает возможность получить полный доступ к серверу.
          Походив по этим сайтам, я заметил, что файл, позволяющий загружать файлы, называется "file_upload.php". Затем в дело вступает google.
          http://www.hvcc.edu/~kantopet/ciss_225/examples/begphp/ch10/file_upload.php
          Вот хороший пример:
          http://www.pelicandecals.com/admin/webeditor.php
          Данный скрипт позволяет вам изменять файлы, как и в предыдущих примерах, включая index.php. По идее, любой заинтересованный человек может изменить существующий или загрузить свой скрипт на сервер и выполнить его. О последствиях, думаю, упоминать не стоит.
          Там также присутствовала ссылка "Return Administration", кликнув по которой, я оказался здесь:
          http://www.pelicandecals.com/admin/administration.html
          Тут была доступна информация о покупателях, возможность менять цены на товары и т.д.
          Системы управления содержанием сайта
          Системы управления содержанием сайта - это программы, позволяющие web мастерам редактировать, изменять содержимое web сайта. Тоже относится и к панелям управления web сайтов. Суть заключается в том, что вам надо определить, какие файлы являются ключевыми в данном продукте. Таким файлом может быть "cms.html", "panel.html" или "control.cfg".
          Frontpage Server Extensions HTML Administration Forms
          "Вы можете удаленно администрировать FrontPage Server Extensions с любого компьютера, подключенного к internet, используя FrontPage Server Extension HTML Administration Forms."
          Вот, что говорит об этом документация Microsoft. Это значит, пользователи, имеющие доступ к этим формам, могут выполнять некоторые функции администратора, удаленно. А это значит, что формы должны быть хорошо защищены от неавторизованных пользователей. Ну что, как насчет поискать такие формы в интернете? Первое, что нам нужно сделать - выяснить, какие файлы использует этот софт Краткий визит на web сайт Microsoft или беглый взгляд в документацию FrontPage покажет, что главной страницей всех форм администратора является "fpadmin.htm". Именно этот файл мы и будем искать. Но, сначала, мы должно правильно подобрать те опции, которые будут использоваться в строке поиска, чтобы получить нужный нам результат. Если проводится установка по умолчанию, то все файлы помещаются в директорию "admin". Вспомнив все, что мы узнали об опциях google и теории поиска, ожидаемый результат может выдать строка поиска типа:
          inurl:fpadmin.htm "index of" admin или inurl:admin/fpadmin.htm
          А вот и полученные при поиске результаты:
          http://www.lehigh.edu/~ineduc/degree_programs/tbte/admin/
          http://blackadder.eng.monash.edu.au/frontpage/admin/
          http://www.lehigh.edu/collegeofeducation/degree_programs/tbte/admin/
          http://www.vsl.gifu-u.ac.jp/freeman/frontpage4/admin/
          http://www.tech-geeks.org/contrib/loveless/e-smith-fp-2002/frontpage/version5.0/admin/1033/fpadmin.htm
          http://fp.nsk.fio.ru/admin/1033/fpadmin.htm
          Вот что еще написано в документации к FrontPage:
          "Из соображений безопасности, HTML Administration Forms сразу после установки не активны, что не позволит удаленно администрировать FrontPage из web браузера."
          Это означает только одно - некоторые ссылки, которые выдала нам поисковая система google, могут оказаться бесполезными и есть только один способ проверить их работоспособность - попробовать воспользоваться некоторыми функциями администратора и посмотреть на результат. Я решил не заходить так далеко, чтобы не нарушать закон. Но я здесь не для того, чтобы учить вас хорошим манерам, по крайней мере сегодня.
          Freesco Router
          Программное обеспечение Freesco router для Linux по умолчанию устанавливает маленький браузер, который позволяет владельцам контролировать работу роутера через http протокол. По умолчанию, логин и пароль для панели управления - "admin". Очень многие пользователи freesco не знают об этом. Вы можете поискать панель управления Freesco роутеров, использую следующую строку:
          intitle:"freesco control panel" или "check the connection" эти слова находятся либо в заголовках страниц, либо на самих страницах. Все сводится к одному - вы должны изучить софт найти те его части, которые отвечают за что-то важное (та же страница администратора) и составить такую строку, воспользовавшись которой, вы получите доступ к этим самым частям.
          Дополнительные советы
            • Запомните, Английский, самый распространенный в интренете язык, но он не единственный. Пробуйте искать слова или строки из вашего родного языка или Французского или Немецкого и т.д. Например, "beeheer" по-немецки означает "администрация".
            • Вы можете использовать строки из списка уязвимостей любого сканера безопасности (security scanner). За примерами можно обратиться сюда: http://paris2k.at.box.sk/listings/
            • Пробуйте искать файлы "config.inc.php" или "mysql.cfg" - они могут содержать комбинации логин-пароль от базы данных MySQL Попробуйте в строке поиска использовать слова PHP SQL, mySQL и т.д.
            • Попробуйте следующие комбинации: inurl:admin "index of" "database" или inurl:phpmyadmin "index of" или inurl:mysql "index of" site:neworder.box.sk intitle:index.of или intitle:index.of.private( = intitle:"index of private")
          Заключение
          Internet - это сеть, к которой подключены сотни тысяч, а то и миллионов web серверов и по идее, можно получить доступ к любым данным, конечно, если они не защищены подобающим образом. Как разработчики программного обеспечения, так и конечные пользователи должны уделять больше внимания конфигурации защиты, устанавливаемой по умолчанию и политике безопасности. В конце концов, всегда найдутся люди, которые допускают ошибки, устанавливают все по умолчанию, используют плохо защищенное программное обеспечение и совсем об этом не беспокоятся или все еще верят, что ничего не произойдет если они поместят все это в таком виде в интернет. Но все же находятся любопытные личности, которым нравится находить интересную информацию не для посторонних глаз. Google может вам значительно помочь в таких делах, к тому же это совсем не трудно.

          четверг, 15 ноября 2012 г.

          Установка Windows 8 на VHD

          Пост в стадии редактирования.
          Итак. Существует множество других статей от других авторов по установке Windows 8. Мой туториал отличается тем, что здесь не тупо все написано plain text'ом, как например на хабре. но также есть скрины, теория и подробное описание к каждому шагу.
          Почему все устанавливают Windows 8 на VHD:
          1. Не требовательна к ресурам. Для виртуализации, например windows 8x64 нужно как минимум 2 гб памяти, и 2 гб оперативной памяти на остаток, что очень затратно, да и к тому же, если у вас 3 гб памяти, то завиртуалить x64 не получится.
          2. Много нужных файлов и программ находятся на дисках, и лень (да и времени нету) это все переносить на облако, флэшку ит.д. Возможно если у вас, например 2 диска, то при установке 8ки несистемный диск останется нетронутым. Но есть вероятность, что в ходе установки (по рукожопости) можно отформатировать и этот диск. С VHD таких проблем не будет.
          3. Windows 8 очень глючная система. В Windows Store мало приложений. Некоторые приложения вообще не совместимы с ней. Ставить ее как основную десктопную ОС пока не имеет смысла.
          4. Образ VHD можно легко снести или изменить размер. Причем программы вроде virtual box и другие поддерживают этот формат.
          Пререквизиты: OS с Windows 7 (не ниже) + iso-шник с windows 8, который можно скачать с любого торрента вашего города. + 40-50 GB свободного места.

          VHD-файл, который имеет структуру сходную с обычным жестким диском и к которому мы имеем доступ, как к обычному жесткому диску.
          Для начала надо создать VHD-диск:
          Нажмите Пуск->Стандартные->Выполнить. Откроется окно Run. Впишите туда diskmgmt.msc и нажмите OK.
          Откроется окно управления дисками
          Нажмите Действие->Создать виртуальный диск
          Далее выбираем размер 40 Гб (можно и больше),Динамическое расширение (размер можно менять) и расположение (например я выбрал, чтобы W8 находилась на диске C. Нажимаем ОК.
          Все. Диск создан. Теперь проинициализируем его. Нажмем правой кнопкой по созданному диску, появится контекстное меню, выберем инициализировать диск.
          Создадим простой том. Для этого нажмем правой кнопкаой по белому полю слева от созданного диска, появится контекстное меню и нажмем создать простой том.
          Появится мастер создания тома. Жмем Далее. Потом выбираем сколько выделить места под размер тома. Выбираем максимальный размер. Жмем Далее. Назначаем этому разделу какую то букву, например W. жмем Далее. Выбираем "Форматировать этот том следующим образом".
          Далее нужно запустить PowerShell от имени администратора.
          Windows 7 и Windows 8 на одном диске
          Появляется окно PowerShell'a. Как мы видим он очень похож на cmd. Но чем они отличаются? Прежде всего - cmd.exe - это интерпретатор комманд Windows, к-ый имеет язык сценариев. Отличия Powershell'a в возможностях. Он имеет другой язык сценариев. К тому же в отличие от обработки он вычисляет комманды.
          Т.е. PS C:\Documents and Settings\si> 6+2==8 :)
          Отсюда, мы можем сделать вывод, что он работает с данными, как с переменными.
          Также вместо команд используются командлеты-т.е. команды, реализующие определенную функциональность. Они имеют структуру : Verb-None. Пример Get-Help //получить справку.

          Потом нам нужен скрипт с сайта MSDN, он находится по адресу : Archive.msdn.microsoft.com
          Ложим его в корневую папку C:/
          Windows 7 и Windows 8 на одном диске
          Клик ПКМ по файлу откроет контекстное меню, в котором выберете Свойства (Properties). Нажмите кнопку Разблокировать(Unlocked). Увы. Этот файл не имеет цифровой подписи. Поэтому после такого как мы опять заходим в свойства, у нас опять доступна кнопка Разблокировать. Для полной разблокировки нужно просто создать новый txt файл с таким же именем и перенести туда все содержимое предыдущего файла.
          Windows 7 и Windows 8 на одном диске
          Далее нужно создать файл .iso. Для его создания можно использовать утилиту Virtual Clone Drive или ее аналогов. После создания файла. Iso перейдите к окошку PowerShell. Введите путь в корневой каталог «CD C:\».
          Windows 7 и Windows 8 на одном диске
          Затем введите «.\Install-WindowsImage.psl – WIM Z:\Sources\Install.wim – Apply – Index 1 – Destination I:\»
          В данной команде буква «Z» означает диск со смонтированным образом DVD, т.е. если ваш образ находится на другом диске, следует указать его букву. Так же I:\ необходимо изменить на букву диска VHD. Нажмите Enter для подтверждения.
          Windows 7 и Windows 8 на одном диске
          Вы увидите уведомление об успешном окончании операции.
          Windows 7 и Windows 8 на одном диске
          Далее запустите командную строку (Command promt) от имени администратора и введите следующий код: bcdboot.exe I:Windows. Где «I» — название вашего диска с Windows 8.
          Windows 7 и Windows 8 на одном диске
          Готово! Windows 8 установлена и готова к использованию!