|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 16, 2004 15:46:53 обнаружил, что на НЕКОТОРЫХ компах (вин 2000/ХР/2003) есть защита от записи в SDT. SEH фаулт уловить не может. Есть выход - подправить реестр и перезагрузить машину, но это не выход. Можно ли как нето обойти защиту? |
|
|
Дата: Май 17, 2004 05:01:29 Можно. Искать по форуму помогает! |
|
|
Дата: Май 17, 2004 14:47:50 Corpse А В ЧЁМ ТРАБЛЫ ТО ?? ПОСМОТРИ, НЕ УСТАНОВЛЕН ЛИ БИТ WP (16) РЕГИСТРА CR0 ? Насколько мне известно, в хапэ он был выставлен . |
|
|
Дата: Май 17, 2004 16:25:55 Corpse, если в системе с w2k < 128 метров, то ntoskrnl отображается на маленькие (4кб) страницы и защиту памяти можно выставить для каждой страницы отдельно. Если памяти => 128, то отображение идет в большую (4мб) страницу. И защита, естественно, выставляется в read/write для всей страницы. Иначе ntoskrnl не сможет писать в свою секцию данных. Для ХР граница в 128 метров, вроде, сдвинута на 256. Сброс бита WP в CR0, использующийся повсеместно, есть некультурный метод, т.к. защита снимается глобально. Кстати в интеловских доках написано, что этот флаг действует только если ядро пишет в юзерные (но не в ядерные) read-only страницы. Хотя, вроде, и для ядра это тоже работает. Я как-то эксперементировал с этим. Результатов, конечно не помню :), но помню, что там не всё так гладко было. Вобщем, есть почти документированный способ через переотображения памяти. Для начала см. код "Figure 13 Writing Read-only Memory" к статье "The VTrace Tool: Building a System Tracer for Windows NT and Windows 2000" в MSDN. Если есть исходники regmon, то см. \lib\reglib.c. Или вот процедура, кот. переотображает read-only память для записи. RemapToWrite proc pAddress:PVOID, dwSize:DWORD
local p:PVOID
local pMdl:PMDL
invoke MmCreateMdl, NULL, pAddress, dwSize
.if eax != NULL
mov pMdl, eax
invoke MmBuildMdlForNonPagedPool, pMdl
mov eax, pMdl
or (MDL PTR [eax]).MdlFlags, MDL_MAPPED_TO_SYSTEM_VA
invoke MmProbeAndLockPages, pMdl, KernelMode, IoWriteAccess
invoke MmMapLockedPages, pMdl, KernelMode
.if eax != NULL
mov ecx, pMdl
mov ecx, (MDL PTR [eax]).ByteOffset
add eax, ecx ; + MmGetMdlByteOffset(pMdl)
mov p, eax
; Write to it
mov ecx, p
mov dword ptr [ecx], 12345678h
;
invoke MmUnmapLockedPages, p, pMdl
.endif
invoke ExFreePool, pMdl
.endif
ret
RemapToWrite endp
Если будешь использовать её для патча таблицы сервисов, то убери MmProbeAndLockPages, т.к. эта память и так заблокирована и 100% присутствует. Код для NT и выше. Если для 2000+, то лучше заменить MmCreateMdl -> IoAllocateMdl, MmMapLockedPages -> MmMapLockedPagesSpecifyCache, ExFreePool -> IoAllocateMdl. См. также "MmMapLockedPages Returns Actual Virtual Address In SP4" в MSDN. Также см. "Драйверы режима ядра. Часть 9 : Базовая техника: Работа с памятью. Разделяемая память" Там не совсем то что те нужно, но тоже манипуляции с переотображением физической памяти. Уфф... :) |
|
|
Дата: Май 17, 2004 17:51:30 интеловцы п..дят в мануалах; т3 гл. 4.11 описывыет "сказочные" возможности WP, о которых беcпордонно умолчали в гл 2.5; свлчи свлчи свлчи |
|
|
Дата: Май 17, 2004 18:01:22 спасиб. буду пробывать. у меня никогда меньше 256 памяти небыло, поэтому у себя такое я никогда не наблюда... теперь всё стало на свои места. |
|
|
Дата: Май 17, 2004 18:01:40 Four-F но ведь это же расточительно с точки зрения процессороного времени с точки зрения буферов трансляции адресов... Или хранить бальшую страинцу (TLB), которая не выгрузится, или кучу маленьких, который постоянно надо будет туда сюда перекладывать. Я не могу понять M$ ни в одном случае..... |
|
|
Дата: Май 17, 2004 18:07:55 проблема была в том, что не мог понять почему на одних тачках всё нормально, а на других труба полная. |
|
|
Дата: Май 17, 2004 19:29:32 Corpse [offtop]Слушай, а ты случаем не тот corpse который A-311 Death напрогал???[/offtop] |
|
|
Дата: Май 18, 2004 00:43:19 [ Corpse: у меня никогда меньше 256 памяти небыло, поэтому у себя такое я никогда не наблюда... ] Ну это не беда. Уменьшить всегда можно. multi(0)disk(0)rdisk(0)partition(1)\WINNT="2000 Pro" /fastdetect /noguiboot /maxmem=96 [ CARDINAL: но ведь это же расточительно с точки зрения буферов трансляции адресов... ] Вынужден тебя огорчить. Всё именно так как ты сказал, но только наоборот. См. 3-ий том мануалов. "3.6.2.3. MIXING 4-KBYTE AND 4-MBYTE PAGES ... A typical example of mixing 4-KByte and 4-MByte pages is to place the operating system or executive’s kernel in a large page to reduce TLB misses and thus improve overall system performance." ЗЫ: volodya, я там мыльнул тебе. Сам решай что с этим делать. |
|
|
Дата: Май 18, 2004 15:17:11 Four-F ну про количество памяти я говорил только к тому, что в голову просто не могло прийти, что это может влиять на наличие постраничной защиты. но опять же - наличие в системе 512 мег памяти совсем не значит, что в SDT можно спокойно писать. ровно как установленный 16 бит в CR0 это не указатель на то, что писать нельзя. кстати вышеуказанный кусок кода верен только для NT 4.0 . Для 2К шаманство с возвращённым MmMapLockedPages значением не нужно. |
|
|
Дата: Май 18, 2004 21:07:15 [ Corpse: но опять же - наличие в системе 512 мег памяти совсем не значит, что в SDT можно спокойно писать. ] Очень может быть. [ Corpse: ровно как установленный 16 бит в CR0 это не указатель на то, что писать нельзя. ] Хрен его знает. [ Corpse: кстати вышеуказанный кусок кода верен только для NT 4.0 . Для 2К шаманство с возвращённым MmMapLockedPages значением не нужно. ] Он верен (точнее будет работать) для nt4 и далее. Про шаманство в KB199311 написано. Для nt4+sp4 и выше оно не нужно, но и не мешает. |
|
|
Дата: Май 20, 2004 03:48:29 Four-F Спасиба !!! Хм, теперь я ещё громче убедился, что не стоит везде и во всём слепо верить книгам отечественных авторов :)) |
|
|
Дата: Май 21, 2004 16:49:33 ... и не отечественных тоже.... |
|
|
Дата: Май 27, 2004 11:41:14 Corpse Вопрос тебя не Владимиром зовут |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066 |