Новогоднее западло BUG(O)R Хакер, номер #096, стр. 096-088-3 А теперь на полном серьезе рассмотрим технические недостатки нашей шутки. Во-первых, если жертва напишет поздравление непосредственно в почтовике или в web-интерфейсе mail-сервиса, замены не произойдет. Во-вторых, я намерено не стал скрывать главного окна как этой, так и последующих программ. Я не троянмейкер, а если ты на свой страх и риск все же хочешь «полноценных» приколов, то модернизировать мой код - как 2 байта переслать. Теорию я тебе расписал, а на практику у тебя есть как минимум 10 дней. Поэтому дерзай :). К чертям математику... Что такое Новый год? Помимо елки, подарков, шампанского и Деда Мороза, это лишние затраты на подарки и организацию поляны :). Как правила, все финансы считаются, не отходя от компа, а конкретно - на самом обычном калькуляторе. Интересно, как изменится в лице твой товарищ, когда при подсчете затрат увидит в числовом поле калькулятора какую-нибудь фразу. Например, такую: «Уважаемый, ИМЯ_КОМПЬЮТЕРА! Калькулятор просит Вас зарегистрировать Windows». Или такую: «Все расходы на Новый год спонсирует Microsoft». На первый взгляд это может показаться немного банально, но никто не мешает тебе придумать свою более оригинальную строку :). Можно намутить чего-нибудь с названием кнопочек и прочего, но это не имеет отношения к перехвату API, который мы здесь решили использовать. Впрочем, руки я тебе не связываю - доработать прогу ты можешь всегда. А пока я расскажу о реализации вышеупомянутого прикола. Мониторить наличие процесса calc.exe мы будем так же, как и в случае с блокнотом. Для этого в исходнике проекта, следящего за процессом, надо изменить всего лишь одну строку: hWnd := FindWindow('SciCalc', nil); main.dll тоже надо немного подкорректировать, фукнцию перехвата - переписать, она будет совсем простой: Слегка измененная функция модуля function NSetWindowTextW (hWnd: HWND; lpString: PWideChar): BOOL; stdcall; begin asm pushad end; TSetWindowTextW(GetParent(hWnd), lpString); asm popad end; TSetWindowTextW(hWnd, NewBuffer); end; Используемый для заполнения NewBuffer код должен быть исполнен однократно, поэтому его можно поместить в процедуру DLLEntryPoint, событие DLL_PROCESS_ATTACH: Еще одно изменение dwSize := sizeof(UserName); GetUserName(UserName, dwSize); NewString := 'Уважаемый ' + UserName + ', пожалуйста, зарегай Windows!!!'; NewBuffer := GetMemory(Length(NewString) * SizeOf(WideChar) + 1); StringToWideChar(NewString, NewBuffer, Length(NewString) + 1); FreeMemory(NewBuffer); Один взмах пера, и очередной прикол готов :). Ты теперь можешь глумиться не только над блокнотом, но и над калькулятором. Настало время покорить вообще всю винду товарища. Вперед к приключениям :)! |