Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #66, МАЙ 2006 г.

подопытные головоломки

DEEONI$ (DEEONIS@GMAIL.COM)

Спецвыпуск: Хакер, номер #066, стр. 066-050-4


Для закрытия ключа вызывается функция RegCloseKey.

LONG RegCloseKey(HKEY hKey);

Единственным ее параметром является хэндл на открытый ранее ключ. Возвращаемые значения — такие же, как и у предыдущей API.

На этом работу с реестром прошу считать завершенной. Начинается работа с файловой системой. Напоминаю, что для работы игрушки без ограничений требуется удалить файл DB365884.TMP из временного каталога, который не всегда располагается в одном и том же месте, — это единственная проблема в данный момент. Так где именно искать? Чтобы знать точно, нужно определить полный путь до этой директории, что делается при помощи функции GetTempPath. Она описана ниже.

DWORD GetTempPath(DWORD nBufferLength, LPTSTR lpBuffer);

nBufferLength — размер буфера, куда будет записан полный путь. lpBuffer — сам буфер или, естественно, строка (кому как нравится).

Теперь, когда мы точно знаем место хранения «нехорошего» файла, осталось лишь удалить его, для чего вызываем следующее:

BOOL DeleteFile(LPCTSTR lpFileName);

Единственным параметром этой функции является полное имя удаляемого файла. В случае успешного выполнения возвращается ненулевое значение.

Для запуска самой игры используем ShellExecute.

HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);

Первым параметром этой функции является хэндл родительского окна. lpOperation — строка, содержащая вид операции, который должен быть произведен над файлом (например open или print). lpFile — собственно, и есть имя файла, который мы будем вызывать. lpParameters — параметры, которые передаются вызываемому приложению. lpDirectory — рабочая директория. nShowCmd — режим отображения.

Теперь собрана полная информация, нужная чтобы написать собственный загрузчик к игре. Смело смотрим на листинг 1.

Пример загрузчика

void Loader (void)

{

//handle ключа реестра

HKEY hk;

//Строка, в которую запишется путь к временной папке

char TmpPath[1024];

//Имя файла, который надо удалить

const char *fName="DB365884.TMP";

//Открываем ключ HKEY_LOCAL_MACHINE\SOFTWARE\Licenses

if(RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Licenses",&hk))

//если ошибка, то выводим сообщение

MessageBox(NULL,"Невозможно открыть ключ реестра"," Ошибка ",MB_ICONERROR);

//удаляем ненужные параметры

RegDeleteValue(hk,"{IC8265E20B243C369}");

RegDeleteValue(hk,"{0C8265E20B243C369}");

//закрываем ключ

RegCloseKey(hk);

//то же самое, но для другого ключа и значения

if(RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{942D82A5-DA03-640B-5E19-3CBD62700780}",&hk))

MessageBox(NULL," Невозможно открыть ключ реестра "," Ошибка ",MB_ICONERROR);

RegDeleteValue(hk,"wPzA");

RegCloseKey(hk);

//получаем путь к временной папке

GetTempPath(1000,TmpPath);

//добавляем имя файла, который надо удалить

strcat(TmpPath,fName);

//удаляем его

if(!DeleteFile(TmpPath))

//Если не получилось, то выводим соответствующее сообщение

Назад на стр. 066-050-3  Содержание  Вперед на стр. 066-050-5