![]() |
Получение базы kernel32.dll [Asm]
Вот решил провести эксперимент и написал (не без помощи сайтов) прогу (masm32), которая определяет адрес базы kernel32.dll:
Код:
.386 |
cmp word ptr [esi], "ZM"
jz WeGotBase после этого чекай на PE. А вообще байан редкостный. Тем более для dll не подходит. |
cmp word ptr [esi], "ZM" - разве это не есть проверка на PE
|
спрашивается а нафига её искать методом поиска?
Если же можно тупо взять из PEB Вариант с подмененным и неправильным PEB'ом можно расценивать как манию приследывания и последюю стадию шизофрении. Так что лучше юзать через PEB Под 2k, XP, 2k3 ты получишь адрес kernel32.dll а под w7 - адрес KERNELBASE KERNELBASE - это считай жалкий аналог kernel32.dll Но есть хитрость. В них в обоих есть функции GetProcAddress и LoadLibraryExA через который можно загрузить любую либу (хотябы туже kernel32 для w7) Для всякого малвара своего юзаю примерно такую схему: Код:
__declspec(naked) HMODULE GetKernel32(void)И пашет идеально на всей линейке NT начиная от 2k Другое дело в ядре искать адрес загрузки ядра, Там это уже нужно осуществлять перебор. Вот пример Код:
mov esi, dword ptr ds:[0ffdff038h]; адрес обработчика для IDLE |
>>>> cmp word ptr [esi], "ZM" - разве это не есть проверка на PE
это проверка на дос заголовок. В досовских exe файлах и в старом LE нету PE заголовка ) Проверка на PE делается так 1) находится ImageBase и проверяется сигнатура MZ 2) ImageBase + 0x3С - по этому офсету хранится DWORD указывающий смещение (относительно ImageBase) на PE заголовок 3) ImageBase + офсет на PE и по этому адресу проверяется двойное слово на сигнатуру 'P' 'E' 0x00 0x00 |
2slesh
жесть, зачем это делать ассемблерной вставкой? али влом структуры описывать и пользоваться макросами для LIST_ENTRY? |
по старинке юзаю из шелкодов )
Но вообще некоторые операции без асм вставки будут некрасиво выглядеть. Допустим та же mov eax,fs:[0x30], которую придется заменить на соотвествующую апишку |
дык понятно, я это тоже вставкой делаю. Но доступ то к полям пеба )))
|
Код:
mov esi,[eax+0x1c]А ещё сравнил бы на всякий случай имя библиотеки |
2desTiny
как зачем, а указать lodsd откуда грузить значение? Мы ж обращаемся ко второму LDR_MODULE_ENTRY в цепочке. а проверять не нужно, там постоянно ntdll->kernel32->[user32]->... |
mov esi,[eax+0x1c]
lodsd ~ mov eax, [eax+0x1c] mov eax, [eax] и нафиг не нужны эти первый пуш и последний поп >> там постоянно никто ничего не обещает. Вот если ты так уверен в порядке - ну-ка сходу скажи, где в цепочке будет kernelbase.dll? |
как получать API? Сколько кода просмотрел нигде не нашел рабочего
|
почитай например http://www.phrack.com/issues.html?issue=62&id=7
|
Таких пару статей прочитьтать и на дурку )))
|
2desTiny
а зачем мне kernelbase.dll? главное я чотко уверен, что под всей линейкой ntdll->kernel32. Остальное в принципе не интересно ) в данном случае. Поэтому проверять не надо. |
>>главное я чотко уверен
А вот семёрке плевать на твою уверенность. |
ладно, пойду семерку ставить на виртуалку и смотреть )
|
Для самоуверенных читать мой пост где я кинул кусок кода и там описал что и как.
И То что нужно искать там LoadLibraryExA/W потому что других подобных нету. Это пришлось сделать именно из-за W7 потому как именно kernelbase там получалась а не kernel32. |
Верно ли написан код получения GetProcAddress ? Вроде все как в туториале
Код:
.386 |
| Время: 01:42 |