Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.036 c
1-1110352028
John
2005-03-09 10:07
2005.03.20
ListBox


1-1109661374
ANB
2005-03-01 10:16
2005.03.20
Парсер XML


3-1109046479
pluto
2005-02-22 07:27
2005.03.20
Сортировка по убыванию


1-1109935612
santa
2005-03-04 14:26
2005.03.20
шифрование текстовых файлов


14-1109711634
Игорь Шевченко
2005-03-02 00:13
2005.03.20
Катя, с днем рождения!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский