Сейчас на форуме: vsv1 (+5 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Как правильно сделать инлайн? |
Посл.ответ | Сообщение |
|
Создано: 15 марта 2016 05:19 · Поправил: Kuzya69 · Личное сообщение · #1 Просвятите, пожалуйста. В момент вызова "kernel32.LoadLibraryA" для "USER32.dll", код жертвы, который я собираюсь патчить, уже готов для изменения (распакован). Собираюсь писать инлайн, но в голове каша. При поиске в гугле, не попадаются примеры с такой задачей. То-есть я хочу на ЕП пропатчить функцию "LoadLibraryA", чтобы она переходила в мой код. И когда я увижу, что аргумент равен "USER32.dll", то сразу пропатчу жертву, и верну украденные байты обратно в "LoadLibraryA". Как мне определить базовый адрес, по которому загрузилась "kernel32.dll", чтобы воспользоваться ее АПИ-функциями? Не уж-то начинать с адреса 0х80000000 и с шагом 0х1000, идти вниз по адресам, и все время проверять имя библиотеки, на соответствие "kernel32.dll"? И как тогда обрабатывать варианты "Access violation", ведь мой код еще ничего не будет знать о загруженных в жертву библиотеках. ![]() |
|
Создано: 15 марта 2016 05:30 · Личное сообщение · #2 Не нужно патчить функцию в библиотеке kernel32.dll, в теле жертвы есть же переходник, через который вызывается тот самый LoadLibraryA, этот переходник и нужно патчить. А вообще мест для инлайна может быть сколько угодно, бери любое понравившееся и ставь свою заглушку туда, да не забудь потертый код восстановить после прыга. ![]() |
|
Создано: 15 марта 2016 05:35 · Поправил: Kuzya69 · Личное сообщение · #3 Тот самый LoadLibraryA, вызывается через "Retn 0", внутри обработчика Пи-кода. Но это пол-беды. На ЕП, этот код еще не готов, а готов он только после третьего слоя расшифровки. Это Винлиценз с Темидой. Хотя тут я наверное и не прав, Темида скорее всего меня поймает. Наверное придется патчить LoadLibraryExW. ![]() |
|
Создано: 15 марта 2016 07:24 · Личное сообщение · #4 |
|
Создано: 15 марта 2016 07:58 · Поправил: Rainbow · Личное сообщение · #5 Kernel Image from PEB: mov eax, dword ptr fs:[30h] mov eax, dword ptr ds:[eax+0Ch] mov eax, dword ptr ds:[eax+1Ch] mov eax, dword ptr ds:[eax] mov eax, dword ptr ds:[eax+08h] NTDLL Image from PEB: mov eax,dword ptr fs:[30h] mov eax,dword ptr ds:[eax+0ch] mov eax,dword ptr ds:[eax+0ch] mov eax,dword ptr ds:[eax] mov eax,dword ptr ds:[eax+18h] ![]() |
|
Создано: 15 марта 2016 15:48 · Поправил: Kuzya69 · Личное сообщение · #6 TryAga1n пишет: ... у фимы свои прототипы GetProcAddress, LoadLibraryA, GetModuleHandle и т.д. Во время распаковки, она не обращается ... Все правильно, но именно user32.dll у меня она грузит через LoadLibraryA, все остальное через прототипы. Rainbow А вот это хорошо, вечерком проверю. Сейчас некогда. Кстати столкнулся, с эксепшоном при записи в область dll, придется наверное еще атрибуты доступа сменить. ![]() |
|
Создано: 15 марта 2016 16:55 · Поправил: DenCoder · Личное сообщение · #7 Kuzya69 пишет: Кстати столкнулся, с эксепшоном при записи в область dll, придется наверное еще атрибуты доступа сменить. Ну как же Вы могли не знать, что без этого Code:
в 99% изменяться код, так чтоб работал, не будет. 1% - что изменится, если после самораспаковки(что сейчас не Ваш случай) не вернулись старые атрибуты. Но если не под дебагом это делается, то кэш обязательно сбрасывать надо. ----- IZ.RU ![]() |
|
Создано: 15 марта 2016 17:16 · Личное сообщение · #8 |
|
Создано: 15 марта 2016 17:20 · Личное сообщение · #9 Про атрибуты знал, просто дебагер в заблуждение ввел, он то меняет эти атрибуты приспокойно, если руками байты переписывать. ![]() А вот про кэш первый раз слышу. Вроде когда лоадер писал, не требовалось этого. Ну и наверное потом, после подмены, обратно восстановить аттрибуты? А кэш кстати перед сбросом не надо сохранять? Не пинайте, первый раз инлайн делаю. Просто не хочется лоадер с задержкой писать. Да и один файл куда красивее выглядит. ![]() |
|
Создано: 15 марта 2016 17:39 · Поправил: DenCoder · Личное сообщение · #10 ajax пишет: на pc (86,64) - нет да ну??? ![]() Оно без этого не работает сразу, сколько раз замечено было... ) Но хотя тут и от проца зависит, и от nt-модуля, и от hal... Когда начинал фрилансить, попадался мне проектик. Надо было заставить исчезать процесс игрового клиента из списка диспетчера задач сразу. Вот я тогда не знал совсем ещё, что дело во FlushInstructionCache() Из моих ранних проектов, когда сел за написание своего апи-логгера, тоже раз на раз не приходилось. Бывало сразу запишется и всё воркает, а бывало - не сразу. Одна особенность была - когда процесс только ещё создан, создан с флагом CREATE_SUSPENDED, неинициализирован и находится в состоянии SUSPENDED, FlushInstructionCache() даже в цикле приходилось крутить до появления признаков удачного изменения. ) Но правда вмешательства были из вне, из другого процесса. Добавлено спустя 2 минуты Kuzya69 пишет: А кэш кстати перед сбросом не надо сохранять? Даже и не то, чтобы нет. Я даже и не видел такой возможности ![]() Добавлено спустя 28 минут Сброс кэша - это чтобы процессор увидел изменения. Как там оно на уровне драйверов реализовано, я пока так и не знаю. Но в моих гипотезах одно из 2х должно иметь место с кешем: 1) Либо кеш никак не сохранятся для каждого процесса. Тогда в силу его ограниченного размера есть теоретическое кол-во процессов, и теоретическое кол-во модулей, такое что суммарный прогоняемый код превышает размер кеша. Если эта гипотеза верная, то при этих условиях этой функцией даже и не понадобится пользоваться. 2) Либо при переключениях между процессами кеш всё-таки сохраняется. Тогда эта функция нужна каждый раз. Этот момент надо будет для себя выяснить, когда найдётся время... Хотя, может, здесь кто-то об этом знает ----- IZ.RU ![]() |
|
Создано: 15 марта 2016 18:34 · Личное сообщение · #11 |
|
Создано: 15 марта 2016 19:00 · Поправил: ajax · Личное сообщение · #12 DenCoder коммент внизу ссылки msdn по искомой функе. вообще, всякие моменты мб. в контексте своего процесса - пофик. патчерам-лоадерам тоже, IPC отнюдь не множественный. тут деталюшки, если возникнет желание ----- От многой мудрости много скорби, и умножающий знание умножает печаль ![]() |
|
Создано: 15 марта 2016 20:55 · Личное сообщение · #13 хм... интересная тонкость... Добавлено спустя 2 минуты Как тогда это объяснить? )) DenCoder пишет: Одна особенность была - когда процесс только ещё создан, создан с флагом CREATE_SUSPENDED, неинициализирован и находится в состоянии SUSPENDED, FlushInstructionCache() даже в цикле приходилось крутить до появления признаков удачного изменения. ) Но правда вмешательства были из вне, из другого процесса. Одна тонкость была ещё - тогда у меня стоял ещё проц Pentium 3 ----- IZ.RU ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Как правильно сделать инлайн? |