подопытные головоломки DEEONI$ (DEEONIS@GMAIL.COM) Спецвыпуск: Хакер, номер #066, стр. 066-050-3 Присмотримся к этому файлу поближе. Содержание не располагает ни к какому доверию, к тому же дата создания и модификации не соответствует действительности. Для того чтобы окончательно удостовериться в его виновности, запустим, а потом выключим игру еще раз и посмотрим, что произошло с ним. Как и предполагалось, дата создания/модификации изменилась, причем вновь неправильно. Если приглядеться повнимательнее, то удастся заметить, что и содержание файла не сохранило первоначальный вид. Теперь точно известно, что еще одним подозреваемым является DB365884.TMP. Теперь проверим, насколько точно были найдены все метки, оставленные игрушкой: удалим три вышеперечисленные записи в реестре и файл DB365884.TMP, запустим игру и… О чудо! Время опять сбросилось до 60-ти минут. Некоторые особо придирчивые спросят: «А что если отведенный час истечет во время игры?» Все будет нормально — из игры тебя не выкинут. Хорошо, конечно, но как-то не очень хочется каждый раз править реестр и удалять файл из темповой директории. Вот и автоматизируем процесс — напишем специальный загрузчик. [алгоритм loader’а] будет очень простым, но я все-таки распишу его довольно подробно: 1 ОТКРЫТЬ КЛЮЧ HKEY_LOCAL_MACHINE\SOFTWARE\LICENSES И УДАЛИТЬ ДВА ПАРАМЕТРА, НУЖНЫЕ НАМ; 2 ЗАКРЫТЬ КЛЮЧ HKEY_LOCAL_MACHINE\SOFTWARE\LICENSES; 3 ОТКРЫТЬ КЛЮЧ HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID\{942D82A5-DA03-640B-5E19-3CBD62700780} И УДАЛИТЬ НУЖНЫЙ ПАРАМЕТР; 4 ЗАКРЫТЬ КЛЮЧ HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID\{942D82A5-DA03-640B-5E19-3CBD62700780}; 5 ПОЛУЧИТЬ АДРЕС ВРЕМЕННОЙ ДИРЕКТОРИИ; 6 УДАЛИТЬ ФАЙЛ DB365884.TMP; 7 ЗАПУСТИТЬ LAUNCH.EXE ИЗ КАТАЛОГА, КУДА УСТАНОВЛЕНА ИГРА. Замечу, что в третьем пункте списка значение {942D82A5-DA03-640B-5E19-3CBD62700780} относится только к данной игрушке — другие же имеют собственные GUID’ы. То же самое относится к имени файла на шестом шаге. Будем реализовывать Loader на WinAPI-функциях, чтобы сделать код более независимым от языка программирования. Эти функции будут вызваны при помощи C++. Пойдем по порядку. Для открытия некоторого ключа реестра понадобится функция RegOpenKey. Вот ее прототип. LONG RegOpenKey(HKEY hKey, LPCTSTR lpSubKey, PHKEY phkResult); Параметр hKey — это значение базовой ветки реестра, где расположен нужный нам ключ. Для начала можно указать, например, HKEY_CURRENT_USER или HKEY_LOCAL_MACHINE. lpSubKey — указатель на нуль-терминальную строку, которая содержит имя открываемого ключа в ветке. phkResult — это адрес хендла открытого ключа. Функция запишет туда какое-то значение. Если вызов этой API завершится удачно, то вернется NULL, в противном случае — любое другое ненулевое значение. Следующая нужная нам функция — LONG RegDeleteValue(HKEY hKey, LPCTSTR lpValueName); Здесь hKey — опять же хэндл ключа, либо значения по умолчанию (HKEY_CURRENT_USER и т.д.), либо хэндл, который RegOpenKey записала по адресу phkResult. lpValueName — указатель на строку, содержащую имя параметра, который должен быть удален. Если функция выполнилась успешно, то возвращается значение ERROR_SUCCESS. В противном случае — любое другое ненулевое значение. |