Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Перехват API
<< . 1 . 2 . 3 . >>
Посл.ответ Сообщение

Ранг: 9.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 06 мая 2007 20:16
· Личное сообщение · #1

люди добрые помогите!Задача такая нада при вызове определенной API передать управление моей проге.
Если у кого есть исходники на masm залейте куданить плизз.
зарание сенкс и извините за возможное повторение темы но в поиске я ниче нинашел!



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 26 июня 2013 16:40
· Личное сообщение · #2

>> который и вызовет LoadLibrary
Не пойдет. В таком случае моя библиотека будет в списке загруженных библиотек, что легко обнаружить. Нужно инжектировать DLL "более скрытым способом" , как пишет автор статьи. Такие процедуры заканчиваются на ...Ex в advApiHook.pas




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 26 июня 2013 18:35 · Поправил: Dr0p
· Личное сообщение · #3

ARCHANGEL
Инде не в курсе, ничо не знаю про местных кулцхэккеров и прочих свиноводов..

SReg
И ничего не получится. Ядро восстановит контекст треда, так как это стартап контекст и изменить в нём регистры низя(за исключеньем EFlags). Реальный, тот контекст, который будет прогружен в камень после возврата из апк хранится на стеке, а не в т-фрейме.

> В таком случае моя библиотека будет в списке загруженных библиотек, что легко обнаружить.

Ежели вашей либы не будет в базе данных, то и она существовать не будет. Лодер не будет обслуживать ваш образ. Если такое обслуживанье не нужно, то и нет смысла юзать модуля. Хотя тут для нубья проблема серьёзная - на дельфях не сгенерить самодостаточный код. Делается проще - стандартно модуль грузится, в базе данных метим флагом LDRP_COR_OWNS_UNMAP описатель, выгружаем модуль. Проекция останется(возможно нужно будет есчо пометить описатель как статически прилинкованный, либо есчо раз референснуть импорт).

Да и в вашем случае сокрытие такое бессмысленно, вы ведь через патч портите целостность системных модулей. Это обнаруживают и выпиливают все тулзы проще, чем определяют что модуль внесистемный.



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 26 июня 2013 19:01 · Поправил: SReg
· Личное сообщение · #4

Dr0p пишет:
И ничего не получится

ну незнаю, тебе виднее, но я так делал и все работало

volopas
В таком случае моя библиотека будет в списке загруженных библиотек

пройдись по пебу найди и потри ее в LDR_DATA_TABLE_ENTRY




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 26 июня 2013 19:14
· Личное сообщение · #5

SReg
При старте треда доставляется ядерная апк, пользовательский контекст ложится в стек(тк апк). Если до ресума изменить контекст, то на стек ляжет изменённый, он будет использован после отработки лодера. Ядерный контекст вы не измените. Есть конечно методы, но они не помогут - придётся маршрутизировать, что довольно таки сложно.

> пройдись по пебу найди и потри ее в LDR_DATA_TABLE_ENTRY

Тогда например гмер обнаружит паразитный код и покоцанный образ. Тоесть однозначно детект. А модуль - есть лишь один норм метод определить что модуль системный - обратиться к WFP. Но там не составляет труда свой модуль порегать.

| Сообщение посчитали полезным: Abraham

Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 27 июня 2013 13:46
· Личное сообщение · #6

Нашел баг в коде. Когда ДЛЛ уже инжектирована, она должна подгрузить системную длл (если еще не подгружено) , найти адрес перехватываемой функции и вставить туда прыжок, но оригинальные байты куда-то сохранить. Если надо вызвать оригинальную функцию , то идет прыжок на эти байты , а потом прыжок на инструкцию , следующую за тем прыжком ,который в начале перехватываемой функции. Проблема в том , что оригинальные байты (там еще подсчитывается сколько опкодов байты занимают) могут содержать вызовы CALL E8 ******** . И если тупо скопировать байты , то адрес будет совершенно другой. Таким образом вызвать оригинальную функцию невозможно. А внутри перехвата по-любому надо вызывать оригинал, так как переписывать оригинал сильно сложно.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 28 июня 2013 01:15 · Поправил: Модератор
· Личное сообщение · #7

volopas
Вы что, даже не знаете как смещенья в ветвленьях вычисляются. ... Вам товарисч в комерц прямая дорога, ибо вы взялись за задачи очевидно не по силам. Знайте что патч удел школоты, вы очередное доказательство сего. Никто шарящий не будет бить образы, за это следует отрезать руки.



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 28 июня 2013 10:38 · Поправил: volopas
· Личное сообщение · #8

>> Вы что, даже не знаете как смещенья в ветвленьях вычисляются
Знаю, значение полсе E8 - это смещение, считаемое от следующей за CALL команды. Но просто удивляет, что в коде это абсолютно упускается. Нужно переписывать довольно много кода. Нужно распознавать опкоды, а не только считать их длину.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 28 июня 2013 20:12 · Поправил: Модератор
· Личное сообщение · #9

volopas
... За патчи следует отрезать руки.

> Нужно распознавать опкоды, а не только считать их длину.
... Про какой есчо дизасм вы говорите. Он вам ... не нужен. Для тупого пропатчиванья кода достаточно элементарного разбора ветвлений, даже дизасм длин не нужен - копипастим в буфер, фиксим оффсеты.

| Сообщение посчитали полезным: Abraham


Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 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


Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 30 июня 2013 10:00
· Личное сообщение · #11

Посты не в тему стёр, некоторые посты поправил.
Во-первых, ТС хватит жаловаться и ныть, возьми и сделай, в гугле овер 9000 примеров инжекта на любой вкус и размер, в том числе и с SUSPENDED, и всё прекрасно работает.
Остальным-давайте всё же ближе к теме.
И в-третьих, хаять поделия вместе с людьми (уважаемых как минимум в своё время), которые уже не могут ничего на это ответить, по меньшей мере некорректно. Да, в этой статье, как и в примерах кода, далеко не всё учтено, но и писалось это всё в бородатые годы. Не нравится-не пользуйся или напиши лучше.

| Сообщение посчитали полезным: VodoleY, SReg, hlmadip, DenCoder


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 30 июня 2013 10:11
· Личное сообщение · #12

Archer
Соответствующая оценка поделиям, бородатым или нет не важно, должна быть. Тогда бы не юзалось такое. Причём инжекты это малварные методы, есно у вас не спросят хочешь пользоваться или нет.



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 30 июня 2013 17:49 · Поправил: volopas
· Личное сообщение · #13

Еще есть вопрос по статье. Там для каждого RemoteThread и для каждой порции данных для этого потока выделяется память по 4 КБ , а на деле используется байтов 20. Потоков создается довольно много: напр. для каждой импортируемой длл-кой функции . Но это еще полбеды. Ее освобождение автор не предусмотрел. Нужно ли беспокоится за эту память? Если освобождать , то нужно как-то проконтролировать, чтобы память не была освобождена , пока в ней выполняется удаленный поток.

Хотя в функции InjectThread автор статьи предусмотрел возможность подождать результат выполнения удаленного потока. Т. е. можно дождавшись его завершения освободить и память под код потока и память под передаваемые потоку параметры. Но не замедлит ли это работу приложения?

Может лучше организовать массив из Dword-элементов, который наполнять адресами на выделенную память, а уже после инжекта пройтись по массиву и освободить ? Нет ли опасности , что в момент восстановления основного потока целевого приложения через ResumeThread , какой-то из созданных удаленных потоков будет еще выполняться?




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 01 июля 2013 02:11 · Поправил: DenCoder
· Личное сообщение · #14

volopas пишет:
Т. е. можно дождавшись его завершения освободить и память под код потока и память под передаваемые потоку параметры. Но не замедлит ли это работу приложения?

Охота попиздеть? - просто делай! Внешние воздействия нисколько не замедляют работу приложений... (в данном случае)

volopas пишет:
Еще есть вопрос по статье.

Если что-то уже читаешь, то по определению у тебя не должно быть вопросов!

volopas пишет:
Может лучше организовать массив из Dword-элементов, который наполнять адресами на выделенную память

примерно так же сделана си-операция new, я реализовывал свой диспетчер памяти - если мозги работают, то сделаешь как надо

volopas пишет:
Нет ли опасности , что в момент восстановления основного потока целевого приложения через ResumeThread , какой-то из созданных удаленных потоков будет еще выполняться?

Синхронизируй, если оно действительно тебе надо!

-----
IZ.RU




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 01 июля 2013 09:03
· Личное сообщение · #15

volopas пишет:
Еще есть вопрос по статье. Там для каждого RemoteThread и для каждой порции данных для этого потока выделяется память по 4 КБ , а на деле используется байтов 20.


советую почитать allomem.. попробуйте выделить 20 байт? или 5?.. 1000Н байт это дискретная величина, меньше которой выделить память нельзя

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 01 июля 2013 23:52
· Личное сообщение · #16

volopas

> Хотя в функции InjectThread

Сия метода(там тред стартуется) будет вызвана после инициализации модулей. Также как и apc-инжект, смена контекста. Вы же вещали что нужно патчить кернел апи до её инициализации и статического импорта лодером



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 03 июля 2013 21:59 · Поправил: Модератор
· Личное сообщение · #17

>>попробуйте выделить 20 байт? или 5?.. 1000Н байт это дискретная величина, меньше которой выделить память нельзя

Это понятно. Просто используется менее 1 % и потом не высвобождается. Нужно тогда либо писать в уже выделенную область , либо высвобождать , иначе это кощунство.

>>Вы же вещали что нужно патчить кернел апи до её инициализации и статического импорта лодером

Где я такое вещал? Мне надо было перехватить ReadFile до первого ее вызова. А первый вызов не может быть раньше чем импорт kernel32.dll. Вопрос не понял.

От модератора: Пользуйся кнопкой "Правка", не создавай сообщения подряд.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 04 июля 2013 09:59 · Поправил: DenCoder
· Личное сообщение · #18

volopas
Ты попробуй, сделай. Как бы ты ни был подкован теорией, надо потратить время и на ошибки, без которых ни у кого не бывает. Будут проблемы - отпишешься.

volopas пишет:
Потоков создается довольно много: напр. для каждой импортируемой длл-кой функции

Честно, это понять не могу. Где для каждой импортируемой длл-кой функции создаётся отдельный поток?

(Об ЭмСиРэме узнал только, когда попал на этот форум. На тот момент уже около года пользовался методиками инжекта)

-----
IZ.RU




Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 04 июля 2013 18:56 · Поправил: volopas
· Личное сообщение · #19

>>Честно, это понять не могу. Где для каждой импортируемой длл-кой функции создаётся отдельный поток?

procedure ProcessImports

Внутри нее используется GetProcAddressEx , а внутри нее базовая InjectThread, которая и создает удаленный поток



Ранг: -0.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 июля 2013 20:58 · Поправил: SweetLizard
· Личное сообщение · #20

volopas
Вы даже не понимаете зачем нужна команда Sleep(2000) ,а лезете в многопоточность.
Ставьте хук на CreateFile,а потом CopyFile если хотите выдрать файлы из контейнера SFFS или что там у вас за утилита
Для синхронизации нужно использовать WaitForSingleObject, иначе ничего у вас работать не будет



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 04 июля 2013 21:21 · Поправил: volopas
· Личное сообщение · #21

Еще раз задаю вопросы.

Почему suspended приложение не может нормально работать, если до resume основного потока запускались другие потоки?

Обязательно ли высвобождать память , которая выделяется под удаленные потоки?

Прошу либо давать ответы на эти вопросы, либо молчать.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 05 июля 2013 01:34
· Личное сообщение · #22

volopas пишет:
Внутри нее используется GetProcAddressEx , а внутри нее базовая InjectThread, которая и создает удаленный поток


volopas пишет:
Обязательно ли высвобождать память , которая выделяется под удаленные потоки?

Это некорректный механизм! Создавать каждый раз поток, чтоб только импортировать функу - бред. Вполне достаточно просто создать табличку импорта в процессе-пациенте и одним потоком её заполнить.

-----
IZ.RU





Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 05 июля 2013 16:30
· Личное сообщение · #23

volopas пишет:
Почему suspended приложение не может нормально работать, если до resume основного потока запускались другие потоки?

...всё должно работать.
Проблема в том, что вы пытаетесь использовать чужие исходники, скорее всего не до конца понимая их. К тому же я считаю, что вашем случае всё можно сделать гораздо проще. Все эти манипуляции с ручной загрузкой либы абсолютно не нужны.

volopas пишет:
Обязательно ли высвобождать память , которая выделяется под удаленные потоки?

...в принципе да, например:
* выделяем память под шеллкод
* внедряем либу с помощью CreateRemoteThread
* освобождаем память, выделнную для шеллкода
Здесь удалённый поток выполнится в целевом процессе сразу же, поэтому имеет смысл ждать это событие, чтобы освободить память.
Но могут быть нюансы, например:
* выделяем память под шеллкод
* внедряем либу с помощью QueueUserAPC
В данном примере освобождать память не стоит, потому как вероятнее всего apc будет доставлен в целевой процесс только через некоторое время, после того, как пройдёт инициализация процесса. Ждать этого события с помощью WaitForSingleObject, с моей точки зрения, не имеет смысла. Исходя из этого, освобождать память шеллкода нельзя, потому как иначе будет исключение, когда целевой процесс, наконец, решит выполнить ваш шеллкод.

-----
the Power of Reversing team





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 05 июля 2013 18:37
· Личное сообщение · #24

DillerInc

> Все эти манипуляции с ручной загрузкой либы абсолютно не нужны.

Там небыло лодеров, сурсы мсрема это ущербное кривое гавно дестилетней давности.

> * выделяем память под шеллкод

Какой впизду шелл, вы собрались переполнять буфера лодера - так я сразу скажу что их все прочекал вдоль и поперёк, гиблая затея.

> * внедряем либу с помощью CreateRemoteThread
Это созданье треда, какое отношенье там пе формат имеет не понятно.

> * внедряем либу с помощью QueueUserAPC
Опять же. Какое нахуй внедренье ?

Быть может вам следует ознакомиться с осевыми механизмами, которые позволяют выполнить произвольный код - так тонны их. Даже в юзермодах. Запись в память, ремапы, контексты, треды, секции.. это вообще пиздец. Учите ебланы архитектуру!

| Сообщение посчитали полезным: ajax


Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 05 июля 2013 20:04
· Личное сообщение · #25

Собственно, чтобы стало ещё понятнее.
Т.н. "шеллы" для удалённой загрузки либы излишни. Достаточно воспользоваться следующим приёмом и избавиться от необходимости городить опкоды, которые бы правильно выполнялись как в x86, так и в x64. В таком случае выделяемая память будет использоваться только для хранения пути загружаемой либы. Указатель на эту память и будет передаваться как параметр удалённому потоку.

-----
the Power of Reversing team




Ранг: -0.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 июля 2013 21:08
· Личное сообщение · #26

Лично я вообще не понимаю,что хочет сделать ТС. Судя по всему,какую то очередную херовину типа трехпедального велосипеда с квадратными колесами.
Что нужно сделать для получения рабочего кода:
1. понять цель задачи
2. взять литературу
2.1 книги Рихтера по Windows C++
2.2 MSDN майкрософт
3. взять компилятор и собственно откомпилировать требуюмую свинохероблудятину




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 05 июля 2013 21:28 · Поправил: DenCoder
· Личное сообщение · #27

Из литературы ставлю MSDN на первом месте. Можно обойтись без Рихтера, если пореверсить до глубокого понимания --> API Monitor <--, например. С какого-то из шпионов --> отсюда <-- у меня и появился первый опыт в этой тематике. По-моему, kerberos... Ещё через билайн качал эти утилиты 7 лет назад.

-----
IZ.RU




Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 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 или указатель на структуру (запись). Более того, если передавать указатель, то этот указатель находится в адресном пространстве материнского процесса, а не целевого.


Есть ли способ обойти это , не прибегая к шеллу?


Почему модератор на сайте Майкрософт врет?




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 25 сентября 2013 09:15
· Личное сообщение · #29

volopas

Ссылку на структуру передавайте, ну или можно извращаться(не ясно зачем) - получаем текущий стек и впиливаем в него данные.



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 25 сентября 2013 09:32 · Поправил: Veliant
· Личное сообщение · #30

Вы же сами цитируете
>>делать некую структуру

1) Делаете структуру
Code:
  1. typedef struct _Arguments {
  2. int arg1;
  3. int arg2;
  4. } Arguments;
  5.  
  6. Arguments args = {1,2};
  7.  
  8. void WINAPI DestFunc(Arguments *args)
  9. {
  10. //args->arg1;
  11. //args->arg2;
  12. }


2)Выделяете память в нужном процессе и копируете туда структуру
Code:
  1. dstaddr = VirtualAllocEx(..., sizeof(args),...)
  2. WriteProcessMemory(...,dstaddr, &args, sizeof(args) ...)


3) Повторяете пункт два но для функции DestFunc
Code:
  1. fnaddr = VirtualAllocEx(..., размер_функции,...)
  2. WriteProcessMemory(...,fnaddr, DestFunc, размер_функции, ...)


4) CreateThreadEx(....fnaddr, dstaddr..)



Ранг: 6.8 (гость), 1thx
Активность: 0.020
Статус: Участник

Создано: 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
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати