почитал я тут вот это и мои руки стали чесаться. Вот только думаю как это дело будет работать если прогу закрыли. Т.е. ни как. А охото чтоб она остовалась. Я возможно не правильно понял? Но у меня такой ход мысли: <ul type=disc> <li>создаем кусок памяти(GlobalAlloc) <li>копируем процедуру туда(если у треда свой стек и регистры pusha/popa не нужен?) <li>создаем тред(CreateThread) с указателем на функцию <li>и з чистой совестью закрываем прогу. </ul> Будет работать, или я размечтался?
warsem Если программа завершится, т.е. завершится основной процесс, автоматически умрут все его треды. Надо отдельный процесс запускать через CreateProcess.
warsem Процесс при создании сразу получает один "халявный" тред. А основной тред в свою очередь может создать ещё один или более тредов.
"Можно узнать, а в чем разница между процесом и тредом? И чем себя процес дескредитировал в твоих глазах?" хм.. Поставлю вопрос прямо. Хочу чтоб прога висела в памяти и выполняла работу, пока тачка просто работает. У z0mbie в FAQ последняя тема треды, но тема увы не раскрыта... А у Iczelion'а про это вообще ничего не говориться... Поэтому пока только одни догадки, и ни каких идей. "Будет, если создать тред в "удаленном" процессе, который должен оставаться работать " а как сие сотворить? И что можно создать тред, который не будет ни кому принадлежать? "Процесс при создании сразу получает один "халявный" тред. А основной тред в свою очередь может создать ещё один или более тредов." - эт оно и я понял. Вопрос в том как оставить его работать, после завершения процесса.
warsem Нет После завершения процесса, которому принадлежит данный тред - НИКАК. Нужно противостоять попыткам пользователя завершить процесс, спрятать процесс и т.д. Поиск по форуму.
warsem Будет работать, или я размечтался? Это мой любимый способ оставить код резидентом. На примере 9х/Ме (под NT/XP я брезгую писать проги): 1. Выделить память под код и данные выше 2Гб. Я использую для этих целей пару _PageReserve/_PageCommit вызываемые через VxDCall 2. Скопировать туда что надо 3. Затем сделать врезку в системе на этот код, чтобы он получал управление в нужный момент. Если нужно сделать обычный тред, то тогда идеальное место для перехвата/врезки -- это _ContextSwitch. После перехвата _ContextSwitch получаешь тред, выполняемый с самым высоким приоритетом во всех контекстах (надо только подождать переключения на нужный контекст). Естественно, сей "тред" никак не виден ОС и не убиваем. Этот механизм использовала StarForce для реализации "per-thread IDT". Для NT/XP всё конечно же по другому, но принципы должны оставаться верными.
хм. Из предложенного вижу перспективным спрятать процесс. Патчить код, слишком круто, я с 0-м кольцом еще не "знаком". Asterix т.е.? заразить эксплорер и при запуске создавать тред. Хм. Да, впринципе идея ничего, только эксплорер заражать не удобно, всякие там оверлеи. Но идея ясна, можно и что другое, постоянно запускаемое заражать. Идея Quantum: создав процесс и спрятав его, он будет пахать тихонько и не кто его не видет. Енто я правильно понял? т.е. в принципе и тред не нужен.
warsem Ты описание функции CreateRemoteThread смотрел? Я не предлагал заразить что-то лежащее на диске, explorer всегда запущен, и соответсвенно во время старта твоей проги(виря?) он тоже будет запущен, копируй код, создавай thread какой хочешь и глуши свою прогу, thread естно останется работать в процессе explorer
Asterix "...копируй код, создавай thread какой хочешь и глуши свою прогу, thread естно останется работать в процессе explorer..." Как это? Я создам тред, закрою процесс который его создал и тред останиться? Или как понять "глуши прогу", скрыть от глаз? Просто раннее Quantum говорил, что при закрыетие процеса дохнут все его треды.
thread будет принадлежать "удаленному" процессу explorer и завершится только с завершением процесса explorer
Я тут сделал свои жалкие попытки... Вообщем у меня CreateRemoteThread глюково вызываеться. Я подозревая что не правильно ее вызываю. Это я нашел в win32.hlp(из борландовского лукошка): HANDLE CreateRemoteThread( <ul type=disc><li>HANDLE hProcess, //это ясно. Но сразу вопрос на будущее, нуль можно сунуть, или нужно этот долбанный GetModuleHandle вызывать? <li>LPSECURITY_ATTRIBUTES lpThreadAttributes, //оффсет на мега структуру(ниже о ней) <li>DWORD dwStackSize, //это длина стека <li>LPTHREAD_START_ROUTINE lpStartAddress, //это на начало функции. Да тут тоже вопрос. У тред свои регистры, свой стек, т.е. pusha/popa не нужны? <li>LPVOID lpParameter, //это вообще не понятно что за штука <li>DWORD dwCreationFlags, //какие еще флаги? <li>LPDWORD lpThreadId //сново не понятная чушь </ul> ); Это та структура с атрибутами: typedef struct _SECURITY_ATTRIBUTES {<ul type=disc> <li> DWORD nLength; -чья длина? Треда чтоль? <li> LPVOID lpSecurityDescriptor; понял что если нуль то чтото случиться <li> BOOL bInheritHandle; тоже унбекант. </ul>} SECURITY_ATTRIBUTES; Вообщем тотальные проблемы с английским. Нигде никогда его не учил. Только знаю что такое input/print- из школьного курса бейсика ЗЫ Может бывают русские инфы по АПИ?
HANDLE hProcess - нужен валидный хэндл процесса эксплорера, NULL не катит pusha/popa не нужны LPVOID lpParameter - это параметр, который ты можешь передать в свою ThreadProc (только один). Можно ничего не передавать - NULL ThreadProc proc lpParameterWORD DWORD dwCreationFlags - если NULL, тред стартует сразу после создания, если CREATE_SUSPENDED - спит, пока его не разбудят LPDWORD lpThreadId - это адрес переменной, куда вернется ID твоего треда. Если он не нужен (ID), можно NULL. DWORD nLength - размер структуры, а не треда: sizeof(SECURITY_ATTRIBUTES) А вообще лучше msdn, чем борландовский хэлп. Поподробней будет _2085248007__CreateRemoteThread.zip
Это самое, а как работает GloabalAlloc, он после зарытия проги убивает кусок памяти или он остаеться занятым?
warsem > "а как работает GloabalAlloc, он после зарытия проги убивает кусок памяти..." Угу, вся динамическая память погибает вместе с процессом. Похоже, ты упрощенно понимаешь задачу. Удаленный (remote) тред должен выполняться в адресном пространстве удаленного процесса, поэтому функция lpStartAddress должна существовать в этом процессе. А посему нужно ее сначала туда прописать.