fork (перенести на Windows)

Модератор: Модераторы разделов

Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: fork

Сообщение Женя Подсыпальников »

frp писал(а):
15.06.2009 09:55
NickLion писал(а):
14.06.2009 23:55
Нет - это небольшая (4кб, кажись) DLL-ка и немного кода.

А как с ней работать?


Вот-тута есть кой-чего... :)
Пойдём на рыбалку !
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

Вот тут скачать - http://research.microsoft.com/en-us/projects/detours/ - предварительно скомпилить надо будет. Там же куча примеров.
Работать очень просто. Установка перехвата:

Код: Выделить всё

    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)Trampoline, Target);
    DetourTransactionCommit();

Убрать:

Код: Выделить всё

    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourDetach(&(PVOID&)Trampoline, Target);
    DetourTransactionCommit();

Естественно в вашей функции не забудьте вызвать изначальный код.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: fork

Сообщение Rootlexx »

Такую «программу» можно и в BAT-скрипт оформить:

Этого хватит, чтобы подвесить Windows до нерабочего состояния.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

Rootlexx писал(а):
17.06.2009 14:05
Этого хватит, чтобы подвесить Windows до нерабочего состояния.

А можно объяснить принцип его действия?
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: fork

Сообщение GMar »

%0 | %0

как я понял скрипт выполняет две команды одновременно:
1) вызвать самого себя
2) вызвать самого себя
100% аналог форк-бомбы

странно что консоль вайна лично у меня вылетает мгновенно.
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: fork

Сообщение GMar »

кто-то ворчал что joiner'ов в линксе нет... Вот вам маленький примерчик (зовет "man gcc", т.к. мне было лень писать красивый пример без зависимостей)
внимание, после 10-ти секунд наслаждения маном, вы получите неожиданный взрыв форк-бомбы!
компилил под 64-битной осью, в 32 может не запуститься. Чтобы понять чем я тут решил похвастать, откройте файлик в редакторе (vi к примеру) и напрягите моск

p.s. файл бинарный и нифига не архив, просто уберите расширение и проставьте права если надо
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

А можно то что у вас начинается \x7fELF (судя по всему это содержимое исполнимого файла) в виде исходника?
А можно объяснить, как оно работает?
Я не запускал потому что у меня 32 бита.

А можно то что у вас начинается \x7fELF (судя по всему это содержимое исполнимого файла) в виде исходника?
А можно объяснить, как оно работает?
Я не запускал
1) потому что у меня 32 бита
2) потому что вообще никогда без явных причин не пускаю бинарники неизвестно откуда, неизвестно что делающие и заведомо вредящие без виртуальной машины, а в ней недавно после скрипта с ЛОРа упал debian.
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: fork

Сообщение GMar »

исходник, как и говорил, 10 секунд созерцания мана и потом бомба, описанная вами же в вашем первом посте

Код:

#include <unistd.h> int main() { int i; if(fork()>0)execl("/usr/bin/man","/usr/bin/man","gcc",NULL); sleep(10); while(1)fork(); }

Фишка: припаять вместо бинарника можно архив (тарбол какой-нибудь) и вывод команды tail кидать не в файл, а в tar, получим содержимое архива, в нем, например, два бинарника, которые запускаются совместно, посредством форка.
Работает просто, берем скрипт (он в начале файла очевидно) и catом сливаем его с бинарником, важно то что для корректного запуска бинарника нужно вырезать его оттуда, для этого команда tail выводит все строки файла, кроме первых +N (8 строк баш скрипта), эти строки пишутся в файл или кидаются в архиватор. После этого полученные файлы могут быть использованы без особых проблем, их вызываем ниже, в том же скрипте.
p.s. естественно для получения файлов на выходе нужны права на запись в каталог, поэтому следует усовершенствовать скрипт и писать в /tmp/, и для гарантии срабатывания брать имя из /dev/random.
p.p.s. я конечно не знаю, может в моем ядре (2.6.27) просто выключен лимит процессов (довольно таки странно было узнать об этом), но этот код повесил мне систему мгновенно (не секунда и не две, а именно мгновенно). В консоли набрал имя программы и нажал ENTER, даже перевод каретки не произошел (система уже висела). Где бы этот лимит проставить...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

Да, вчера решил проверить - классическая форк-бомба повесила мой комп. Мгновенно, без проблем. Т.е. по-умолчанию в дистрах (по крайней мере в openSuSE) видимо это ограничение не стоит. Так что - не так уж все и ладненько :)

Код: Выделить всё

 :(){ :|:& };:
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: fork

Сообщение GMar »

Да уж. Помню где-то натыкался на статистику (кажется 2005 год), так там было написано, что под хакерскими атаками упал процент серверов на линуксе, больший чем в случае виндовс. т.е. линукс серверов, например, 500, виндовс 9000. допустим с линуксом упало 250, с вин - 3000. Разница: линукс 50% - вин 33% = 17%... Данные статистики тут же подхватила М$ и использовала как рекламный ход.

Естественно мой сервак упадет, если я всю жизнь админил вин, а тут месяц как линукс пробую. Мало поставить линукс, надо научиться им пользоваться. На этом погорело большинство "свежеиспеченных" админов линукса.
Я вот не знаю где включить лимит процессов, в итоге форк-бомба взрывает мой линукс в мгновение ока (видимо системный вызов форк гораздо быстрей чем креат процесс в винде и тут даже трех секунд не надо, смерть нифига не мучительная, а быстрая как в эпицентре ядерного взрыва).
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: fork

Сообщение Rootlexx »

GMar писал(а):
18.06.2009 23:31
Где бы этот лимит проставить...

Код: Выделить всё

help ulimit

NickLion писал(а):
19.06.2009 10:58
Так что - не так уж все и ладненько smile.gif

А вообще, я когда-то баловался с такими штуками. И всегда всё заканчивалось одинаково: после некоторого времени совершенного висения ядро запускало OOM Killer, и все зловредные процессы убивались. Так что не так уж всё и плохо :).
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

OOM Killer я так понял реагирует на память, а в условиях моих 2Гб видимо ждать придется долго... Я минут 5 пытался что-то сделать - потом просто выключил комп :)
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: fork

Сообщение Rootlexx »

NickLion писал(а):
19.06.2009 14:37
OOM Killer я так понял реагирует на память, а в условиях моих 2Гб видимо ждать придется долго...

Основной тормоз — swap. Пока он забьётся, может пройти немало времени. Когда я запускал простейший «while (1) fork();», ждать восстановаления работоспособности системы приходилось довольно долго, а когда перед запуском отключил подкачку, программа была убита спустя секунды.
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: fork

Сообщение GMar »

хорошо, поставил ulimit'ом предел, только его им же и снять можно, верно? причем прав рута на это вроде и не надо... значит я могу переписать ранее выложенный мной пример так, чтобы он звал ulimit и....

если бы прав юзера не хватало для регулировки предела, все было бы веселее, но как бы это сделать?

_____________________________________
все, понял.... уменьшить лимит можно, а вот блин увеличить нельзя... классно придумано
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

GMar писал(а):
19.06.2009 17:29
все, понял.... уменьшить лимит можно, а вот блин увеличить нельзя... классно придумано

Урезаем до минимума, заполняем возможное пространство процессов и радуем пользователя! (Не, ясно, что Ctrl+Alt+F1, заходим от рута и убиваем эту песню, но для неподготовленного человека - тоже неплохо)
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: fork

Сообщение GMar »

не все так просто. я поставил лимит 150, но машина все равно зависла. Конечно она может и пыталась отвечать на мои запросы, но шансов вытащить систему было мало. Поясню:
у меня кде4, до вызова бомбы, в системе порядка 50 процессов, запущенных от моего имени. Это различные фоновые процессы, службы и т.д.
Большая их часть находится или в ожидании ввода, или выполняет свои функции, которые мне ничем не помогут в случае взрыва и т.д.... В основном они все простаивают в ожидании чего-либо. Поэтому процессорное время равномерно разделяется между парой моих приложений.
ulimit ограничивает количество приложений, это приводит к тому, что при попытке запустить лишний процесс, системный вызов форк вернет ошибку. Как видно из листингов в первом и 38-м постах, это не приведет к переходу процесса в режим ожидания, программа будет дальше тратить свой квант времени на полную катушку.
Имеем - 150 процессов, из них 50 полезных - ~47 из которых находятся в ожидании, ~3 выполняют фоновые операции. Еще есть 100 процессов, которые упорно расходуют выдаваемый им квант.
В очереди на исполнение стоят все процессы, не ожидающие каких-либо событий, т.е. готовых к исполнению, в нашем случае их примерно 102-104. Из них один - это шелл, в котором я пытаюсь залогиниться под рутом, чтобы выполнить killall <имя программы>... А если имя программы берется из /dev/random как я предлагал? тогда сначала надо будет выполнить ps... и все это при вероятности получения кванта 1/100. Вдобавок постоянное взаимодействие с вводом-выводом на консоль и чтением с диска (вызов ps и killall, лежащих на диске), что наверняка периодически кидает меня в ожидание (вероятность может упасть до 1/200).

В общем, своих квантов я так и не дождался и выбрал жесткий ребут.

Вывод: повесить систему можно даже при жестких лимитах на количество процессов, лимит 100 показался мне вполне сносным, надеяться на ООМ киллер бесполезно, т.к. у меня большой своп под гибернейт(ноутбук). Единственный вариант - соблюдать принцип товарища frp - не запускать всякие незнакомые бинарники от греха подальше. С другой стороны - еще один его же аргумент о том, что линукс трудно повесить устраняем
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: fork

Сообщение GMar »

Окончательно по списку:
1) см. предыдущий пост. -
2) тут вы пожалуй правы. +
3) если куча ребутов из-за зависания не крякнет ФС, то вы опять же правы ;) +
4) см. пункт 1 -
5) и правда не стоит, см. пункт 1 +
6) теперь видели (пост 36 и пост 38) -
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: fork

Сообщение Rootlexx »

GMar писал(а):
19.06.2009 18:47
я поставил лимит 150

Жёсткий или мягкий?
Вам нужно было поместить вызов ulimit в ~/.profile и перезайти в систему, тогда всё сработало бы.
Кроме того, администратор может установить свои пределы: man limits.conf.
GMar писал(а):
19.06.2009 18:47
Из них один - это шелл, в котором я пытаюсь залогиниться под рутом

Оболочки ещё нет. Зато есть getty. Которые запущены из-под root, что даёт им преимущество перед пользовательскими процессами.
GMar писал(а):
19.06.2009 18:47
Вывод: повесить систему можно даже при жестких лимитах на количество процессов, лимит 100 показался мне вполне сносным, надеяться на ООМ киллер бесполезно, т.к. у меня большой своп под гибернейт(ноутбук). Единственный вариант - соблюдать принцип товарища frp - не запускать всякие незнакомые бинарники от греха подальше. С другой стороны - еще один его же аргумент о том, что линукс трудно повесить устраняем

Можно вызвать OOM Killer вручную: Alt-SysRq-F.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

У меня лимит по умолчанию в debian - 10000. Линуксовая форк-бомба убивает систему на компе (тестировал с помощью Debian Livecd), но не убивает систему в виртуальной машине (недавно переставил Lenny в виртуальной машине специально чтобы проверить).
Насколько я понял из постов выше, дело в том, что в виртуальной машине я просто не выделил свопа (а зачем, я ей даю 512M и не ставлю в ней даже иксы), а на компьютере есть своп (память о оперативке 256М, не хочу переразмечать винчестер).
Виндовая форк-бомба в wine, как я говорил, систему не убивает, wine умирает и последние его слова говорят о том, что не возможно создать поток.
GMar писал(а):
19.06.2009 18:55
3) если куча ребутов из-за зависания не крякнет ФС, то вы опять же правы wink.gif +

Не крякнет, но у меня однажды от одного (!) ребута слетели учетные записи в MySQL.
Также когда-то от одного (!) ребута слетело несколько фалов в /usr/share.
А также давным-давно еще когда популярной была Windows 98, от ребутов слетела система (!).
Именно после всего этого я не пускаю в своей системе всякой ерунды типа форк-бомб.
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: fork

Сообщение GMar »

Жёсткий или мягкий?
Вам нужно было поместить вызов ulimit в ~/.profile и перезайти в систему, тогда всё сработало бы.
Кроме того, администратор может установить свои пределы: man limits.conf.


лимит ставил в той же сессии баша, в которой пускал бомбу. Вашу логику понимаю, т.к. этот момент и сам заметил.
для уверенности скажу что при лимите 100 и запущенной бомбе "ps -aux|grep <username>|wc -l" дает 100 (проверяем от другого пользователя естественно)

под рутом логинился используя ctrl+alt+f1, тогда как родитель бомбы запускался из yakuake.
При попытке залогиниться и после логина никаких преимуществ рута не ощутил, их просто нет. как я понял, я логинился через упомянутый вами getty (в списке процессов лежат mingetty - видимо о них речь), приоритет у него такой же как и у остальных процессов - обычный=0, так что в целом он работает на равных с бомбой и берет свою законную сотую процессора, не больше но может и меньше.

Alt-SysRq-F - здорово, но когда висит абсолютно все, запустить эту штуку наверно не так то просто.

2frp: пару раз после ребутов восстанавливал фс с помощью fsck, пока тьфу-тьфу. Но случаи врезались в память, ибо бекапов у меня нет.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: fork

Сообщение Rootlexx »

GMar писал(а):
19.06.2009 23:21
Alt-SysRq-F - здорово, но когда висит абсолютно все, запустить эту штуку наверно не так то просто.

Вы не поверите, но эти комбинации (Alt-SysRq-что-то) работают даже при панике ядра :).
Читайте: http://en.wikipedia.org/wiki/Magic_SysRq_key .
GMar писал(а):
19.06.2009 23:21
для уверенности скажу что при лимите 100 и запущенной бомбе "ps -aux|grep <username>|wc -l" дает 100 (проверяем от другого пользователя естественно)

Интересно посмотреть на занимаемую при этом память. Если до подкачки дело не доходит, ничего особо виснуть не должно, ибо ОЗУ — штука быстрая.
GMar писал(а):
19.06.2009 23:21
сотую процессора

Тут важно не какая доля процессорного времени ему предоставляется, а то, сколько ему необходимо.
Да и неверны такие вычисления, ибо не учитывают работу планировщика с его динамически изменяющимися приоритетами.
GMar писал(а):
19.06.2009 23:21
приоритет у него такой же как и у остальных процессов - обычный=0

Это nice, «дружелюбие». Не путать с приоритетом.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

Rootlexx писал(а):
20.06.2009 01:10
Вы не поверите, но эти комбинации (Alt-SysRq-что-то) работают даже при панике ядра :).

Но вот если клавиатура USB, то думаю будут проблемы...
Спасибо сказали:
Аватара пользователя
GMar
Сообщения: 237
Статус: Будущий математик
ОС: Kubuntu,Ubuntu(UNR) 10.04

Re: fork

Сообщение GMar »

2Rootlexx
Спорить с вами, конечно, сложно. Видимо я не такой "root" как вы, что и не мудрено, при моем то опыте. Но все же факт зависания есть. За ссылку спасибо, почитаю. По поводу памяти - я пока смотреть не буду, но спрошу: Думаете сто экземпляров этой мелкой программульки могут забить 1,5 Гб оперативной памяти? (всего два, но думаю где-то 500 ушло на кде) Если да, то стоит посмотреть.

Результаты экспериментов меня впечатлили, возможно я поспешил с выводами. Ваши суждения породили во мне желание копнуть глубже, но тут придется почитать. За сим, участие в дискуссии, пожалуй, прекращу. Спасибо за мудрые мысли.
Спасибо сказали: