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

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

frp
Сообщения: 1445
ОС: Debian Squeeze

fork

Сообщение frp »

Есть программа:

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

#include <unistd.h>
int main()
{
    while(1)fork();
}

Нужно перенести программу на Windows.
PS. Запускать не рекомендую.
Спасибо сказали:
Аватара пользователя
Mage-Warrior
Сообщения: 869
Статус: Семь раз понюхай, один раз откуси!
ОС: SlackWare 12.1

Re: fork

Сообщение Mage-Warrior »

frp писал(а):
08.06.2009 10:44
Есть программа:

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

#include <unistd.h>
 int main()
 {
     while(1)fork();
 }

Нужно перенести программу на Windows.
PS. Запускать не рекомендую.

CreateProcess вместо fork?
*- Большинство проблем, дружок, завсегда покажет лог! -*
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: fork

Сообщение Portnov »

Ну или использовать cygwin или mingw.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

CreateProcess, CreateThread. А также сишные: _spawn*, system, _beginthread, _beginthreadex. В зависимости что конкретно вам нужно - процессы или потоки.
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: fork

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

Для романтического коду, как в начале -
подойдёт CreateProcess &Co,

однако, для классического - нет,

ввиду результативных отличий
в стэке и указателе инструкций... :)
Пойдём на рыбалку !
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

Portnov писал(а):
08.06.2009 11:37
Ну или использовать cygwin или mingw.

А где посмотреть исходники cygwin или mingw (интересует, как там fork сделали)?
А в моем случае CreateProcess пойдет.
Код:

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

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
    while(1)
    {
        CreateProcess( NULL,argv[0],NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
    }
}

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

Re: fork

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

frp писал(а):
08.06.2009 12:45
Как теперь проверить в действии без зависания системы и чем по быстрее?


Можно выставить _T("notepad.exe") во втором параметре... :)
Пойдём на рыбалку !
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

Женя Подсыпальни... писал(а):
08.06.2009 15:33
Можно выставить _T("notepad.exe") во втором параметре... smile.gif

Не понял.
Я, впрочем, уже придумал. У меня в VirtualBox Lenny стоит. Поставлю wine и посмотрю, что будет (по теории Linux от такого не зависнет, но станет очень сильно тормозить).
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

frp писал(а):
08.06.2009 12:45
Как теперь проверить в действии без зависания системы и чем по быстрее?

можно запускать только 2-3 копии, Sleep(100000) и параметр передавать: n, nn, nnn, nnnn.... и когда длина будет, допустим 5-6 - не порождать потомков. потом открыть дисп.задач и посмотреть кол-во процессов :)
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

Программа действует, я испытывал с помощью wine. Но программа работает во много раз медленнее, чем я ожидал.
У меня под виртуальную машину выделено 512Mb и за секунду программа (точнее, сотни и тысячи ее копий) жрет поначалу очень мало, потом достигает сотен килобайт за секунду. Так на ее работу на моей настоящей винде понадобится несколько часов. Это косяк wine, VirtualBox, Linux или моей программы?
PS. Теперь ее на Linux без VirtualBox нестрашно запускать.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

Разобрался - это косяк VirtualBox - на настоящем компьютере под wine поначалу около 3-х секунд ужасно тормозит, а потом wine умирает. Надо попробовать на винде.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

А цель форк-бомбы? (кажись так зовется) Чего хотите достичь, если не секрет.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

NickLion писал(а):
09.06.2009 19:07
А цель форк-бомбы? (кажись так зовется) Чего хотите достичь, если не секрет.

Так называется. Предназначение - повесить комп знакомого с гигабайтом оперативной памяти и двухядерным процессором за малое время.
Попробовал я свою программу под Windows, действует довольно быстро, за 2-3 секунды начинает глючить клавиатура, потом мышь, прервать возможно только ресетом (такую кучу процессов невозможно убить, тем более менеджер задач не запускается). Характеристики моего компьютера - Celeron 1.8 Ghz, 1280 Mb Ram.
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: fork

Сообщение cy6erGn0m »

Я бы написал чуть иначе

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

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
    while(1)
    {
        CreateProcess( NULL,argv[0],NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
        int size;
        for( size = 0xfffff; size > 0; size >>= 1 ) {
            HGLOBAL global = GlobalAlloc(GHND, size);
            if( global )
                break;
        }
    }
}


Это обязательно должно поставить систему в весьма тяжёлое положение.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: fork

Сообщение cy6erGn0m »

Есть ещё одна бяка, в случае если он любит работать от имени администратора:


SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
for(;;);



В случае если SetPriorityClass сработает, то система остановится, включая ядерные потоки и т.п. Всё встанет.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

Какие вы злобные :) А потом рождаются мифы об агрессивности лунуксоидов :D
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

Не-а, так не очень интересно, умирать будет немучительно. Мне нужно, чтобы оно поглючило сначала, а потом умерло. Я по сути добился цели. Теперь самое интересное - надо сделать хотя бы splash-screen. А я в Windows API полный дуб.
Спасибо сказали:
Аватара пользователя
кодировщик
Сообщения: 974
Статус: зарёган в пятницу 13
ОС: Linux

Re: fork

Сообщение кодировщик »

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

Re: fork

Сообщение NickLion »

frp писал(а):
13.06.2009 11:09
Теперь самое интересное - надо сделать хотя бы splash-screen. А я в Windows API полный дуб.

Вот как пример (это 7z архив, просто добавлено rar, чтобы загрузило файл)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: fork

Сообщение cy6erGn0m »

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

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

for( int i = 0;; ++i ) {
    GlobalAlloc(GHND, 1)
    Sleep(i >> 3);
}


При таком раскладе навыделяется жуткая туча однобайтовых областей... бьюсь об заклад что в винде аллокатор сделан неважно, так что его служебные структуры (таблицы, деревья или что он там использует) быстро засорятся и тогда выделение\уничтожение памяти для всех приложений начнёт занимать много времени, всё больше и больше времени. Sleep же сделает этот процесс не столь стремительным. Думаю величину внутри Sleep нужно подобрать вручную.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: fork

Сообщение cy6erGn0m »

Есть ещё одна идея (непроверенная). Можно попробовать написать

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

for( int i = 0;; ++i ) {
    GlobalAlloc(GHND, 0);
}


Если повезёт, то аллокатор не будет выделять толком память, однако наверняка вынужден будет создавать какие-то записи в своих деревьях\таблицах. Если он будет это делать, то ситуация станет ещё более драматичной: аллокатор встанет раком, а память вроде как и не занята.. так что процесс не будет тормозиться свопом или ещё каким-то побочными явлениями.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

GlobalAlloc уже давно не Global - так что это будет проблема приложения. Не больше.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

NickLion писал(а):
13.06.2009 19:36
GlobalAlloc уже давно не Global - так что это будет проблема приложения. Не больше.

А начиная с какой версии он уже не Global?
NickLion
Как собрать ваш splash? Желательно мастдайной версией gcc.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

Как минимум - с поколения NT - NT, 2000, XP, Vista, Win7. Но если правильно помню, то глобальной она была только в 16 битных версиях, а уже в 95 ее лишили этого статуса.
Насчет splah - там проект для 2008 студии. gcc под винду как-то не юзал, но там главное сами cpp - разницы не будет, а вот с ресурсами может быть проблема. Нужно, чтоб в ресурсах был битмап IDB_SPLASH - конкретное число в resource.h. Вообще можно LoadBitmap заменить на LoadImage с параметром IMAGE_BITMAP и там указать путь к файлу на диске, а не из ресурсов тащить.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

Кстати по поводу "сделать винде плохо", раз уж зашла речь о выделении памяти - есть такая штука, как выделить память в другом процессе - VirtualAllocEx. Писать в память другого процесса - WriteProcessMemory. Также при помощи глобальных хуков (SetWindowsHookEx) можно внедрить свою DLL в другие процессы. Запустить там потоки дополнительные, которые будут тормозить другие процессы, а не Ваш. Есть еще CreateRemoteThread, но там нужно указать адрес в пространстве другого процесса, так что все-равно нужно будет свою библиотеку подгрузить. Можно выставлять приоритеты процессов/потоков.
Средств сделать плохо - много. Но все-равно надо заставить пользователя это запустить. Вот это самое трудное. Думаю в линуксе средств сделать плохо не меньше ;)
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

Еще очень интересный вопрос - возможно ли подменить системные библиотеки, содержащие API-функции так, чтобы система при этом хотябы нормально загрузилась? Можно ли подменить эти самые библиотеки только для некоторых процессов?
NickLion писал(а):
14.06.2009 09:28
Но все-равно надо заставить пользователя это запустить. Вот это самое трудное.

Для меня это самое простое - лучше всего проблему решают joinerы, но можно сделать проще - написать програмку, которая запустит два процесса - что-нибудь интересное жертве и вредную программу.
NickLion писал(а):
14.06.2009 09:28
Думаю в линуксе средств сделать плохо не меньше wink.gif

Меньше, и намного:
1) linux от простого пользователя повесить довольно-таки сложно (это касается ядер 2.6 - раньше лимита на количество процессов не было).
2) linux не позволит писать в память другого процесса.
3) простой пользователь сможет навредить себе, но не системе.
4) даже от рута систему проще снести, чем повесить.
5) реально можно повесить linux при помощи модуля ядра, но оно того не стоит.
6) я не видел под linux joinerов.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

frp писал(а):
14.06.2009 13:44
Еще очень интересный вопрос - возможно ли подменить системные библиотеки, содержащие API-функции так, чтобы система при этом хотябы нормально загрузилась? Можно ли подменить эти самые библиотеки только для некоторых процессов?
...
Меньше, и намного:
1) linux от простого пользователя повесить довольно-таки сложно (это касается ядер 2.6 - раньше лимита на количество процессов не было).
2) linux не позволит писать в память другого процесса.
3) простой пользователь сможет навредить себе, но не системе.
4) даже от рута систему проще снести, чем повесить.
5) реально можно повесить linux при помощи модуля ядра, но оно того не стоит.
6) я не видел под linux joinerов.

Зачем подменять? Есть более интересное решение - перехват системных функций. Проще всего - DetoursExpress - средство для перехвата АПИ от самой МС.

1) не пробовал, но возможно под виндой тоже лимит есть - не интересовался никогда
2) ой ли? (в винде тоже не в каждый можно писать или даже читать, в частности в процесс другого пользователя или этого же с повышенными привелегиями - зась)
3) в висте, если пользователь не дурак и не отключил UAC или работает не под админом, то системе процесс тоже не навредит, только вот как обчно - самое ценное - это пользовательские данные, а что мне система? - переставил и все. вот когда после неправильного разбиения диска пропал home мне было все-равно, что root уцелел. сидел с dd, hexdump и grep - искал начало home (ибо gpart не нашло ничего) :)
4) не знаю, но разве сложно снять ограничение (root ведь) и ту же форк-бомбу?
5) ну, тут ясно
6) что есть joiner?
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

NickLion писал(а):
14.06.2009 18:43
Проще всего - DetoursExpress - средство для перехвата АПИ от самой МС.

А это средство можно использовать без ведома пользователя? Идет ли оно в составе Windows XP&
NickLion писал(а):
14.06.2009 18:43
1) не пробовал, но возможно под виндой тоже лимит есть - не интересовался никогда

Гарантия - либо нет, либо очень-очень большой, либо только после XP, т.к. форк-бомба вешает.
NickLion писал(а):
14.06.2009 18:43
2) ой ли? (в винде тоже не в каждый можно писать или даже читать, в частности в процесс другого пользователя или этого же с повышенными привелегиями - зась)

Я когда-то делал программу специально для проверки этой возможности - она пробовала писать в память, которая процессу не принадлежит. В windows она нормально писала в адресное пространство другой программы, а в Linux это не удалось.
Хотя в Linux 2.6.17-2.6.24 был один дирявый системный вызов, который мог писать в память ядра изза того, что там не сделали проверки на адрес памяти.
NickLion писал(а):
14.06.2009 18:43
3) в висте, если пользователь не дурак и не отключил UAC или работает не под админом, то системе процесс тоже не навредит, только вот как обчно - самое ценное - это пользовательские данные, а что мне система? - переставил и все. вот когда после неправильного разбиения диска пропал home мне было все-равно, что root уцелел. сидел с dd, hexdump и grep - искал начало home (ибо gpart не нашло ничего) smile.gif

тут я согласен.
NickLion писал(а):
14.06.2009 18:43
6) что есть joiner?

joiner есть программа, позволяющая склеить два екзешника в один так чтобы при его запуске в одном потоке выполнялось то, что раньше содержалось в первом екзешнике, а в другом - то что в другом екзешнике. Эти программы действуют очень просто - прописывет в заголовке екзешника сегменты из двух других. Теоретически такие программы можно и под Linux написать, но я не видел.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: fork

Сообщение NickLion »

frp писал(а):
14.06.2009 21:30
А это средство можно использовать без ведома пользователя? Идет ли оно в составе Windows XP&

Нет - это небольшая (4кб, кажись) DLL-ка и немного кода. Что значит без ведома пользователя? Установки не требует - просто библиотечка. Можно перехват сделать методом Рихтера, но там куча ошибок (у самого Рихтера) да и не очень хороший метод (но если хотите опишу).

frp писал(а):
14.06.2009 21:30
Я когда-то делал программу специально для проверки этой возможности - она пробовала писать в память, которая процессу не принадлежит. В windows она нормально писала в адресное пространство другой программы, а в Linux это не удалось.
Хотя в Linux 2.6.17-2.6.24 был один дирявый системный вызов, который мог писать в память ядра изза того, что там не сделали проверки на адрес памяти.

В винде есть легитимная функция WriteProcessMemory - это не дырка или баг. Однако, как уже говорил, ее возможности ограничены.
(не верю, что в линуксе нет возможностей перехвата, чтения/записи в другой процесс. Другое дело, что по-умолчанию они могут быть жестче ограничены)

frp писал(а):
14.06.2009 21:30
joiner есть программа, позволяющая склеить два екзешника в один так чтобы при его запуске в одном потоке выполнялось то, что раньше содержалось в первом екзешнике, а в другом - то что в другом екзешнике. Эти программы действуют очень просто - прописывет в заголовке екзешника сегменты из двух других. Теоретически такие программы можно и под Linux написать, но я не видел.

Спасибо. Видимо таких нет, потому что никому не надо :) Не вижу никакой сложности для реализации. Просто делаем fork и в разных ветках стартуем с разных секций. Или я не понял чего-то?
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: fork

Сообщение frp »

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

А как с ней работать?
NickLion писал(а):
14.06.2009 23:55
(не верю, что в линуксе нет возможностей перехвата,

Есть, и очень часто используется, и это даже много где описано, и есть rootkit-ы которые ее используют, но функция доступна только модулям ядра (а оно того не стоит, особенно если учесть, что для его установки необходима пересборка ядра или хотябы наличие kernel-headers).
NickLion писал(а):
14.06.2009 23:55
чтения/записи в другой процесс

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