Уважаемый, только вот хамить не зачем - уважайте собеседника. Не нравятся предложенные методы, напишите - чем не устраивают. Тот же метод, с использованием стековых или кодовых сигнатур? Да, это частные методы - этим не устраивают? Тогда разбирайте целевую функцию на графы и смотрите наличие адресов возврата из вызовов процедур в стеке. Или это тоже не устраивает?
Утро. Песочница. Внутри уверенно расположился старшеклассник, вокруг него по периметру лежат овощи, преимущественно клубни картофеля. Размахивая элитным листингом, он поочередно обращается к каждому, выкрикивая разные дерзкие фразы: "ваши способы унылы", "семпл в студию!!", ... продолжает кричать, но проезжающий мимо фирменный трактор заглушает остальное. Воцарилась зловещая тишина. Картофель был явно не готов к происходящей беседе и старшеклассник, понимая это, ликует!! От удовольствия его лицо расплывается в улыбке, осознавая свою гениальность, начинает разводить руками по песку. Нащупывает чуть засохший кусок дерьма, незамедлительно бросает (определяющий момент). Камера начинает медленно вращаться, на фоне играет < Стекловата, "Новый год" >, срывается снег. Главный герой быстро собирает клубни картофеля, заворачивает в элитный листинг и нелепо пытается вылезти из старой дырявой песочницы (не похучен даже ZwOpenProcess). Занавес. fixed!
7mm Уважаю собеседника. Вы на этом форуме мало отвечаете на вопросы, поэтому данный топик не вам адресован, а тем кто предлагает извращённые решения тривиальных задач, как частный случай сводя всё к APC и патчам. Таких задач %30 тут.
Clerk В этом плане концовка открыта, фантазируйте. Скрытый подтекст? Трактор это deLight? Вы не по-детски коварны я посмотрю =)
Clerk Ваша идей действительно интерестная, но вот только все будет зависеть от конкретное реализация функций А ведь код может быть сильно разным, хоть в обычных кодесах может и прокатит, не проверял. Универсального подхода НЕТ. конечно если кто то не прикрутит МЕГА эмуль... П.С. Стек могут убить, а потом воскресить , так что идей с подменной адресов возврата и тем более поиском каких то сигнатур .... П.С. П.С. Clerk Как на счет мат части?
IceCrashLdr Есть и оно работает. На счёт матчасти не понятно что описывать, всё просто: Код (Text): o Получение управления при понижении SFN из калбэка. ; Routine() -> ... -> Notify(). Initialize: Graph = CreateGraph(@Routine, NL = 1) Notify: Frame:PSTACK_FRAME Frame = rEbp Do if CheckIpBelongToGraph(Graph, Frame.Ip) Tls = AllocateTls() Tls.Ip = Frame.Ip Frame.Ip = @2ndDispatch() End endif Frame = Frame.Next Loop END_OF_CHAIN 2ndDispatch: Payload() Ip = Tls.Ip FreeTls(Tls) Jmp Ip
Mr Clerk не совсем понимаю ваш кодес. Вы пытаетесь построить граф от Routine, что бы вычислить кадры стека? Это идея, и будет работать на всем релизном коде от майкрософта, но не тогда, когда код будет смещен (SEH, декрипт + крипт )... А если вы про анализ стека так я же почеркиваю, что при вызове функции оригинальной истории стека может и не быть, и появтся она будет только после выхода из функции, но снова таки от майкрософта такого кодеса не будет, так что все нормально ..
IceCrashLdr Какие есчо крипты, о чём вы говорите.. в оси код не криптуется, а для своего таких задач не возникает.
А если функции не имеют адреса возврата? Они стандартизированы? или может быть такая структура >А>B>C>D>C>B>B>F>G>F>B>A> Или если эти функции меняют режим работы процессора, в реальный а потом обратно. например >A>B>реальный>C>обратно>И вот тут мы в вашей Y>Реальный>C>обратно>B>A> и всё нифига ваш код не сработает))) Теоретически прикинул) Хотя даже не так всё гораздо просще, функция может записать файл в какойнить каталог на диске, и если он есть загружает его как адрес возврата и возвращается сразу, а если нет то идёт в вашу Y (кстати и Y может записать файл) и тогда ваш способ не работают. Или если например код после возврата не один, а много одинаковых, и функция случайно выбирает один из адресов возврата на один из экземпляров кода. Функция это абстракция, и если конкретную задачу решать то можно найти оригинальный и универсальный способ решения, а при абстрактной задачи я полностью согласен с IceCrashLdr универсального решения нет. Ваш код не гибкий, если есть конкретная задача под неё можно написать конкретный код решения, но если есть конкретный код решения под него можно написать конкретную задачу которую он не сможет решить. А вообще Clerk вы хитрый человек, придумали правила игры где все вокруг овощи, и давай с нами играть по ним - сначала написали, очень абстрактную задачу, и как кто чуть под капатся пытался, сразу всё под одну гребёнку сводили, заранее вами спланированную, и коварно просчитанную)) Не товарищ, давайте играть по, с самого начала заданным правилам, и тогда посмотрим кто тут овощ)) и не мухлевать в нашей песочнице))
IceCrashLdr Задача. Вот модель вызова GetProcAddress(): Код (Text): GetProcAddress LdrGetProcedureAddress LdrpGetProcedureAddress LdrpSnapThunk if !(LDR_DATA_TABLE_ENTRY.Flags & LDR_ENTRY_PROCESSED) LdrpRunInitializeRoutines LdrpCallInitRoutine InitRoutine() endif Вот модель вызова CreateProcessA(): Код (Text): CreateProcessA CreateProcessInternalA CreateProcessInternalW GetProcAddress("CreateProcessAsUserSecure") Таким образом сбросив флажёк в лдр мы получим вызов "DllMain" модуля при создании процесса. Необходимо создать процесс с остановленным потоком, выполнить некоторые действия(инжект и пр.). Как будем решать ?
Clerk Еще одна задачка? . Это не интересная задача, в принципе как и предыдущая ... Кажется рихтер писал ответ(Где то, кто то, что то, постил), так что не буду повторятся ...
IceCrashLdr Не писал Рихтер, он слишком туп чтоб решать подобные задачи. Овощ вам подходящий термин, согласитесь.