Промучавшись часа два и доведя своего друга, разбирающегося в Web-программировании, чуть ли не до истерики, я все же сумел внести кое-какие исправления в предыдущий пост -- теперь куски кода стали похожи хоть на что-то... Жизнь прекрасна.
пятница, августа 11, 2006
четверг, августа 10, 2006
Что можно сделать от скуки
Что-то последнее время напало на меня какое-то расслабленное и добродушное настроение -- сижу на форуме и мне даже не лень отвечать более чем 3 словами, интересно, к чему бы это? =) Вероятно, просто скучно...
Но не суть, в общем недавно наткнулся на не вполне тривиальный вопрос -- как перехватить момент закрытия программы для того, чтобы иметь возможность сохранить какие-либо данные. Честно-говоря, вариантов сделать процесс "неубиваемым" (читай отловить момент закрытия), не прибегая к Native'ным функциям и их перехвату, я не знал. Сразу мне вспомнился Антивирус Касперского, авторы которого заявляли, что их детище полностью защищено от посягательств на свою "жизнь" любых вредоносных программ. Однако же, методы нашлись, при желании можно спокойно получить хендл процесса, а дальше -- делай с бедным "касперычем" что хочешь. Т.е. вариант с перехватами отпал, во-1, в силу описанных причин, во-2, потому что, насколько я понял, человеку, которому понадобилось реализовать подобное, нафиг не упали никакие стелс-элементы. В общем, решил я пойти по вполне мирному пути.
Идеи с постоянным сохранением данных в файл и поиском окна приложения для его дальнейшего запуска, я посчитал несколько несолидными и, кроме того, нифига не практичными. Поэтому решил я копать в направлении, подсказанном мне MSDN'ом. А прочитал я об очередности событий, проходящих в момент остановки процесса. Но нифига, как оказалось, мне несветило, хоть потоки и завершаются в первую очередь, но отловить этот момент в основном потоке не удалось =(
Вторая идея была навеяна безысходностью -- попытаться отловить момент, когда ExitCode процесса перестанет быть STILL_ACTIVE, ясное дело, что нифига не вышло =)
В общем, помучавшись некоторое время, я все же вышел на верный курс. Как всегда оказалось, что все самые простые идеи приходит в голову самыми последними. Поскольку, как уже было сказано, никаких нестандартных технологий я решил не использовать, то пришлось пожертвовать еще одним приложением, которое, в принципе, можно объявить как сервис. Либо же, если боротся за максимальную надежность, то все же применить технологии кернел-хака. В голову приходят сразу две идеи:
- инжектировать какой-нибудь критический системный процесс, однако это чревато тем, что анти-руткиты могут попытаться завершить его и комп просто уйдет в ребут.
- инжектировать winlogon -- хрен знает почему, но его никто не трогает =)
В общем, это уже детали реализации, а сам процесс отлавливания закрытия приложения прост до банального -- нам нужно стать для него отладчиком =) В простейшем случае это будет выглядеть следующим образом
После этого мы со спокойной душой можем делать дамп памяти процесса и сохранять все нужные данные =)
| PROCESS_INFORMATION pi; STARTUPINFO si; ::ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); ::CreateProcess("c:\\windows\\notepad.exe", 0, 0, 0, 0, DEBUG_PROCESS DEBUG_ONLY_THIS_PROCESS, 0, 0, &si, &pi); DEBUG_EVENT de; while(WaitForDebugEvent(&de, INFINITE)) { if(de.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) { ::MessageBox(0, "Closing", "Ahtung!", 0); break; } ::ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE); } ::DebugActiveProcessStop(pi.dwProcessId); |
После этого мы со спокойной душой можем делать дамп памяти процесса и сохранять все нужные данные =)
Естественно, что для того, чтобы применять этот код в "бовых" условиях, нужно позаботиться о том, чтобы в случае исключения внутри отлаживаемого процесса, наш "дебаггер" возвращал DBG_NOT_HANDLED. Кроме того, чтобы получить возможность отлаживать процесс, не созданный в режиме DEBUG_PROCESS, нужно получить в системе права отладчика, для этого можно использовать следующий подход:
| void IAmaDebugger(bool debug) { HANDLE hCp; if(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hCp)) { TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; ::LookupPrivilegeValue(0, SE_DEBUG_NAME, &tp.Privileges[0].Luid); tp.Privileges[0].Attributes = debug ? SE_PRIVILEGE_ENABLED : 0; ::AdjustTokenPrivileges(hCp, 0, &tp, sizeof(tp), 0, 0); ::CloseHandle(hCp); } } |
В общем, я остался морально и интеллектуально удовлетворенным, почаще бы такие вопросы возникали =)
ЗЫЖ Бр-р-р-р, как же все-таки непросто мне осознать основы HTML'я -- кто бы мне сказал, как привести код в человеческий вид =(
Написал
sllh
в
11:13 PM
3
комментов.
Категории: Программизм, Cpp
понедельник, августа 07, 2006
Вчера дочитал цикл "Лабиринт отражений" Лукьяненко, не могу сказать, что я когда-либо фанател от этого автора, но что-то эти книги во мне зацепили... Сюжет абсолютно кибер-панковский: виртуальная реальность, люди, которые постоянно погружаются в нее и Леонид -- своего рода Нео, обладающий уникальными способностями. Вроде ничего необычного, но блин, как же все-таки отлично написано. В общем, находясь под впечатлением от прочитанного, общался в аське со своим знакомым, который, собственно и предложил мне почитать "Лабиринт", он, видя, что мне понравилась идея, видимо решил добить меня полностью и дал интересную ссылку, на виртуальный Питер. И как всегда, самое заподло в том, что на тот момент я уже уходил с работы и никакой возможности посмотреть не было, а дома плачу за траффик =(
Теперь вот жду завтра -- буду погружаться =)
Написал
sllh
в
10:41 PM
0
комментов.
Категории: Хобби
воскресенье, августа 06, 2006
На днях получил долгожданный сертификат от Micrisoft. Дело все в том, что месяца 2 назад устроился на курсы по Visual Basic .Net на специалисте. Вначале я хотел просто сдать сертификаионный экзамен, но потом, посмотрев на цену, решил, что заплатив ненамного дороже, я получу нахаляву книжку и диски (гы-гы, вот он -- Русский Менталитет) решил пройти курсы.
Курсы-то я прошел, а вот сертификат ждать пришлось почти полтора месяца, я уже отчаялся его получить, но, тем не менее, он все же пришел =)
Теперь раздумываю над 2 вопросами:
- Зачем мне VB
- Долго ли я буду проходить курс MCSD по C#
Написал
sllh
в
11:46 AM
0
комментов.
Категории: Учеба
Подписаться на:
Комментарии (Atom)
