Ну, наверное, был какой-то глубокофилософский смысл в строках на стеке и парсинге номеров сисколлов из копии нтдлл, но я, честно говоря, хер понимаю, зачем такое делать в протекторе, который якобы предназначен для легитимного софта.Впечатляет, сразу видно настоящий малварокодер писал, особенно понаравилось - uint32_t WINAPI SetupImage()
То есть функции уходящие за горизонт тебе ок? Декомпозиция для слабаков? Коды сисколов ифами бл#ть вместо сделать нормальные таблицы. Всратая работа со строками, да это образцовый говносорец.https://github.com/Alukym/VMProtect-Source/blob/master/runtime/VMProtect.Runtime/VirtualMachine.cs - не, ну на реализацию ВМ в любом случае интересно посмотреть, но я ожидал большего. Опкоды линейно соответсвуют MSIL, а реализация некоторых из них через DynamicMethod - ну это читерство, как будто просто забили хер и не стали делать нормально.
Ну, наверное, был какой-то глубокофилософский смысл в строках на стеке и парсинге номеров сисколлов из копии нтдлл, но я, честно говоря, хер понимаю, зачем такое делать в протекторе, который якобы предназначен для легитимного софта.
Чтобы сложнее было в динамике ковырять?Ну, наверное, был какой-то глубокофилософский смысл в строках на стеке и парсинге номеров сисколлов из копии нтдлл, но я, честно говоря, хер понимаю, зачем такое делать в протекторе, который якобы предназначен для легитимного софта.
Когда уже статья по готовке дотнета, дядя дилдо?https://github.com/Alukym/VMProtect-Source/blob/master/runtime/VMProtect.Runtime/VirtualMachine.cs - не, ну на реализацию ВМ в любом случае интересно посмотреть, но я ожидал большего. Опкоды линейно соответсвуют MSIL, а реализация некоторых из них через DynamicMethod - ну это читерство, как будто просто забили хер и не стали делать нормально.
Не увидел там получения нормеров из ntdll, их там вроде захардкодили, может что-то упустил, недосмотрел.парсинге номеров сисколлов из копии нтдлл
А зачем вообще номера хардкодить ? HaloGate для особо продвинутых ? Это надежнее чем хардкодить их в таблицы или даже говнокодить через ифы. На нестандартных билдах винды могут быть носоответствия, а даже если поднять все архивные версии винды, вручную вытянуть номера и захардкодить, то это ебанутый оверхед. Самый проверенный способ - пробегаемся по всем экспортным именам ntdll, составляем таблицу экспортных адресов, сортируем. Все. Дальше находим любой не хукнутый сискол, и определяем какой он по счету от того, который нас интересует (хукнутый), разница в индексах в отсортированном массиве экспортных адресов будет разницей в номерах сисколов. Отсюда в зависимости от расположения первого и второго сложением или вычитанием вычисляется нужный номер. Безотказная техника. Все в рантайме, без чтения с диска, никаких копий ntdll в памяти и никаких захардкоженых значений. Работает на любой винде с самых первых NT версий. Кода в разы меньше. Да тут одни только плюсы и вообще нет минусов. Почему люди живут технологиями уходящими за горизонт ?Коды сисколов ифами бл#ть вместо сделать нормальные таблицы
Ну я про этот фрагмент:Не увидел там получения нормеров из ntdll, их там вроде захардкодили, может что-то упустил, недосмотрел
sc_close = LoaderParseSyscall(LoaderGetProcAddress((HMODULE)copy_ntdll, reinterpret_cast<const char *>(FACE_NT_CLOSE), true));
sc_virtual_protect = LoaderParseSyscall(LoaderGetProcAddress((HMODULE)copy_ntdll, reinterpret_cast<const char *>(FACE_NT_VIRTUAL_PROTECT_NAME), true));
sc_open_file = LoaderParseSyscall(LoaderGetProcAddress((HMODULE)copy_ntdll, reinterpret_cast<const char *>(FACE_NT_OPEN_FILE_NAME), true));
sc_create_section = LoaderParseSyscall(LoaderGetProcAddress((HMODULE)copy_ntdll, reinterpret_cast<const char *>(FACE_NT_CREATE_SECTION_NAME), true));
sc_map_view_of_section = LoaderParseSyscall(LoaderGetProcAddress((HMODULE)copy_ntdll, reinterpret_cast<const char *>(FACE_NT_MAP_VIEW_OF_SECTION), true));
sc_unmap_view_of_section = LoaderParseSyscall(LoaderGetProcAddress((HMODULE)copy_ntdll, reinterpret_cast<const char *>(FACE_NT_UNMAP_VIEW_OF_SECTION), true));
sc_query_information_process = LoaderParseSyscall(LoaderGetProcAddress((HMODULE)copy_ntdll, reinterpret_cast<const char *>(FACE_NT_QUERY_INFORMATION_PROCESS_NAME), true));
sc_set_information_thread = LoaderParseSyscall(LoaderGetProcAddress((HMODULE)copy_ntdll, reinterpret_cast<const char *>(FACE_NT_SET_INFORMATION_THREAD_NAME), true));
sc_query_virtual_memory = LoaderParseSyscall(LoaderGetProcAddress((HMODULE)copy_ntdll, reinterpret_cast<const char *>(FACE_QUERY_VIRTUAL_MEMORY_NAME), true));
Ну в целом да, но строки можно было бы и пошифровать, не то чтобы их нахождение в коде больше усложняет жизнь реверсеру, чем их шифрование. Насчет сисколлов, типа чтобы нельзя было бряк поставить на апишку, ну в этом есть смысл, но тоже реализация странноватая.Чтобы сложнее было в динамике ковырять?
Лол, я уже и забыл об этом думать. Я решил взять только обзор обфускации дотнетов, дошел до 15к символов, хотя описал только базовую часть без конкретных алгоритмов, понял, что в одну статью все не влезет, и на этом остановился. Ну я подумаю, может, найду время к этому вернуться.Когда уже статья по готовке дотнета, дядя дилдо?
Блин ну ладноЛол, я уже и забыл об этом думать. Я решил взять только обзор обфускации дотнетов, дошел до 15к символов, хотя описал только базовую часть без конкретных алгоритмов, понял, что в одну статью все не влезет, и на этом остановился. Ну я подумаю, может, найду время к этому вернуться.
А как мы будем находить _настоящий_ ntdll в котором хукали сплайсом на точки входа в апи и никаких сюрпризов не подкинули? Я вам более скажу доверять извлеченной из пеб информации про версию тоже стоит с осторожностью и прощупывать почву уже чрез вызовы и анализ ответа. Комформизм губитНе увидел там получения нормеров из ntdll, их там вроде захардкодили, может что-то упустил, недосмотрел.
А зачем вообще номера хардкодить ? HaloGate для особо продвинутых ? Это надежнее чем хардкодить их в таблицы или даже говнокодить через ифы. На нестандартных билдах винды могут быть носоответствия, а даже если поднять все архивные версии винды, вручную вытянуть номера и захардкодить, то это ебанутый оверхед. Самый проверенный способ - пробегаемся по всем экспортным именам ntdll, составляем таблицу экспортных адресов, сортируем. Все. Дальше находим любой не хукнутый сискол, и определяем какой он по счету от того, который нас интересует (хукнутый), разница в индексах в отсортированном массиве экспортных адресов будет разницей в номерах сисколов. Отсюда в зависимости от расположения первого и второго сложением или вычитанием вычисляется нужный номер. Безотказная техника. Все в рантайме, без чтения с диска, никаких копий ntdll в памяти и никаких захардкоженых значений. Работает на любой винде с самых первых NT версий. Кода в разы меньше. Да тут одни только плюсы и вообще нет минусов. Почему люди живут технологиями уходящими за горизонт ?
На реализацию халогейт авер и ставит брякА зачем вообще номера хардкодить ? HaloGate для особо продвинутых ?
вот тут и будет бряк у фалькона с карбона тожепробегаемся по всем экспортным именам ntdll
ну да, может для авера что стоит в школе или у многих дома - то да все топ.Кода в разы меньше. Да тут одни только плюсы и вообще нет минусов.
если даже черновики выложишь, уже рады будем. толком не кто ни чем не делиться. на безрыбье и рак рыбаНу я подумаю, может, найду время к этому вернуться.
Мне тебе рассказывать как найти базу ntdll ? Ну не смеши, ты это и без меня знаешь. Даже если учесть, что в пебе все поменяли, наебнули, и сделали труным добытие базы, это не значит что ее достать нельзя. Просканируй адресное пространство целиком, найди вручную по PE заголовкам все модули, даже если из peb целиком ntdll убрать (наебнув при этом дюжину системных механизмов, никто из аверов так не сделает), она находится через прямой анализ виртуальной памяти. Да бро, и старый трюк с анализом стека тоже никто не отменял, в стеке у тебя где-то на дне всегда будет адрес из кодовой секции ntdll, потому что запуск процесса начинается с созданного в ntdll потока. Короче проблему ты из пальца высосал. Касательно версии в пебе, так зачем она тебе на этапе получения номеров сисколов через Halo ? Там peb можно вообще не использовать. А когда ты уже решил номера сисколов, версию винды можно получить из NtQuerySystemInformation прямым вызовом сискола в ядро. Там тебе могут помешать только ядерные колбэки аверов, но без драйвера из юзермода ты на это вообще никак не повлияешь. Вторую проблему тоже из пальца высосал.А как мы будем находить _настоящий_ ntdll в котором хукали сплайсом на точки входа в апи и никаких сюрпризов не подкинули? Я вам более скажу доверять извлеченной из пеб информации про версию тоже стоит с осторожностью и прощупывать почву уже чрез вызовы и анализ ответа. Комформизм губитПаник рум эвривэ. А сорец расстроил, почему то думал что там порядок и четкость мысли в каждой строчке.
На реализацию халогейт авер и ставит бряк
Да ты что, а может ты мне расскажешь как это будет происходить ? Halo (и в частности проход по экспорту, как один из его элементов) работает без единого вызова апи функций, сырой ассемблерный код, тупо бинарь, шеллкод, называй как хочешь. На перехватах функций авер тут не вывезет, потому что их тупо нет. Там нечего перехватывать для анализа. Единственная возможность у авера - эмулировать этот код, и понять, что происходит. Я сделаю для тебя открытие, называется оно Антиэмулятор. Очень полезная штучка, рекомендую. После этого поворота событий как ты будешь детектить Halo ? Я отвечу, никак.вот тут и будет бряк у фалькона с карбона тоже
Ты перескакиваешь с места на место, еще не получили базу, а уже сканируем экспорт. Бредятина. Самому не смешно?Интересно а как я буду сканировать память если я не нашел ntdll что бы найти в нем api что бы найти в них ординалы что бы использовать их для сканирования памяти....загадка.
Смешно.Самому не смешно?
Как я получу этот набор страниц и их аттрибутов и состояний если я не знаю оридиналов сисколлов что бы их получить? Как не зная ордиллов сисколлов я должен парсить структуры, тот же экспорт не вляпавшись в приготовленный эксепшен.Начнем по порядку, для одаренных пользователей. С получения базы. Без PEB раз он так не нравится.
Все просто до безобразия, взял получил набор рабочих живых страниц в процессе
Ах да, мы забыли про сканирование всего адресного пространства и seh на случай ACCESS_VIOLATION. И да, способов дюжина, но мы предпочитаем цепляться за каждое слово в конкретном способе. Не поверишь, не горю желанием перечислять здесь все, ладно бы ты слушал с открытым ротиком, внимая умные мысли, но нет, ты вышел поспорить. Впрочем, как обычно, ничего нового. Все вокруг неправы, ничего не знают, один виспер знает все обо всем. Спор ради спора, хотя ты и сам знаешь, как получить базу во всех этих случаях. К чему тогда спор ? Просто потрепаться ?Как я получу этот набор страниц и их аттрибутов и состояний если я не знаю оридиналов сисколлов что бы их получить?
try catch и seh наверное просто так придумали, явно не для того, что бы эксепшены ловитьот же экспорт не вляпавшись в приготовленный эксепшен
Тройную бро, успели до тараканов разогнаться, двойная только обратно к пятнам вернет, лучше вообще лошадиный транквил, что б наверняка, кто знает что за тараканами вылезет из сознания великого мастера.Сестра срочно двойную дозу успокоительного!
Я вообще не понимаю, зачем кто-то с тобой разговаривает тут. Не, ну, может, кто-то и любит когда его духотой обмазывают со всех сторон, но меня то зачем в это втягивать, общайтесь сами.Дилда срочно поддержи жопку, скажи что найти нтдлл просто и хало гейт рулит, а таблицы для дураков.
если даже черновики выложишь, уже рады будем. толком не кто ни чем не делиться. на безрыбье и рак рыба
Ладно, ладно, я постараюсь дописать)Но если что мы все ждем, я не смог найти статей где бы с теоритической частью это все рассматривалось