Сейчас на форуме: _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+9 невидимых)

 eXeL@B —› Основной форум —› Как делать дамп драйвера без SoftIce?
Посл.ответ Сообщение

Ранг: 13.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 18 мая 2005 08:55
· Личное сообщение · #1

Ничего конкретного нет, просто возникла мысль - а как, собственно, сделать дамп драйвера? Вот для обычных процессов есть множество утилит (да и каждый, наверное, ещё свою собственную написал). А с драйвером как быть?
Т.е. нужно выяснить, где "живет" данный драйвер и сделать дамп. При этом нужно как-то обходиться без привычного зацикливания на OEP. Да и доступ к памяти может отсутствовать... Неужели, нужно будет GDT править во время дампа?



Ранг: 186.8 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 18 мая 2005 10:02
· Личное сообщение · #2

На кой хрен? С помощью своего драйвера... Через IoGetDeviceObjectPointer и прочие функции ты можешь получить все необходимые для драйвера данные. А дальше извращайся как душе угодно... Есть кое-какие тонкости, но за ними в статьи Four-F-а и иную документацию...



Ранг: 13.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 мая 2005 19:22
· Личное сообщение · #3

Спасибо!
Я думал, есть какая-нибудь утилита, которая помогает снимать такой дамп. CTRL+2 раза Scroll Lock не очень удобен...




Ранг: 120.6 (ветеран)
Активность: 0.090
Статус: Участник
rootkit developer

Создано: 20 мая 2005 19:32
· Личное сообщение · #4

Для дампа драйвера следует написать собственный драйвер.
Определение положения и размера драйвера в памяти будет выглядеть так:
PVOID GetInfoTable(ULONG ATableType)

{
ULONG mSize = 0x4000;
PVOID mPtr = NULL;
NTSTATUS St;
do
{
mPtr = ExAllocatePool(PagedPool, mSize);
if (mPtr != NULL)
{
St = ZwQuerySystemInformation(ATableType, mPtr, mSize, NULL);
} else return NULL;
if (St == STATUS_INFO_LENGTH_MISMATCH)
{
ExFreePool(mPtr);
mSize = mSize * 2;
}
} while (St == STATUS_INFO_LENGTH_MISMATCH);
if (St == STATUS_SUCCESS)
{
DPRINT("GetInfoTable Success!");
DPRINT("Info table in memory size - %d", mSize);
return mPtr;
} else ExFreePool(mPtr);
DPRINT("Error on GetInfoTable %X", St);
return NULL;
}

PBYTECODE GetNtoskrnlInfo()
{
ULONG r;
PBYTECODE Result = NULL;
PSYSTEM_MODULE_INFORMATION_EX Info = GetInfoTable(SystemModuleInformation);

if (!Info) return NULL;
for (r = 0; r < Info->ModulesCount; r++)
{
if (strcmp(Info->Modules[r].ImageName, "ntoskrnl.exe"))
{
DPRINT("Found");
Result = ExAllocatePool(PagedPool, sizeof(BYTECODE));
Result->pAddress = Info->Modules[r].Base;
Result->size = Info->Modules[r].Size;
break;
}
}
ExFreePool(Info);
return Result;
}

Такую фигню можно даже с юзермода замутить, для этого можно заюзать мою ринг0 библиотеку, там есть все функции для этого (Ring0CopyMemory/GetKernelModuleAddress)

-----
Скажем дружно - нафиг нужно.





Ранг: 120.6 (ветеран)
Активность: 0.090
Статус: Участник
rootkit developer

Создано: 20 мая 2005 19:33
· Личное сообщение · #5

Только если хочешь сдампить ащищенный драйвер, то такая методика не прокатит, так что старфорс, фемиду или даже мой крякми сдампить таким образом не получится.

-----
Скажем дружно - нафиг нужно.



 eXeL@B —› Основной форум —› Как делать дамп драйвера без SoftIce?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати