Форум: "Потрепаться";
Текущий архив: 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