Доброго времени суток, разбираюсь с расположением ядра и Hal в озу. в хрюше они лежали в 1й 4мбной странице, а эта страница лежала по одному и тому же адресу. а что происходит в вин7? мои эксперименты показали что как минимум они расположены по разным адресам (в принципе это и так известно) и хал меняет свое расположение относительно ядра, он расположен, то по меньшим, то по большим адресам. размер ядра 3,71мб, то есть ему нужна своя страница в 4мб. может кто то разбирался с данным вопросом, и может дать информации для размышления? windows seven x32 без сервис паков
drem1lin В Vista и Seven одинаково происходит выбор адресов для ядра и hal.dll. В принципе, у меня в планах было написать статью, в которой эта мелочь была бы упомянута, но раз уж вопрос прямо задан на форуме, а я уже более полугода, как не выделю время для написания статьи... В общем, псевдокод (из winload!OslpLoadAllModules) для выбора адресов выглядит так: Код (Text): ImageBufferBase = BlImgAllocateImageBuffer(KernelImageSize+HalImageSize+0x21000); Rnd5bit = (RDTSC() >> 4) & 0x1F; if (RDTSC() & 0x10) { RandomizedKernelImageBase = ImageBufferBase + ((Rnd5bit + (HalImageSize >> 12)) << 12); RandomizedHalImageBase = RandomizedKernelImageBase - HalImageSize; } else { RandomizedKernelImageBase = ImageBufferBase + (Rnd5bit << 12); RandomizedHalImageBase = KernelImageSize + RandomizedKernelImageBase; } Причём BlImgAllocateImageBuffer возвращает адреса довольно стабильно (на одном и том же железе всегда одинаково). Чаще всего (в моих тестах) на живом железе наблюдаются следующие значения: Vista: 0x83600000 (0xe3600000 в случае, если increaseuserva установлен, причём независимо от его значения) Seven: 0x82600000 (0xe2600000 в случае, если increaseuserva установлен, причём независимо от его значения) Кстати, в Vista у меня ядро грузится в большие страницы, а в Seven в 4KB-страницы. Но почему так и насколько это стабильно, я не разбирался.
l_inc на счет 4мегабайтных страниц у меня была только гипотеза. просто у меня есть физические адреса 2х функций, одна из ядра, другая их хала. и надо найти базовые адреса самих модулей. вот как тогда это сделать? не повлияют на это маленькие страницы? просто раньше я хоть был уверен что они лежат последовательно в памяти.
drem1lin Есть физические адреса, а найти надо базовые физические или виртуальные? Кто "они"? Модули? Страницы? В какой памяти? Физической? Виртуальной? На все вопросы: они лежат последовательно в памяти.
надо найти базовые физические адреса модулей, зная физический адрес какой либо функции внутри него. то есть можно тупо уменьшать адрес пока на mz не натолкнешься?
l_incдоступ у меня прямой, в смысле интервалами по 4 кб? можете поподробнее расписать вашу мысль, пожалуйста.
drem1lin Ну стандартный scandown. Не каждый же байт на PE-сигнатуру проверять? Так как (очевидно, исходя даже из выше приведенного псевдокода) база образа выравнена на 4KB, значит можно scandown делать так: Код (Text): BYTE *nextAddress = startAddress & ~(0x1000 - 1); while (!IsPeHere(nextAddress)) nextAddress-=0x1000;