Ребята кто работал с ядром под Окно скажите пожалуйста как просмотреть таблицу импорта в kernell32.dll? Когда ось читает IMAGE_IMPORT_DESKRIPTOR и начинает грузить от туда приложения (ну dll вроде) , после этого она нафинает подгружать действительные адреса функций, скажите пожалуйта как узнать этот адрес или внести изменения в таблицу импорта чтобы там выполнялась другая функция - моя какаянить или изменить одну из тех? Прошу помогите, я с асемблером немножко не в ладах, да и вообще почти не разбираюсь в компах. Если можно хотябы опишите последовательность действий и определение точек в хода в необходимые процедуры.... Всем умным с меня плюсики и всем отзывчивым пасибки заранеее.... PS: от незнания чувствую себя убого....
Flame of Soul Немного не понятно, что ты хочешь посмотреть в ядре. В конечном итоге я думаю тебе нужно получить адреса функций которые экспортируются??? Т.е. сделать динамический импорт в твоем EXE ???
мне необходимо сделать захват функции (любой но лучше реже используемой) таким способом чтобы непосредственно изменить ее код, то есть внедрить как бы свою функцию. Желательно это сделать именно с помощью непосредственного внедрения, так как при этом вроде недолжно возникать проблем с отложенной загрузкой библиотеки. Я не знаю как выразиться на доступном языке (ну я же только начинаю). Я хочу чтобы мой экзешник мог переписать какуюнибудь функцию из ядра или изменить таблицу импорта, при этом чтобы небыло ни каких проблем доступа при обращении к процессу. Чтобы можно было вместо стандартных функций обращаться к моим и таким образом скрывать процесы, файлы и вообще все что возможно спрятать,а также иметь доступ ко всем файлам и другим процессам и удалять из изменять вырубать и делать с ними что только влзможно, и не важно что это антивирус какойто, чтобы сказала закрыть его и он заткнулся...(((((((
ху8 се маленькая помощь? "Поскольку структуры объектов ядра доступны только ядру, приложение не может самостоятельно найти эти структуры в памяти и напрямую модифицировать их содержимое Такое ограничение Microsoft ввела намеренно, чтобы ни одна программа не нарушила целостность структур объектов ядра. Это же ограничение позволяет Microsoft вводить, убирать или изменять элементы структур, нс нарушая работы каких-либо приложений." Читай легендарного Дж. Рихера..."Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" ... раздел : "Обьекты ядра"
1) Получение адресса загрузки ядра. Через LoadLibrary("kernel32.dll") получаем адресс загрузки ядра, можно использовать и другие методы как PEB или поиск по сигнатуре MZ при старте проги первым в стеке лежит аддрес в ядро, исходя из него ищется MZ и получаем адресс загрузки. 2) Зная адресс загрузки, анализируем ядро, как обычный PE-файл, т.е. ддос заголовок, потом PE заголовок, потом переходим в директорию экспорта и получаем адресса необходимых нам процедур, расположенных в ядре.
inline funktion hooking - система превосходящая IAT (захват таблицы импорта), называеться захват функции путем прямого изменения ее кода. У нее нет проблем с занятостью приложений. С помощью него можно напрямую изменять код ужной нам захватываемой функции, и поэтому всей системе плевать как и когда и кто разрешит адреса этих функций. Должно выглядеть это примерно так для видоха ХР второй серки: сначала сохраняються несколько байт целеой функции, которые заменються 5-ти байтовой (вроде под их пи так) функцией перехода. 5 байт требует инструкция безусловного перехода, которую сами мелкомяхкие и разработали - а сделали они это чтобы их продукты имели возможноть обновляться в режиме онляма без перегрузки.... И не стоит говорить так как изменения как надеюсь мой лапочка Jes (пасибки те за внимание) ты понял касаються самого ядра.... а помощь мне нужна небольшая, всеголишь узнать как просмотреть таблицу импорта, я не могу ее найти а по правде и не умею толком, и как нати адреса начала функий и больше ничего((( как получаем эти адеса объясни пожалуйста..... пожалуйстаааааа.....
Простите если примете за флуд, то что я сейчас напишу ниже взято с нескольких книжек, так что то что тут написано неотноситься к моим заслугам ни как. Привожу это для тех кто возможно когда-то столкнеться с такой же проблемой как и я. Спасиба GlOFF за прекрасную подсказку: вот держи поцелуй и +сиков поставлю когда снова разрешат... Detour patching - внедрение обходного пути, позволяя передать управление за пределы функции. 1) Изменение пути прохождения выполнения программы. Производиться захват 2-х функций ядра - SeAccessCheck и NtDeviceIoControlFile ? самое главное нам необходимо найти эту функцию в дебрях памяти. Но с этими функциями проще так как они экспортируються ядром, следовательно можно найти их адресаотсканировав заголовок PE-файла(что и предложил мне мой любимчик GlOFF), но оказываеться есть более пикантный способ))). Но есть и пара проблем: a) Выравнивание инструкций (не все инструкции одинаковы в длинне) например JUMP бывает длинной до 7 байт, а PUSH может и 1 байт байты оригинальной функции | 55 | 8B | EC | 53 | 33 | DB | 38 | 5D | 24 PUSH MOV...................PUSH XOR CMP А этот код надо вставить | EA | AA | AA | AA | AA | 08 | 00 | | FAR JMP Как видим последние ячейки не забиты, но ктото очень давно, явно симпатичный русский парень придумал NOP коорая нам позволяет их просто побайтно забить | EA | AA | AA | AA | AA | 08 | 00 | 90 | 90 FAR JMP............................NOP NOP Если не сделать этого то система падет)))) (инфо для самых вредных) 2) Проверка версии функции (заранее) Делаеться для того чтобы убедиться того ли мы парня (простите) ту ли мы функцию пытаемся заарканить под венец. В данном примере находиться сначала указатель на функцию, а потом побайтовое сравнение значений.(находим это с помощью SoftICE) И незабываем про длинну последовательности по сравниваниу функций, одна имеет длинну 8 а другая 9 байт. NTSTATUS CheckFunctionBytesDeviceIOControlFile() { int i=0; char *p=(char *)NTDeviceIOControlFile; //начало функции DeviceIOControlFile //должно быть //55 PUSH EBP //88EC MOV EBP. ESP //6A01 PUSH 01 char c[] - {0x55. 0x8B. 0xEC. 0x6A. 0x01. 0xFF. 0x75. 0x2C}; while(i<8) { DBGPrint(" - 0x202X". (unsignet char)p); if(p != c) { return STATUS_UNSUCCESSFUL; } i++; } return STATUS_SUCCESS; } NTSTATUS CheckFunctionBytesSeAccessCheck() { int i=0; char *p = (char *)SeAccessCheck; // Начало функции SeAccessCheck // должно быть: //55 PUSH EBP //88EC MOV EBP. ESP //53 PUSH EBX //33DB CMP [EBP+24]. BL char c[] - {0x55. 0x8B. 0xEC. 0x53. 0x33. 0xDB. 0x5D. 0x24}; while(i<9) { DBGPrint(" - 0x202X". (unsignet char)p); if(p != c) { return STATUS_UNSUCCESSFUL; } i++; } return STATUS_SUCCESS; } 3) Исполнение удаленных инструкций Внедряемый код просто передает управление дальше на инструкцию "голая функция", тоесть мы имеет готовый шаблон для внедрения и компилятор не вставляет ни каких дополнительных инструкций что защищает наш стек от повреждений. Но при просмотри оказываеться что там есть инструкция дальнего перехода, и прмтов в закодированном виде. Но это не особо сложная проблема так как emit позволяет передавать данные сразу на выход компилятора. Причем всем кто не знает на заметку, спомошью этой функциии можно компилятору всучить неизвесные инструкции, самомодифицирующийся код и сложно составные строки и скушать он должен это без вопросов. //голые функции не имеют порога и эпилога //здесь они применяються как цепь для интсрукций гото (goto) _declspec(naked) my_function_detour_seaccesscheck() { _asm { // выполняем потерянные инструкции push ebp mov ebp. esp push ebx xor ebx. ebx cmp [ebp+24. b] // возврат в захваченную инструкцию // на следующую инструкцию за инструкцией перехода _emit 0xEA _emit 0xAA _emit 0xAA _emit 0xAA _emit 0xAA _emit 0x08 _emit 0x00 } } // прежде чем внедрить обход функцию поместим в область неменяемой памяти _declspec(naked) my_function_detour_ntdeviceiocontrolfile() { _asm { // выполняем потерянные инструкции push ebp mov ebp. esp push 0x01 push [ebp+0x2C] // возврат в захваченную инструкцию // на следующую инструкцию за инструкцией перехода // нам нужен дальний переход _emit 0xEA _emit 0xAA _emit 0xAA _emit 0xAA _emit 0xAA _emit 0x08 _emit 0x00 } } 4) Неперемещаемый пул памяти Думаю все прекрасно понимают что код не должен висеть в перемещаемой памяти и все представляют чем это чревато. Поэтому есть красивый ход, перенести его в область неизменяемой памяти. при использовании неперемещаемого пула памяти появляеться класное свойство, ваш код функции рута скопирован туда а тот драйвер чьи функции мы использовали может загружаться и выгружаться и это нас ни как не косаеться. 5) изменение адресов во время выполнения программы Если кто обратил внимание 0xAAAAAAAA И 0x11223344 это нерабочие адреса, сделано это для того чтобы когда код обхода будет внедрен мы могли их с радостью изменить, это незя было сделать раньше так значения этих адресов можно получить только во время исполнения программы. Остаеться добаить только то, что дальше следует изменение этих адресов путем вписывания кода поверх оригинальных иструкций, выравнивания функции и использования этих адресов. Простите я думаю хватит, то что мне необходио было я нашла, но вот разбираться с этим и дорабатывать это очень большая пища для размышлений прежде чем идти дальше, всем пасибо. Тему думаю можно закрывать, а на счет удаления вам решать господа модераторы, всем спасибо!!!
Для этого валяется технология сплайсинга от Ms-rem-а.... в недрах Wasm /P.S/ он не пытался перевернуть мир но технология та же.