ПАРОЛИ.
Пароль к программе: asM 									  										   
  Идея простейшей защиты программы от несанкционированного запуска заключаеться в том,что 
где-то в программе записываеться ключевое слово-пароль,и программа,начав работать,требует
ввода этого слова с клавиатуры. Если пользователь ввел пароль правильно,программа продолжает
работать. Если пароль введен неверно,программа завершаеться. Таким образом,программа должна
сравнить введенное слово с хранящимся в ней и фиксировать совпадение или наличие хотя бы 
незначительной разницы. Рассмотрим программу ввода и анализа пароля. Здесь мы используем
программу WinPass.exe,которая демонстрирует все вышесказанное.
  В программе используються функции Win-32. Программа работает в среде Windows95/98/NT.
Написана на языке Ассемблера IBM PC. Использовался компилятор MASM версии 6.13. В сети
Интернет этот компилятор распространяеться бесплатно.Его можно найти по адресу(в составе DDK):
http://www.microsoft.com/ddk/install98ddk.htm.
Еще требуеться установленная на компьютере интегрированная среда разработки программ
Microsoft Visual C++ не ниже пятой версии. 
  Если каким-то образом просмотреть все известные странички в Интернете,посвященные 
програмированию на Ассемблере,то можно сделать один вывод - очень мало места посвящено этой
теме.
  Программа WinPass.exe очень проста. 
Ее обобщенный алгоритм работы можно представить в следующем виде(пошагово):
  1. До регистрации основного класса окна запускаеться диалоговое окно с окном редактирования
требующее ввода пароля;
  2. После ввода пароля,он считываеться в буфер и сравниваеться с ключевыи словом;
  3. При совпадении запускаеться основное окно программы;
  4. При несовпадении повторяеться цикл ввода пароля.Условие выхода - правильный пароль;
  5. Закрыть диалог можно нажав кнопку в правом верхнем углу,при этом программа завершаеться.
Как работает программа?
  Запускаем WinPass.exe. Появляеться диалоговое окно с приглашением ввести пароль. Вводим asM.
Запускаеться основное окно программы.Щелкнем левой кнопкой.Запуститься броузер по адресу:
http://www.chat.ru/~denta2000/stomat02.htm  Это наши спонсоры.

  Опишем используемые в программе функции представляющие интерес.
Когда мы запускаем приложение, то зто значит, что где-то в памяти будет выделено адресное 
пространство для нашего процесса. Получить значение базового адреса, по которому будет загружен
модуль мы можем с помощью функции GetModuleHandleA(lpModuleName).
Диалоговое окно создаеться при помощи функции DialogBoxParam(). Она описана в файле winuser.h.
Функция создает модальное диалоговое окно. Этот вид окон используеться наиболее часто. Эти
окна не дают пользователю возможности работать с другими окнами,созданными приложением,
породившим диалоговое окно, но разрешают переключаться на работу с другими приложениями. Для
того чтобы пользователь мог продолжить работу с другими окнами своего приложения, необходимо
завершить работу с диалоговым окном.Именно такое диалоговое окно нам и нужно.
  Опишем аргументы функции DialogBoxParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
Первый аргумент hInstance идентификатор нашей программы. Второй аргумент -  в нашем случае имя 
ресурса. Третий аргумент - хендл родительского окна. Четвертый - указатель на функцию диалового
окна. И последний - это параметр,определяемый програмистом,который может быть передан функции
диалового окна.                                         
   Регистрация класса окна - это  каркасное приложение, мы его описывать не будем.
Рассмотрим оконную и диалоговую процедуры.
  Оконная процедура. При получении окном сообщения  WM_PAINT(перерисовать содержимое окна)
с помощью функции TextOut() в рабочую область окна выводиться неформатированный текст. Для
сокращения текста программы применяем макрокоманду string_out(макроопределение в mac.inc).
Оконная функция обрабатывает еще одно сообщение Windows - WM_LBUTTONDOWN(нажата левая кнопка
мыши). При получении этого сообщения вызываеться функция ShellExecute().Она описана shellapi.h.
В нашем случае  функция запускает установленный по умолчанию броузер по указанному адресу.
  Более подробно остановимся на функции диалового окна.Именно здесь и будет происходить 
основная логика программы. Диалоговое окно описано в файле ресурса и не требует пояснений.
Для сравнения вводимых символов с заложенными в программе используем команду процессора
cmpsb(сравнить строку байтов) с префиксом повторения repe. В CX - количество сравниваемых
символов. Инструкция repe cmpsb сравнивает строки байтов до тех пор,пока в строке не 
встретятся разные елементы или содержимое регистра CX не станет равным 0.
  В Win-32 есть готовая функция CompareString() - сравнивает две символьные строки.Если строки
равны функция возвращает значение CST_EQUAL.Функция возвращает 0 если произшли ошибки.
Описана в заголовочном файле winnls.h. Мы можем использовать эту функцию для сравнения строк.
Но более интересно самому написать ключевой алгоритм.Мы и так практически не занимаемся 
програмированием,а просто вызываем системные функции.
  А теперь, когда все уже как-бы сказано проведем небольшой эксперимент.
Просмотрим программу при помощи обычного wpview(F3) из Norton Commander. Мы увидим в файле
симовльные строки: наименования разделов программы,имена ресурса,имена экспортируэмых функций
и др. Но самое интересное - в том месте,где храняться данные программы,мы увидим и наш пароль.
Если это так просто сделать, значит проделанная нами работа теряет смысл. Какой выход?
Сделаем так: представим наше слово-пароль в нечитаемом виде,другими словами зашифруем его.
Затем перед сравнением с введенным словом расшифруем его и сравним.Для этого нам придется
немного модифицировать нашу программу. Файл WinPass1.exe в архиве и есть такая модифицированная
программа. Теперь при обычном просмотре слово-пароль мы не найдем.Что же касается изменений
в программе. Алгоритм шифрования может быть как очень простым,так и очень сложным. 
 В WinPass1 все сделано как только можно просто, а сама  программа -
демонстрационная и важен сам принцип реализации идеи,наверное, самой простой защиты
программы от несанкционированного запуска.
  Автор программы будет очень признателен за присланные отзывы по поводу программы WinPass.exe
и предложения по изменению данной программы(интересные).
Предложения и замечания присылайте по адресу: e-mail: denta2000@chat.ru
  В дальнейшем планируеться поместить на страничке простую програмку шифрующую данные в файле.
Следует сразу сказать, что развитие странички будет зависеть в большей степени от наших
спонсеров.Следите за обновлением странички.   
  
  Разработана  небольшая программа PEheader.exe.С ее помощью можно просмотреть все поля
нового заголовка и таблицы объектов выполняемых файлов Windows.Программа написана на 
Ассемблере.Ее размер 17кб.Программа распространяеться бесплатно. Для того,чтобы ее получить
необходимо прислать запрос на почтовый ящик с указанием обратного адреса и в течении трех
дней Вы получите ответ с интересующей Вас программой.
Адрес почтового ящика: e-mail: denta2000@chat.ru 
  Есть коммерческий пакет этой же программы,который включает: саму программу,исходный текст
на Ассемблере с подробными комментариями,описание программы,а также тексты всех включаемых
файлов,используемых программой и файл ресурсов,также с подробными комментариями + распечатка.
Программа будет полезна тем,кто занимаеться програмированием на низком уровне.
  Результат работы программы PEheader.exe представлен в файле WinPass.txt(это заголовок
нашей программы WinPass.exe).Просматривать этот файл лучше всего по F3 Norton Comander,если
будет необходимость редактировать или распечатать,то используйте Microsoft Word т.к. 
используемый программой способ форматирования текста может быть не распознан другими
редакторами.