Сейчас на форуме: tyns777, zombi-vadim (+4 невидимых) |
eXeL@B —› Программирование —› Help -> Работа с Ntdll.dll |
Посл.ответ | Сообщение |
|
Создано: 25 ноября 2007 21:30 · Личное сообщение · #1 Из своей программы, получаю адресс загрузки NTDLL.DLL и хочу анализировать PE-заголовок, но при попытки проверки MZ-сигнатуры выдается сообщение об ошибки, ошибка доступа к памяти, доступ к памяти запрешен! VirtualProtect на весь SizeOfImage из NTDLL.DLL тоже не помогает, хотя функция возвращает не ноль. При просмотре программы через ollyDBG, моя программа анализирует загловок NTDLL.DLL и выполняет то, что запланировано без ошибок. Как я понел: При выполнении моей проги в контексте отладчика (т.е. при просмотре в ольке) ошибок при обращении к адрессному пространству NTDLL.DLL - НЕТ, как добиться нормальной работы, в чем тут проблема??? |
|
Создано: 25 ноября 2007 22:47 · Личное сообщение · #2 |
|
Создано: 25 ноября 2007 23:32 · Личное сообщение · #3 |
|
Создано: 26 ноября 2007 01:37 · Личное сообщение · #4 |
|
Создано: 26 ноября 2007 10:15 · Поправил: DMD · Личное сообщение · #5 |
|
Создано: 26 ноября 2007 12:04 · Поправил: GlOFF · Личное сообщение · #6 Paxan Спасибо за ссылку! DMD xor dx, dx - это вроде и есть выравнивание на 64 кб границу. Аналогочно and edx, 0FFFF0000h, а and edx, 0FFF00000h чуть меньше в цикле болтаться. Странный факт! Заходим в ОЛЮ, при загрузке модуля на вершине стека [esp] лежит адресс в kernel32 , а на [esp+4] адресс в ntdll. А при запуске вне отладчика, по [esp+4] совсем другой адресс. (Проверял через вывод в MessageBox) Вот я и оперался на [esp+4]. Может здесь ошибка. Потому, что в отладчике и вне его структура стека различна? |
|
Создано: 26 ноября 2007 12:28 · Личное сообщение · #7 |
|
Создано: 26 ноября 2007 12:34 · Поправил: Ice-T · Личное сообщение · #8 |
|
Создано: 26 ноября 2007 12:38 · Поправил: Ice-T · Личное сообщение · #9 |
|
Создано: 26 ноября 2007 14:45 · Личное сообщение · #10 |
|
Создано: 26 ноября 2007 15:12 · Поправил: Ice-T · Личное сообщение · #11 |
|
Создано: 26 ноября 2007 15:37 · Поправил: DMD · Личное сообщение · #12 |
|
Создано: 26 ноября 2007 15:46 · Личное сообщение · #13 |
|
Создано: 26 ноября 2007 15:59 · Личное сообщение · #14 |
|
Создано: 26 ноября 2007 16:23 · Личное сообщение · #15 |
|
Создано: 26 ноября 2007 16:27 · Поправил: UsAr · Личное сообщение · #16 |
|
Создано: 26 ноября 2007 16:31 · Поправил: Ice-T · Личное сообщение · #17 есле адрес GetModuleHandle уже известен, то да.. а так, исходя из того, что автору понадобилась база нтдлл и того, что он не пошел стандартным путем, что-то подсказывает мне, что в импорте GetModuleHandle и GetProcAddress нету.. тогда их придецо искать в экспорте kernel32 предварительно получив его базу, а это буит проблемнее.. з.ы. про базу нтдлл не знал, а вот у кернел32 изменить можна и тогда такое пролистывние уведет хз куда.. ----- invoke OpenFire |
|
Создано: 26 ноября 2007 17:29 · Поправил: DMD · Личное сообщение · #18 Ice-T пишет: есле адрес GetModuleHandle уже известен, то да.. а так, исходя из того, что автору понадобилась база нтдлл и того, что он не пошел стандартным путем, что-то подсказывает мне, что в импорте GetModuleHandle и GetProcAddress нету.. тогда их придецо искать в экспорте kernel32 предварительно получив его базу, а это буит проблемнее.. з.ы. про базу нтдлл не знал, а вот у кернел32 изменить можна и тогда такое пролистывние уведет хз куда.. ну ты и загнул! это же его собственное приложение! GlOFF пишет: Из своей программы, получаю адресс загрузки NTDLL.DLL и хочу анализировать PE-заголовок так что ни содержимое импорта, ни способы получения базы NTDLL проблему составить не должны. Ладно, все по разу лопухнулись - внимательнее будем на будующее а GlOFF истоки проблемы озвучил: нужно правильно найти какой-нибуть адрес из пространства NTDLL для поиска MZ-сигнатуры через листание страниц sub EDX,01000h
или в лоб получить базу через GetModuleHandle. и, похоже, свою проблему уже решил. |
|
Создано: 26 ноября 2007 17:33 · Личное сообщение · #19 |
|
Создано: 26 ноября 2007 19:16 · Личное сообщение · #20 Ice-T пишет: GlOFF пишет: ( xor dx, dx ) == ( and edx, 0FFFF0000h ) но это совсем не равно and DX,0F000h !!! у вас получаецо размер страницы 010000h == 65536 == 64кб !!!!!!! а она равна 4кб == 4096 == 01000h Я понимаю, что мой способ не пойдет для обычных файликов, но для системных библиотек, как сказал DMD пишет: для системных длл такое "упрощение" допустимо. // Использую только динамический импорт (GetModuleHandle, GetProcAddress, .. не предлогать ). Про PEB слышал, что недокументировано и может измениться в любой момент. Или какая разница? |
|
Создано: 26 ноября 2007 19:51 · Личное сообщение · #21 |
|
Создано: 26 ноября 2007 20:16 · Личное сообщение · #22 GlOFF пишет: Про PEB слышал, что недокументировано и может измениться в любой момент. да изменицо может все, что угодно.. пиши код, тестируй его на разных осях, при необходимости добавляй проверку осверсии.. GlOFF пишет: для системных длл такое "упрощение" допустимо. это имхо, но я бы не рисковал, ибо например в висте много что изменилось, что было допустимо в ранних виндах.. ну а отнимать по 64кб вообще не стОит.. ----- invoke OpenFire |
|
Создано: 28 ноября 2007 09:53 · Личное сообщение · #23 |
|
Создано: 28 ноября 2007 18:06 · Личное сообщение · #24 |
|
Создано: 28 ноября 2007 18:27 · Личное сообщение · #25 наверное тут: MSDN Library - January 2005 Kernel-Mode Driver Architecture: Windows DDK ZwMapViewOfSection Parameters BaseAddress Pointer to a variable that receives the base address of the view. If the value of this parameter is not NULL, the view is allocated starting at the specified virtual address rounded down to the next 64-kilobyte address boundary. ----- HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE |
|
Создано: 28 ноября 2007 18:27 · Личное сообщение · #26 |
eXeL@B —› Программирование —› Help -> Работа с Ntdll.dll |