Сейчас на форуме: zombi-vadim, zds (+4 невидимых) |
eXeL@B —› Программирование —› Перехват API |
<< . 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 06 мая 2007 20:16 · Личное сообщение · #1 |
|
Создано: 26 июня 2013 16:40 · Личное сообщение · #2 |
|
Создано: 26 июня 2013 18:35 · Поправил: Dr0p · Личное сообщение · #3 ARCHANGEL Инде не в курсе, ничо не знаю про местных кулцхэккеров и прочих свиноводов.. SReg И ничего не получится. Ядро восстановит контекст треда, так как это стартап контекст и изменить в нём регистры низя(за исключеньем EFlags). Реальный, тот контекст, который будет прогружен в камень после возврата из апк хранится на стеке, а не в т-фрейме. > В таком случае моя библиотека будет в списке загруженных библиотек, что легко обнаружить. Ежели вашей либы не будет в базе данных, то и она существовать не будет. Лодер не будет обслуживать ваш образ. Если такое обслуживанье не нужно, то и нет смысла юзать модуля. Хотя тут для нубья проблема серьёзная - на дельфях не сгенерить самодостаточный код. Делается проще - стандартно модуль грузится, в базе данных метим флагом LDRP_COR_OWNS_UNMAP описатель, выгружаем модуль. Проекция останется(возможно нужно будет есчо пометить описатель как статически прилинкованный, либо есчо раз референснуть импорт). Да и в вашем случае сокрытие такое бессмысленно, вы ведь через патч портите целостность системных модулей. Это обнаруживают и выпиливают все тулзы проще, чем определяют что модуль внесистемный. |
|
Создано: 26 июня 2013 19:01 · Поправил: SReg · Личное сообщение · #4 |
|
Создано: 26 июня 2013 19:14 · Личное сообщение · #5 SReg При старте треда доставляется ядерная апк, пользовательский контекст ложится в стек(тк апк). Если до ресума изменить контекст, то на стек ляжет изменённый, он будет использован после отработки лодера. Ядерный контекст вы не измените. Есть конечно методы, но они не помогут - придётся маршрутизировать, что довольно таки сложно. > пройдись по пебу найди и потри ее в LDR_DATA_TABLE_ENTRY Тогда например гмер обнаружит паразитный код и покоцанный образ. Тоесть однозначно детект. А модуль - есть лишь один норм метод определить что модуль системный - обратиться к WFP. Но там не составляет труда свой модуль порегать. | Сообщение посчитали полезным: Abraham |
|
Создано: 27 июня 2013 13:46 · Личное сообщение · #6 Нашел баг в коде. Когда ДЛЛ уже инжектирована, она должна подгрузить системную длл (если еще не подгружено) , найти адрес перехватываемой функции и вставить туда прыжок, но оригинальные байты куда-то сохранить. Если надо вызвать оригинальную функцию , то идет прыжок на эти байты , а потом прыжок на инструкцию , следующую за тем прыжком ,который в начале перехватываемой функции. Проблема в том , что оригинальные байты (там еще подсчитывается сколько опкодов байты занимают) могут содержать вызовы CALL E8 ******** . И если тупо скопировать байты , то адрес будет совершенно другой. Таким образом вызвать оригинальную функцию невозможно. А внутри перехвата по-любому надо вызывать оригинал, так как переписывать оригинал сильно сложно. |
|
Создано: 28 июня 2013 01:15 · Поправил: Модератор · Личное сообщение · #7 |
|
Создано: 28 июня 2013 10:38 · Поправил: volopas · Личное сообщение · #8 |
|
Создано: 28 июня 2013 20:12 · Поправил: Модератор · Личное сообщение · #9 volopas ... За патчи следует отрезать руки. > Нужно распознавать опкоды, а не только считать их длину. ... Про какой есчо дизасм вы говорите. Он вам ... не нужен. Для тупого пропатчиванья кода достаточно элементарного разбора ветвлений, даже дизасм длин не нужен - копипастим в буфер, фиксим оффсеты. | Сообщение посчитали полезным: Abraham |
|
Создано: 29 июня 2013 23:04 · Личное сообщение · #10 volopas Тебе Dr0p уже давал простое решение, которое я сам хотел выложить: Dr0p пишет: Самое элементарное решенье - создаём процесс остановленным, загружаем в контекст ссыль на стаб(в rEax вродь, не помню точно). Поясню лишь. В усыплённом на старте процессе в контексте, в поле rEax хранится entry point exe-модуля. Это верно для всех 32бит Nt-систем виндовс, по-крайней мере от XP до 7ки включительно(на 64бит не проверял)! Ищем свободное место в конце секции кода или выделяем такое - не важно, пишем туда код с установкой(ами) хука, нужными действиями и не забываем про джамп на entry point. Всё! Такие заявки на "свиноблоге" и такое невежество здесь... P.S. Уход с форума означало бы признание вины и что я сдался. Буду аккуратно мстить "чернословам", которые, не вчитываясь в тему и ни грамма не думая, судят о людях, "авторитетно" вставляя пару гнилых фраз. TryAga1n, try anymore... ----- IZ.RU | Сообщение посчитали полезным: plutos, Abraham |
|
Создано: 30 июня 2013 10:00 · Личное сообщение · #11 Посты не в тему стёр, некоторые посты поправил. Во-первых, ТС хватит жаловаться и ныть, возьми и сделай, в гугле овер 9000 примеров инжекта на любой вкус и размер, в том числе и с SUSPENDED, и всё прекрасно работает. Остальным-давайте всё же ближе к теме. И в-третьих, хаять поделия вместе с людьми (уважаемых как минимум в своё время), которые уже не могут ничего на это ответить, по меньшей мере некорректно. Да, в этой статье, как и в примерах кода, далеко не всё учтено, но и писалось это всё в бородатые годы. Не нравится-не пользуйся или напиши лучше. | Сообщение посчитали полезным: VodoleY, SReg, hlmadip, DenCoder |
|
Создано: 30 июня 2013 10:11 · Личное сообщение · #12 |
|
Создано: 30 июня 2013 17:49 · Поправил: volopas · Личное сообщение · #13 Еще есть вопрос по статье. Там для каждого RemoteThread и для каждой порции данных для этого потока выделяется память по 4 КБ , а на деле используется байтов 20. Потоков создается довольно много: напр. для каждой импортируемой длл-кой функции . Но это еще полбеды. Ее освобождение автор не предусмотрел. Нужно ли беспокоится за эту память? Если освобождать , то нужно как-то проконтролировать, чтобы память не была освобождена , пока в ней выполняется удаленный поток. Хотя в функции InjectThread автор статьи предусмотрел возможность подождать результат выполнения удаленного потока. Т. е. можно дождавшись его завершения освободить и память под код потока и память под передаваемые потоку параметры. Но не замедлит ли это работу приложения? Может лучше организовать массив из Dword-элементов, который наполнять адресами на выделенную память, а уже после инжекта пройтись по массиву и освободить ? Нет ли опасности , что в момент восстановления основного потока целевого приложения через ResumeThread , какой-то из созданных удаленных потоков будет еще выполняться? |
|
Создано: 01 июля 2013 02:11 · Поправил: DenCoder · Личное сообщение · #14 volopas пишет: Т. е. можно дождавшись его завершения освободить и память под код потока и память под передаваемые потоку параметры. Но не замедлит ли это работу приложения? Охота попиздеть? - просто делай! Внешние воздействия нисколько не замедляют работу приложений... (в данном случае) volopas пишет: Еще есть вопрос по статье. Если что-то уже читаешь, то по определению у тебя не должно быть вопросов! volopas пишет: Может лучше организовать массив из Dword-элементов, который наполнять адресами на выделенную память примерно так же сделана си-операция new, я реализовывал свой диспетчер памяти - если мозги работают, то сделаешь как надо volopas пишет: Нет ли опасности , что в момент восстановления основного потока целевого приложения через ResumeThread , какой-то из созданных удаленных потоков будет еще выполняться? Синхронизируй, если оно действительно тебе надо! ----- IZ.RU |
|
Создано: 01 июля 2013 09:03 · Личное сообщение · #15 volopas пишет: Еще есть вопрос по статье. Там для каждого RemoteThread и для каждой порции данных для этого потока выделяется память по 4 КБ , а на деле используется байтов 20. советую почитать allomem.. попробуйте выделить 20 байт? или 5?.. 1000Н байт это дискретная величина, меньше которой выделить память нельзя ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 01 июля 2013 23:52 · Личное сообщение · #16 |
|
Создано: 03 июля 2013 21:59 · Поправил: Модератор · Личное сообщение · #17 >>попробуйте выделить 20 байт? или 5?.. 1000Н байт это дискретная величина, меньше которой выделить память нельзя Это понятно. Просто используется менее 1 % и потом не высвобождается. Нужно тогда либо писать в уже выделенную область , либо высвобождать , иначе это кощунство. >>Вы же вещали что нужно патчить кернел апи до её инициализации и статического импорта лодером Где я такое вещал? Мне надо было перехватить ReadFile до первого ее вызова. А первый вызов не может быть раньше чем импорт kernel32.dll. Вопрос не понял. От модератора: Пользуйся кнопкой "Правка", не создавай сообщения подряд. |
|
Создано: 04 июля 2013 09:59 · Поправил: DenCoder · Личное сообщение · #18 volopas Ты попробуй, сделай. Как бы ты ни был подкован теорией, надо потратить время и на ошибки, без которых ни у кого не бывает. Будут проблемы - отпишешься. volopas пишет: Потоков создается довольно много: напр. для каждой импортируемой длл-кой функции Честно, это понять не могу. Где для каждой импортируемой длл-кой функции создаётся отдельный поток? (Об ЭмСиРэме узнал только, когда попал на этот форум. На тот момент уже около года пользовался методиками инжекта) ----- IZ.RU |
|
Создано: 04 июля 2013 18:56 · Поправил: volopas · Личное сообщение · #19 |
|
Создано: 04 июля 2013 20:58 · Поправил: SweetLizard · Личное сообщение · #20 |
|
Создано: 04 июля 2013 21:21 · Поправил: volopas · Личное сообщение · #21 |
|
Создано: 05 июля 2013 01:34 · Личное сообщение · #22 volopas пишет: Внутри нее используется GetProcAddressEx , а внутри нее базовая InjectThread, которая и создает удаленный поток volopas пишет: Обязательно ли высвобождать память , которая выделяется под удаленные потоки? Это некорректный механизм! Создавать каждый раз поток, чтоб только импортировать функу - бред. Вполне достаточно просто создать табличку импорта в процессе-пациенте и одним потоком её заполнить. ----- IZ.RU |
|
Создано: 05 июля 2013 16:30 · Личное сообщение · #23 volopas пишет: Почему suspended приложение не может нормально работать, если до resume основного потока запускались другие потоки? ...всё должно работать. Проблема в том, что вы пытаетесь использовать чужие исходники, скорее всего не до конца понимая их. К тому же я считаю, что вашем случае всё можно сделать гораздо проще. Все эти манипуляции с ручной загрузкой либы абсолютно не нужны. volopas пишет: Обязательно ли высвобождать память , которая выделяется под удаленные потоки? ...в принципе да, например: * выделяем память под шеллкод * внедряем либу с помощью CreateRemoteThread * освобождаем память, выделнную для шеллкода Здесь удалённый поток выполнится в целевом процессе сразу же, поэтому имеет смысл ждать это событие, чтобы освободить память. Но могут быть нюансы, например: * выделяем память под шеллкод * внедряем либу с помощью QueueUserAPC В данном примере освобождать память не стоит, потому как вероятнее всего apc будет доставлен в целевой процесс только через некоторое время, после того, как пройдёт инициализация процесса. Ждать этого события с помощью WaitForSingleObject, с моей точки зрения, не имеет смысла. Исходя из этого, освобождать память шеллкода нельзя, потому как иначе будет исключение, когда целевой процесс, наконец, решит выполнить ваш шеллкод. ----- the Power of Reversing team |
|
Создано: 05 июля 2013 18:37 · Личное сообщение · #24 DillerInc > Все эти манипуляции с ручной загрузкой либы абсолютно не нужны. Там небыло лодеров, сурсы мсрема это ущербное кривое гавно дестилетней давности. > * выделяем память под шеллкод Какой впизду шелл, вы собрались переполнять буфера лодера - так я сразу скажу что их все прочекал вдоль и поперёк, гиблая затея. > * внедряем либу с помощью CreateRemoteThread Это созданье треда, какое отношенье там пе формат имеет не понятно. > * внедряем либу с помощью QueueUserAPC Опять же. Какое нахуй внедренье ? Быть может вам следует ознакомиться с осевыми механизмами, которые позволяют выполнить произвольный код - так тонны их. Даже в юзермодах. Запись в память, ремапы, контексты, треды, секции.. это вообще пиздец. Учите ебланы архитектуру! | Сообщение посчитали полезным: ajax |
|
Создано: 05 июля 2013 20:04 · Личное сообщение · #25 Собственно, чтобы стало ещё понятнее. Т.н. "шеллы" для удалённой загрузки либы излишни. Достаточно воспользоваться ----- the Power of Reversing team |
|
Создано: 05 июля 2013 21:08 · Личное сообщение · #26 Лично я вообще не понимаю,что хочет сделать ТС. Судя по всему,какую то очередную херовину типа трехпедального велосипеда с квадратными колесами. Что нужно сделать для получения рабочего кода: 1. понять цель задачи 2. взять литературу 2.1 книги Рихтера по Windows C++ 2.2 MSDN майкрософт 3. взять компилятор и собственно откомпилировать требуюмую |
|
Создано: 05 июля 2013 21:28 · Поправил: DenCoder · Личное сообщение · #27 Из литературы ставлю MSDN на первом месте. Можно обойтись без Рихтера, если пореверсить до глубокого понимания ----- IZ.RU |
|
Создано: 25 сентября 2013 08:55 · Поправил: volopas · Личное сообщение · #28 DillerInc >> Собственно, чтобы стало ещё понятнее. >> Т.н. "шеллы" для удалённой загрузки либы излишни. Достаточно воспользоваться следующим приёмом >> http://www.drdobbs.com/a-safer-alternative-to-terminateprocess/184416547 Как передать в CreateRemoteThread 2 параметра? На сайте Майкрософт говорят , что нужно делать некую структуру (запись): http://social.msdn.microsoft.com/Forums/en-US/ffbf9121-1e2f-490c-acae-b90ceae7b995/createremotethread-how-to-separate-parameters-or-pass-multiple-parameters-to-function Я попробовал, но нифига не передается больше 1 параметра. Смотрим в kernel32 в процедуру, отвечающую за вызов потока: Там только 1 push, не зависимо от того, передаем мы указатель на dword, чисто dword или указатель на структуру (запись). Более того, если передавать указатель, то этот указатель находится в адресном пространстве материнского процесса, а не целевого. Есть ли способ обойти это , не прибегая к шеллу? Почему модератор на сайте Майкрософт врет? |
|
Создано: 25 сентября 2013 09:15 · Личное сообщение · #29 |
|
Создано: 25 сентября 2013 09:32 · Поправил: Veliant · Личное сообщение · #30 Вы же сами цитируете >>делать некую структуру 1) Делаете структуру Code:
2)Выделяете память в нужном процессе и копируете туда структуру Code:
3) Повторяете пункт два но для функции DestFunc Code:
4) CreateThreadEx(....fnaddr, dstaddr..) |
|
Создано: 25 сентября 2013 10:22 · Личное сообщение · #31 Я работаю в Delphi. Приведенный код, конечно понятен и работать не будет, но проверить я это не могу. Поэтому просьба выкладывать исходники в Delphi. Так и Вы и я сможем проверить и убедиться в нормальной работе исходника. Для упрощения моего понимания рассмотрим запуск в удаленном потоке процесса C:\WINDOWS\system32\taskmgr.exe процедуры TerminateProcess: TerminateProcess -hProcess -ExitCode То есть процедура известна и ее адрес можно даже задавать "в лоб" на моей ОС. Как передать 2 параметра? Я пробовал передавать адрес. И что получается TerminateProcess прининимает 1 параметр в виде адреса на выделенную память. Пиши в эту память что-либо, не пиши -- результат будет следующий: TerminateProcess ( hProcess = адрес в памяти вместо хендла процесса; ExitCode = то, что в стеке ниже , вместо значения LongWord ) И Вы думаете это будет работать? |
<< . 1 . 2 . 3 . >> |
eXeL@B —› Программирование —› Перехват API |