Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

Снова про тот же вирус   Найти похожие ветки 

 
Igor_thief   (2005-02-22 00:56) [0]

Если кто не прочел прошлый пост по вине PANOV, то вот копия:

Это ответы на посты которые были сделаны в предыдущем топике на тему Вирус.

Digitman ©   (21.02.05 13:11) [5]
Спасибо за то что заставляете бороться со своей ленью! Знания то есть. Просто раньше у меня небыло практики программной манипуляции с файлами (копировать, удалять - это просто, а более серьёзных задач не было). Ну а когда человек резко бросается от теории к практике (причем теорию учил не вчера :)), то сразу наступает на грабли, а так-как надо было сделать все побыстрее + так что-бы классно, а не как нибудь "абы вообще работало", пришлось бежать на форум и "канючить". Сорри! Спасибо что наставли на путь верный! Пойду читать, повторять и работать.

Плохиш ©   (21.02.05 13:21) [6]
Тема вопроса - ВИРУС. Ну а так-как "чукча не читатель..." то мог бы и не отвечать.

Ну а дальше идет код поиска сигнатуры. Жду критики и коментариев.

Вот таким макаром ищу сигнатуру:
function TfrmVirus.IsInfected(aPath: string): boolean;
var
 DataFile: THandle;
 fSize: integer;
 s: string;
begin
 try
   DataFile := FileOpen(aPath, fmOpenRead or fmShareDenyNone);
   fSize := GetFileSize(DataFile, nil);
   SetLength(s, fSize);
   FileRead(DataFile, Pointer(s)^, fSize);
   if Pos("Igor_thief", s) <> 0 then Result := true;
 finally
   CloseHandle(DataFile);
 end;
end;


 
Kerk ©   (2005-02-22 06:57) [1]

Иди в ветку про ДОМ2.. там как раз тупых дур вроде тебя обсуждают.. флудить не надоело?


 
Digitman ©   (2005-02-22 10:19) [2]

function FindSignature(aFile: String; aSign: String; var Offset: DWord): Boolean;
var
 fSize, sSize: DWord;
 hFile, hMap: THandle;
 p, ptr: PByte;
 cmpcount: DWord;
begin
 Result := False;
 sSize := Length(aSign);
 if sSize = 0 then Exit;
 Offset := 0;
 hFile := FileOpen(aFile, fmOpenRead or fmShareDenyNone);
 Win32Check(hFile >= 0);
 try
   fSize := FileSeek(hFile, 0, 2);
   if fSize < sSize then Exit;
   hMap := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, fSize, nil);
   Win32Check(hMap > 0);
   try
     ptr := MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, fSize);
     Win32Check(Assigned(ptr));
     try
       cmpcount := Succ(fSize - sSize);
       p := ptr;
       while cmpcount > 0 do
         if CompareMem(ptr, PChar(aSign), sSize) then
           begin
             Offset := DWord(ptr) - DWord(p);
             Result := True;
             Break;
           end
         else
           begin
             Inc(ptr);
             Dec(cmpcount);
           end;
     finally
       UnmapViewOfFile(ptr);
     end;
   finally
     CloseHandle(hMap);
   end;
 finally
   CloseHandle(hFile);
 end;
end;
..
var
 Offs: DWord;
..
 if FindSignature("SomeFile.exe", "Igor_thief", Offs) then
   ShowMessage("Signature found at offset " + IntToStr(Offs))
 else
   ShowMessage("Signature not found");


 
Igor_thief   (2005-02-22 13:43) [3]

Kerk ©   (22.02.05 06:57) [1]
Так хочется обматерить таких ... как ты, но времени нету, да и не красиво это.

to Digitman
Спасибо! А что по-поводу моего варианта?


 
старый маразматикЪ   (2005-02-22 14:02) [4]


> Igor_thief   (22.02.05 13:43) [3]

если файл достаточно большой, то вариант [2]


 
Kerk ©   (2005-02-22 14:10) [5]

Igor_thief   (22.02.05 13:43) [3]
Так хочется обматерить таких ... как ты, но времени нету, да и не красиво это.


Так хочется много сказать о ... упертых и нежелающих думать ... как ты. Но не буду.


 
Digitman ©   (2005-02-22 14:34) [6]


> что по-поводу моего варианта?


дерьмовый вариант .. извини уж за прямоту ..

кстати, в [2] допускаются только файлы размером до 4Гб


 
Digitman ©   (2005-02-22 14:37) [7]

мало того, твой вариант будет НЕработоспособен на НЕтекстовых файлах.


 
BiN ©   (2005-02-22 14:49) [8]

вариант неработоспособен также из-за Pointer(s)^


 
DiamondShark ©   (2005-02-22 14:55) [9]


> кстати, в [2] допускаются только файлы размером до 4Гб

Это формально. Реально -- мно-ого меньше.


 
begin...end ©   (2005-02-22 15:47) [10]

> BiN ©   (22.02.05 14:49) [8]

Почему?


 
Digitman ©   (2005-02-22 16:27) [11]


> begin...end ©   (22.02.05 15:47) [10]
> Почему?


потому что сия конструкция вернет не указатель на буфер строки, а указатель на упр.структуру


 
begin...end ©   (2005-02-22 16:41) [12]

> Digitman ©   (22.02.05 16:27) [11]

Не понял. Разве в итоге не получится указатель на первый символ?

var
 S: String;
begin
 SetLength(S, 10);
 if Pointer(S) = @S[1] then Beep
end.


 
Digitman ©   (2005-02-22 17:08) [13]

э-э-э ... пардон ...

действительно, Pointer(S) = PСhar(S) = @S[1]

компилятор - умница, хотя и неочевидная задача ставится ему в случае Pointer(S)

с другой стороны, по рукам бы дать тому, кому по барабану - то ли Pointer(S), то ли PChar(S)..


 
Igor_thief   (2005-02-22 19:12) [14]

Да будет пработать этот вариант с текстовыми файлами! И кстатии, этот вариант был предложен для поиска файлов в книге Стива Тейксейры и Ксавье Пачеко (Delphi 6 - руководство разработчика). Да и вариант Digitman"a не сильно отличается. Разве что работает быстрее из-за того, что работает с файлом отображонным в память.


 
GrayFace ©   (2005-03-02 18:36) [15]

Digitman ©   (22.02.05 17:08) [13]
Вполе очевидная тут задача у компиллятора. Строка - это и есть указатель на первый символ:
var s:string;
begin
 s:="abc";
 if integer(PChar(s))=PInt(@s)^ then MessageBox(0,"","",0);
end;


 
VMcL ©   (2005-03-02 20:10) [16]

>>Digitman ©   (22.02.05 17:08) [13]

AFAIR, в общем случае Pointer(S) не эквивалентно PChar(S). Посмотрите CPU Window.


 
Anatoly Podgoretsky ©   (2005-03-02 20:38) [17]

GrayFace ©   (02.03.05 18:36) [15]
НетЮ стока не есть указатель на первый символ.
S := "";
Где здесь первый символ?
А PChar это не приведение, а функция.


 
Fay ©   (2005-03-02 21:35) [18]

2 Digitman ©   (22.02.05 10:19) [2]
Я бы делал так же, но тут такая штука
>> fSize := FileSeek(hFile, 0, 2);
>> if fSize < sSize then Exit;

Странный способ получения размера файла. Результат FileSeek знаковый, а fSize - нет. 8)
Раз уж CreateFileMapping(hFile, nil, PAGE_READONLY, 0, fSize, nil) и MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, fSize);, то  FileSeek(hFile, 0, FILE_END);


 
GrayFace ©   (2005-03-03 16:08) [19]

VMcL ©   (02.03.05 20:10) [16]
AFAIR

А что это?

Anatoly Podgoretsky ©   (02.03.05 20:38) [17]
НетЮ стока не есть указатель на первый символ.
S := "";
Где здесь первый символ?

Конечно, здесь будет nil, просто я не имел ввиду общий случай.

Anatoly Podgoretsky ©   (02.03.05 20:38) [17]
А PChar это не приведение, а функция.

Действительно. Даже для AnsiString-ов вызывается функция. Но зачем?


 
Anatoly Podgoretsky ©   (2005-03-03 16:10) [20]

Затем если nil то вернуть суррогат на временную пустую строку.



Страницы: 1 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
4-1107347991
Artur
2005-02-02 15:39
2005.03.20
Shell


6-1105444565
Grant
2005-01-11 14:56
2005.03.20
TClientSocket &amp; TServerSocket


3-1108481246
СанЁк
2005-02-15 18:27
2005.03.20
ADO Naximum records???


14-1109169966
IronHawk
2005-02-23 17:46
2005.03.20
Паучек!


3-1108536863
Серж_Евдокимов
2005-02-16 09:54
2005.03.20
Посоветуйте плиз менеджер БД для MS SQL вместо Enterprise Manager