информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsСетевые кракеры и правда о деле ЛевинаВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Ростелеком заподозрили в попытке... 
 Линуксовый ботнет, распространяющийся... 
 Конец поддержки Internet Explorer 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
:) 09.03.06 13:44  Число просмотров: 2057
Автор: Kirka Статус: Незарегистрированный пользователь
<"чистая" ссылка>
:)
вы не понимаете
я не могу придумать как из ней вообще обратиться к какой-либо функции

когда создаешь CreateRemoteThread, в аргументе можно передать адрес любой функций, но здесь функцию вызывает сам процесс-жертва, передавая ей только те аргументы, которые он передал подменяемой функции
я подменяю winsock'овский send
моя функция выглядит так:

static int _stdcall hooksend(SOCKET s, const char * buf, int len, int flags)
{
/*этой функции доступны s, buf, len, flags, которые процесс-жертва записал в стек командой push, перед тем как вызвать сделать call ...,
но как теперь отсюда вызвать какую-нибудь api-функцию, например WaitMessage???*/
}
<programming>
Очень нужна помощь! Столкнулся с проблемой:( не знаю как решить 08.03.06 22:39  
Автор: Kirka Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Из своего процесса выделил память в процессе-жертве функцией VirtualAllocEx, записал туда свою функцию, подменил в таблице импорта процесса-жертвы оригинальный адрес на адрес своей функции.
НО! Как мне сделать хоть какое-то взаимодействие этой функции в процессе-жертве с моим процессом?

Тоесть как мне передать этой функции допустим 32-битное значение, чтобы использовать его в ней, когда она будет вызвана по таблице импорта процессом-жертвой?

Подскажите пожалуста! Я сначала даже как-то не подумал об этом :(
А может расскажи что ты там такое мутишь? 08.03.06 23:21  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
IPC (inter process communication) в винде валом.
секции, шаред секции в исполнимых модулях, пайпы, юзерские мессаги, сокеты в конце концов..
смотри: 08.03.06 23:42  
Автор: Kirka Статус: Незарегистрированный пользователь
Отредактировано 08.03.06 23:55  Количество правок: 1
<"чистая" ссылка>
смотри:
я внедрил свою функцию в процесс-жертву из другого (своего) процесса - сначала выделил память под код внедряемой функции при помощи VirtualAllocEx, потом записал туда этот код при помощи WriteProcessMemory

Потом заменил в таблице импорта процеса-жертвы одну из api функций своей, тоесть перезаписал адрес в таблице, и теперь при вызове данной api функции вместо стандартной вызывается моя внедренная.

Вот как из этой функции передать что-либо в свой процесс? либо из моего процесса передать что-то в неё ? хотябы просто 32-битное значение?

С CreateRemoteThread всё понятно, т.к. она позволяет передавать создаваемому потоку 32-битный аргумент
НО! Здесь внедренная функция вызывается процессом-жертвой через таблицу импорта. Получается что ей будут доступны только те данные которые передал процесс-жертва(думая что вызывает api). Как мне во время исполнения внедренной функции, передать ей что-то? Вот как решить эту проблему?
Сказали же, читай об IPC. Трубы, сокеты, разделяемая память, файлы, события для сигнализации что данные готовы — всё к твоим услугам. 09.03.06 09:58  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 09.03.06 09:59  Количество правок: 2
<"чистая" ссылка>
да я знаю и события и разделяемую память 09.03.06 12:34  
Автор: Kirka Статус: Незарегистрированный пользователь
<"чистая" ссылка>
да я знаю и события и разделяемую память
не в этом пробелма
когда внедренную фукнцию вызывает прецесс-жертва через таблицу импорта, ей доступно только то что передал ей этот процесс, и как из неё вызвать какую-то, даже api'шную функцию - вот в чем проблема
Перед «инфицированием» чужого процесса выделить там памяти... 09.03.06 13:58  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 09.03.06 13:58  Количество правок: 1
<"чистая" ссылка>
> да я знаю и события и разделяемую память
> не в этом пробелма
> когда внедренную фукнцию вызывает прецесс-жертва через
> таблицу импорта, ей доступно только то что передал ей этот
> процесс, и как из неё вызвать какую-то, даже api'шную
> функцию - вот в чем проблема
Перед «инфицированием» чужого процесса выделить там памяти на несколько десятков байт больше, прописать туда адреса функций GetModuleHandle/LoadLibrary, GetProcAddress и дальше всё как обычно.
ну так а кто сказал что будет легко? 09.03.06 12:56  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Я бы на твоем месте сделал бы SendMessage если там у тя тока 32 бита передаются. Если это возможно конечно (между десктопами мессаги слать затруднительно, между оконными станциями очень затруднительно). Потому - ты пишешь прогу ты и выбирай что те надо.
ну эта функция может полезть в отображаемый файл с предопределенным именем? 09.03.06 12:55  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
А в нем и передать последующие инструкции.
:) 09.03.06 13:44  
Автор: Kirka Статус: Незарегистрированный пользователь
<"чистая" ссылка>
:)
вы не понимаете
я не могу придумать как из ней вообще обратиться к какой-либо функции

когда создаешь CreateRemoteThread, в аргументе можно передать адрес любой функций, но здесь функцию вызывает сам процесс-жертва, передавая ей только те аргументы, которые он передал подменяемой функции
я подменяю winsock'овский send
моя функция выглядит так:

static int _stdcall hooksend(SOCKET s, const char * buf, int len, int flags)
{
/*этой функции доступны s, buf, len, flags, которые процесс-жертва записал в стек командой push, перед тем как вызвать сделать call ...,
но как теперь отсюда вызвать какую-нибудь api-функцию, например WaitMessage???*/
}
Возвращаемся назад 09.03.06 15:13  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Зачем городить свой код в том процессе? Почему нельзя просто загрузить в него свою длл и дальше делать все без геморра? Сильно хочется спрятать свою длл от какого нить процесс эксплорера? Так это можно сделать перехватом ZwQuerySystemInformation
А, у тебя тут всё сложнее... Тогда самому парсить адресное пространство процесса в поисках таблиц экспорта из kernel32.dll и иже с ними. 09.03.06 14:10  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Что вы думаете по этому поводу? 09.03.06 16:09  
Автор: Kirka Статус: Незарегистрированный пользователь
Отредактировано 09.03.06 16:11  Количество правок: 2
<"чистая" ссылка>
Нет библиотеку нельзя подключать.

У меня есть идея.
Я тут щас разбирался, дизассемблил код внедряемой функции, который создается компилятором...

Можно сделать так:
static int __stdcall sendhook(...)
{
BOOL (WINAPI * _WaitMessage)(VOID);
*(FARPROC *)&_WaitMessage = 0x12345678;
_WaitMessage();
}
В своём процессе, ещё ДО WriteProcessMemory, в буфере который содержит sendhook функцию, будет участок вида mov dword ptr[esp+..], 0x12345678 (или что-то в этом роде...)
вот там изменить 0x12345678 на значение полученное из GetProcAdrress(..., "WaitMessage")
а потом уже измененный код записывать в процесс-жертву через WriteProcessMemory

Что вы думаете по этому поводу?

(Я понимаю что kernel32.dll не гарантрированно загружается в одно и то же место... но у меня 100% случаев передача адресов из kernel32.dll между процессами нормально работало)
Можно менять шаблон, а можно и передавать вместе с кодом... 11.03.06 03:01  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Что вы думаете по этому поводу?

Можно менять шаблон, а можно и передавать вместе с кодом структуру. Смещение этой структуры относительно конкретной инструкции (чаще всего начала) - полностью на совести программиста, а получить свой адрес проще простого:

call get_addr
get_addr:
pop eax

---

> (Я понимаю что kernel32.dll не гарантрированно загружается
> в одно и то же место... но у меня 100% случаев передача
> адресов из kernel32.dll между процессами нормально
> работало)

А ты попробуй скомпилять экзешник (свой или жертвы - не важно) по preferred-базе кернела32 и наслаждайся крахом. Нельзя надеяться на то, что на самом деле происходит не всегда.

Если уж так сильно не хочется проходить по таблице экспортов (на самом деле это очень легко), то скорее всего так как сам модуль kernel32 остается неизменным, то лучше найти (во внедряющем процессе) смещение нужных функций относительно начала модуля, а в процессе жертве найти этот модуль и прибавить смещение.

Поиск модуля не такое уж сложное дело. В сегменте fs любого потока в пользовательском режиме находится TEB, который как известно начинается с NT_TIB, который в свою очередь по смещению 0x18 содержит поле Self - FLAT адрес начала этой структуры. Таким образом код

PTEB teb;
__asm mov eax, fs:0x18
__asm mov teb, eax

---

занесет в переменную teb указатель на TEB текущего потока.

А teb->ProcessEnvironmentBlock->Ldr->InLoadOrderModuleList содержит голову списка из nt!_LDR_DATA_TABLE_ENTRY-ей, соответствующих загруженным в текущий процесс модулям. Найти kernel32 по имени и получить его базовый адрес - тривиальная задача, не требующая вызова никаких библиотечных функций.
работает :) 09.03.06 19:00  
Автор: Kirka Статус: Незарегистрированный пользователь
<"чистая" ссылка>
работает :)
зато теперь вторжение ни один файрвол не обнаружит, да?
я слышал файрволы засекают подключение библиотек... CreateRemoteThread файрволы не прослеживают?
Прослеживают 09.03.06 19:47  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
По моим сведениям Agnitum Outpost вообще запрещает доступ в инет программам в чью память ктонить(за исключением прямого процесса-предка) чтонить записал через WriteProcessMemory.
Но сам я не юзаю агнитум так что подвердить не могу.
Но тем не менее точно могу сказать что тот же ZoneAlarm покажет юзеру попапчик что ктото (укажет кто именно) пытается записать чтото в память такого-то процесса.
и че делать? как им запретить творить такое? 09.03.06 20:11  
Автор: Kirka Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Бросить заниматься фигнёй и начать Творить на благо человечества :) 10.03.06 06:59  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
какраз на благо человечества я и творю, а точнее по просьбе... 10.03.06 22:31  
Автор: Kirka Статус: Незарегистрированный пользователь
<"чистая" ссылка>
какраз на благо человечества я и творю, а точнее по просьбе большого количества людей :)

а есть еще какие-нить возможности внедрить и запустить свой код в другом процессе?
я где-то в статье видел, можно запустить процесс в приостановленном состоянии и при помощи какой-то структуры или библиотеи, точно не помню, сменить у процесса EIP и указатель на стек.. но это не то, так как мне нужно чтоб программа внедрялась в процесс во время его работы а не загружала его самого
Да, так можно. Маленькое «но» — адреса вызовов будут отличатся для разных сборок винды. Поэтому самый правильный вариант — парсить адресное пространство процесса на предмет таблиц экспорта для нужной функции. 09.03.06 16:25  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach