Здравствуйте! Как можно проконтролировать целостность драйвера? Имеются ввиду не алгоритмы, так же понятно как проверить файл драйвера на диске. Вопрос в том, как это сделать в памяти (т.е. драйверу найти самого себя - и посчитаться)? И еще: насколько реально осуществить патч драйвера в памяти. Файл патчить, насколько я понимаю, в принципе, - возможно. Заранее благодарен за конструктивные ответы.
ну и чево тебе мешает ? если ты будешь проверять драйвер из стороннего кода, думаю , не составит труда перечислить модули загруженные, найти и посчитать, или отправь драйверу запрос, пусть скажет где он есть, но можно пофиксить. Патчить файл очень даже реально, только тебе пототом контрольную сумму пересчитать надо, тулзовин для этого валом.
Желательно бы не только из стороннего, но из самого драйвера проверить его же. Контрольная сумма - не стандартная (виндовая CRC), а алгоритм, вроде RMD и т.д.
Вопрос: как их (эти секции) найти в памяти? Если можно, какой-нибудь исходник, просвещающий по этому поводу...
Драйвер - исполняемый файл PE-формата. Там есть таблица секций, по которой можно определить их адреса и всё остальное. Документации по PE и по тому, как его парсить, навалом, в т.ч. и на васме.
Это понятно. Не понятно, как найти сам "кусок" памяти (оперативной), в котором содержится загруженный драйвер, и посчитать его. Формат, в данном случае, по-моему мне мало поможет.
NtQuerySystemInformation SystemInfoClass == SystemModuleInfo typedef struct _SYSTEM_MODULE { ULONG Reserved[2]; ULONG Base; ULONG Size; ULONG Flags; USHORT Index; USHORT Unknown; USHORT LoadCount; USHORT ModuleNameOffset; CHAR ImageName[256]; } SYSTEM_MODULE, *PSYSTEM_MODULE; typedef struct _SYSTEM_MODULE_INFORMATION { ULONG uCount; SYSTEM_MODULE sSystemModule[]; } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
Считать контрольную сумму кода ничего не мешает, однако сравнивать ее с контрольной суммой драйвера на диске не выйдет - ибо релоки будут по любому. Обходить релоки - гимор лишний. Можно конечно посчитать из DriverEntry и использовать как эталон при последующих сторонних проверках (когда релоки уже посчитаны). Или строить bitmap байтов из имиджа драйвера, которые используют релоки и обходить их
To eugene_: Спасибо за ответ. Конечно, сама методика контроля еще будет обдумываться, вопрос был про принцип.
хммм ..., а что мешает промапить файл с диска учитывая релоки,и сравнивать ? [add] упс, забыл о #pragma code_seg("INIT") , #pragma code_seg("PAGE") Хотя если это твой драйвер то все можно предусмотреть ... но если чужой то могут быть траблы ..
создаете себе геморой, данная задача в общем случае не имеет решения. Так что советую незаморачиваться