Сейчас на форуме: vsv1, r0lka, -Sanchez-, testrev1337, johnniewalker, Kybyx (+4 невидимых) |
eXeL@B —› Крэки, обсуждения —› Непонятная ошибка открытия драйвера FEnteDev (hardlock.sys) смахивает на защиту |
Посл.ответ | Сообщение |
|
Создано: 02 апреля 2010 01:06 · Поправил: DenCoder · Личное сообщение · #1 Доброго всем времени суток! Прошу опытных и не очень кодеров, реверсеров и крякеров помочь разобраться. Нонсенс какой-то и в интернете что-то ссылей поубавилось раз в 1000 или и не было вовсе. Толком ничего нет ни о FEnteDev, ни о hardlock.sys. Пытаюсь запустить игру от фирмы LLC STRIKE из-под своего загрузчика. Игра защищена HASP. Не выходит, хотя без него пашет нормально. Разобрался с логами, причина этому - не может открыть "\.\FEnteDev" в n-ый раз, получает INVALID_HANDLE_VALUE и выводит "Error 1009: Cannot open HASP HL Drivers". Добавил для таких случаев GetLastError и прогнал еще раз. Вышло так: Thread: 000000C4 Begin call CreateFileA( lpFileName = "\.\FEnteDev" dwDesiredAccess = C0000000 dwSharedMode = 00000003 lpSecurityAttributes = 00000000 dwCreationDisposition = 00000003 dwFlagsAndAttributes = 00000000 hTemplateFile = 00000000) Return: [bshell32.dll].11C4C2F1 Thread: 000000C4 CreateFileA end Result: FFFFFFFF Error: 87(ERROR_INVALID_PARAMETER) Точно такой же, аналогичный вызов CreateFile до этого проходит без ошибок. Разница в вызовах лишь в том, что в предыдущем адрес возврата в exe-модуль и потоки разные... ну и открытие в последнем случае из DllMain (или DllEntryPoint), MessageBox за ним там же. И в итоге LoadLibrary("bshell32.dll") возвращает 0, Last Error = 1114. Как такое может быть? - Моя тулза здесь ничего не подменяет, если б драйвер не был закрыт, код ошибки был бы другой... У кого какие идеи есть? Может, кто-то уже сталкивался с подобным? P.S. Форумом не допускается двойной слеш ))) \ ----- IZ.RU |
|
Создано: 02 апреля 2010 01:35 · Личное сообщение · #2 |
|
Создано: 02 апреля 2010 01:41 · Поправил: DenCoder · Личное сообщение · #3 1 и 3 мимо. 2 уже читал, тоже не то. Спасибо. ________________________________________ Даю описание алгоритма, что делается. 1) Перехватывается GetProcAddress; 2) Сравнивается имя ф-ции, если CreateFileA или CreateFileW, выделяется память под код перехватчика, компилится маленький кодик перехватчика в зависимости от условий, в map заносится пара адресов, оригинальный и перехватчика, возвращаемый адрес подменяется на Entry этого кода, дабы не установить хук дважды. Память выделяется VirtualAlloc, если ни в какой выделенной ранее странице нет достаточного места (свой менеджер памяти); 3) Программа, получающая адрес, получает новый адрес; ... 4) Вызов CreateFileA или CreateFileW попадает на код перехватчика, в котором до реального вызова вызывается преобработчик со всеми параметрами и с адресом возврата в вызвающую программу. В преобработчике вызывается: - GetModuleHandleEx для определения хендла модуля, из которого совершен вызов ф-ции; - GetModuleFileName для определения имени модуля, strrchr урезает его полный путь; - sprintf форматирует строку для передачи серверу (msvcr90x.dll не используется); - Подготавливается буфер для передачи текста и дается сигнал серверу ф-цией SetEvent. Для каждого потока программы предварительно создана пара именованных Event'ов; - Ожидается ответный сигнал от сервера после обработки сообщения; - Сервер читает из переданного ему ранее (при создании потока) входного буфера в исследуемом процессе ф-цией ReadProcessMemory, затем в выходной буфер пишет ответ (WriteProcessMemory) и дает сигнал о продолжении работы потока; 5) управление возвращается в код перехватчика, который передает все параметры ф-ции; 6) После отработки ф-ции управление возвращается в перехватчик и вызывается постобработчик; 7) В постобработчике действия, как и в пре-, только без GetModuleHandleEx и GetModuleFileName, результат ф-ции возврашается вызывающей программе. Есть здесь один момент, указывающий на возможную ошибку: в передаче параметров самой ф-ции. Но это исключается, т.к. параметры передаются, копируя их из стека и нигде не предусмотрены изменения в скомпиленном asm-коде. Кроме того, как выше писалось, с такими же параметрами функция вызывалась без ошибки. Ну что может быть? В чем дело? ________________________________________________________________ Нашел, как игра переключает видеорежим. Это ChangeDisplaySettingsEx с параметром CDS_FULLSCREEN. Также, как блокируется Alt-TAB. Это SetWindowsHookEx с типом хука WH_KEYBOARD_LL (0x0D). Так что, не дожидаясь ответа, попробую перехватить то, что нужно, подменить параметры, брякнкнуться на CreateFile и подцепиться Олей... ----- IZ.RU |
|
Создано: 03 апреля 2010 07:47 · Поправил: DenCoder · Личное сообщение · #4 Не, докопался до NtCreateFile, дальше ВСЁ... Вот такие аргументы передаются этой ф-ции Code:
Возвращает в NtStatus STATUS_INVALID_PARAMETER. В чем дело? Может защита обнаруживает проникновение и блокирует доступ к драйверу? Нужен совет Clerk'а! ----- IZ.RU |
|
Создано: 03 апреля 2010 09:52 · Личное сообщение · #5 Залез идой в ntoskrnl, глянул на ф-цию KiSystemService. Открыл последный креш дамп, посмотел таблицы количества аргументов и функций. Оказывается, с установленным эмулятором HASP NtCreateFile перенаправляется в hardlock.sys через jmp dword ptr [833E84CAh] на адрес f58d32d8. hardlock.sys версии 3.40. Может кто-нибудь уже сталкивался с hardlock.sys? Очень нужна любая информация. ----- IZ.RU |
|
Создано: 03 апреля 2010 10:50 · Личное сообщение · #6 |
|
Создано: 03 апреля 2010 12:11 · Личное сообщение · #7 |
|
Создано: 03 апреля 2010 20:31 · Личное сообщение · #8 |
|
Создано: 03 апреля 2010 21:53 · Поправил: Larry · Личное сообщение · #9 |
|
Создано: 03 апреля 2010 23:46 · Личное сообщение · #10 BfoX пишет: я хз про что вы тут пишете Еще раз: без инжекта в прогу, защищенную хаспом, эмуль пашет нормально, с инжектом - на пятый раз драйвер не открывается. Подробное описание проблемы изложено BfoX пишет: возьмите мультикей или vusbbus и не парьтесь... Возьмусь, но у меня ж пытливый ум, хочу знать точную причину - защита это или ошибка дрова эмулятора. Чтоб потом, когда столкнусь опять - знать, что к чему. ----- IZ.RU |
|
Создано: 04 апреля 2010 06:42 · Личное сообщение · #11 Yahoo!!! Наконец понял, в чем дело: на подмену оригинального адреса ф-ции DeviceIoControl драйвер реагирует неадекватно. Передается где-то адрес ее в одном из блоков по 0x100 байт в шифрованном или нет виде, при этом драйвер похоже зацикливается - не стал дальше разбираться. То есть диагноз - ОШИБКА ДРАЙВЕРА. Заменил тип хука и проблем больше нет. Всем спасибо! Тему пока не закрываю - может у кого-то будут вопросы... ----- IZ.RU |
|
Создано: 04 апреля 2010 08:59 · Личное сообщение · #12 |
|
Создано: 04 апреля 2010 14:38 · Поправил: DenCoder · Личное сообщение · #13 BfoX, а сколько бы времени заняло у меня перебрать все эмуляторы хаспа и подобрать нужный? Тем более у меня, поскольку я в них не разбираюсь. У меня оно как будто есть. И потом я преследую сразу две цели: сделать загрузчик для проекта и написать тулзу... Так что спорный вопрос, какой из путей более легкий... для меня во всяком случае. Утилита для этого проекта уже дальше некуда, развиваться будет, когда закончу проект... ----- IZ.RU |
|
Создано: 04 апреля 2010 16:24 · Личное сообщение · #14 |
|
Создано: 04 апреля 2010 18:33 · Личное сообщение · #15 |
eXeL@B —› Крэки, обсуждения —› Непонятная ошибка открытия драйвера FEnteDev (hardlock.sys) смахивает на защиту |