Программирование на C++ глазами хакера

Программа расшифровки пароля


Теперь напишем программу, которая будет загружать библиотеку и запускать ловушку. Для этого создайте новый проект Win32 Project типа Windows Application. В нем надо только подкорректировать функцию _tWinMain, как в листинге 3.7.

Листинг 3.7. Загрузка DLL-библиотеки и запуск ловушки
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; HACCEL hAccelTable;

// Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_OPENPASSTEST, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance);

// Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; }

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_OPENPASSTEST);

////////////////////////////////////// // Следующий код необходимо добавить LONG lResult; HINSTANCE hModule;

// Создаем новый указатель на функцию typedef void (RunStopHookProc)(bool, HINSTANCE);

RunStopHookProc* RunStopHook = 0;

// Load the DLL file (Чтение DLL-библиотеки) hModule = ::LoadLibrary("OpenPassDLL.dll");



// Получить адрес функции в библиотеке RunStopHook = (RunStopHookProc*)::GetProcAddress( (HMODULE) hModule, "RunStopHook");

// Выполнить функцию (*RunStopHook)(true, hInstance);

// Main message loop: while (GetMessage(msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, msg)) { TranslateMessage(msg); DispatchMessage(msg); } }

(*RunStopHook)(false, hInstance); FreeLibrary(hModule);

return (int) msg.wParam; }

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

typedef void (RunStopHookProc)(bool, HINSTANCE);

Таким образом, описывается тип функции RunStopHookProc, которая ничего не возвращает, но принимает в качестве параметров два значения типа bool и hInstance. В следующей строке объявляется переменная RunStopHook описанного типа, и ей присваивается значение 0.


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

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

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

(*RunStopHook)(true, hInstance);

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

(*RunStopHook)(false, hInstance);

FreeLibrary(hModule);

Примечание
Исходный код примера , описанного в этом разделе, вы можете найти на компакт - диске в каталоге \Demo\Chapter3\OpenPassTest.
Для тестирования примера поместите в один каталог исполняемый файл и динамическую библиотеку. Запустите программу и щелкните правой кнопкой мышки в поле ввода пароля. Звездочки (или любые другие символы) моментально превратятся в реальный текст.

На 3.14 можно увидеть пример работы этой программы. Здесь изображено стандартное окно Windows 2000 для смены пароля. В первом поле вы видите пароль, который расшифрован нашей программой. Во втором поле, в котором нужно ввести подтверждение пароля, остались звездочки.



3.14. Пример работы программы OpenPassTest


Содержание раздела