PDA

View Full Version : سوال : چگونگي ساخت يك Anti-Virus



BORHAN TEC
سه شنبه 08 دی 1388, 19:00 عصر
چه نكاتي را در مورد روش ساخت و الگوريتمهاي شناسايي ويروسها پيشنهاد مي كنيد؟

با تشكر...

Mask
سه شنبه 08 دی 1388, 22:07 عصر
قرار بود یه صحبتی با هم داشته باشیم.
در مورد الگوریتمهای منطقی و غیر منطقی.

BORHAN TEC
جمعه 11 دی 1388, 22:23 عصر
راستش من دارم روی یک پروژه کار میکنم که در قسمتی از برنامه باید کاری کنم که در هنگام اتصال فلش مموری به سیستم برنامه ام فعال شده و جلوی ویروسهای اتوران را بگیرد. به طوری که در هنگام حافظه فلش به سیستم، برنامه خودم به محض فعال شدن به دنبال فایل Autorun.inf بگردد به فایلهایی که نامشان در autorun.inf آمده اجازه اجرا ندهد، در این هنگام برنامه من باید یک پیام نمایش دهد و برای اجازه دادن برای اجرای این فایلها از کاربر تاییدیه بگیرد . اگر کاربر اجازه داد این فایلها اجرا شوند والا اجازه اجرا شدن ندهد. من از یکی از اساتیدم شنیدم که برای چنین کاری باید از وقفه ها استفاده کنم . آیا غیر از این کار راه دیگری سراغ دارید. دقت کنید که این کار باید به صورت real-time انجام شود، به عبارت دیگر می خواهم که برنامه به صورت دایم نیاز به سرکشی نداشته باشد. آیا این راه قابل پیاده سازی است؟ آیا راه ساده تر و بهتری سراغ دارید؟
اگر راه حلی به ذهنتان میرسد حتماً بگویید، لطفاً!!!!!

joker
جمعه 11 دی 1388, 23:35 عصر
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,iOCTL;

type
TForm1 = class(TForm)
Label1: TLabel;
Memo1: TMemo;
private
{ Private declarations }
procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;

public
{ Public declarations }
end;




var
Form1: TForm1;

{----------------------------------------------------------------------------}
// Device constants
const
DBT_DEVICEARRIVAL = $00008000;
DBT_DEVICEREMOVECOMPLETE = $00008004;
DBT_DEVTYP_VOLUME = $00000002;

// Device structs
type
_DEV_BROADCAST_HDR = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
end;
DEV_BROADCAST_HDR = _DEV_BROADCAST_HDR;
TDevBroadcastHeader = DEV_BROADCAST_HDR;
PDevBroadcastHeader = ^TDevBroadcastHeader;

type
_DEV_BROADCAST_VOLUME = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
dbcv_unitmask: DWORD;
dbcv_flags: WORD;
end;
DEV_BROADCAST_VOLUME = _DEV_BROADCAST_VOLUME;
TDevBroadcastVolume = DEV_BROADCAST_VOLUME;
PDevBroadcastVolume = ^TDevBroadcastVolume;


implementation



{$R *.dfm}

procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var lpdbhHeader: PDevBroadcastHeader;
lpdbvData: PDevBroadcastVolume;
dwIndex: Integer;
lpszDrive: String;
begin

// Perform inherited
inherited;

// Get the device notification header
lpdbhHeader:=PDevBroadcastHeader(Msg.lParam);

// Handle the message
lpszDrive:='Drive ';
form1.memo1.lines.Add(inttostr(Msg.WParam)+' '+inttostr(Msg.LParam) );

case Msg.WParam of
DBT_DEVICEARRIVAL : {a USB drive was connected}
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
lpdbvData:=PDevBroadcastVolume(Msg.lParam);
for dwIndex :=0 to 25 do
begin
if ((lpdbvData^.dbcv_unitmask shr dwIndex) = 1) then
begin
lpszDrive:=lpszDrive+Chr(65+dwIndex)+':';
break;
end;
end;
Label1.Caption:=lpszDrive + ' connected';
end;
end;
DBT_DEVICEREMOVECOMPLETE: {a USB drive was removed}
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
lpdbvData:=PDevBroadcastVolume(Msg.lParam);
for dwIndex:=0 to 25 do
begin
if ((lpdbvData^.dbcv_unitmask shr dwIndex) = 1) then
begin
lpszDrive:=lpszDrive+Chr(65+dwIndex)+':';
break;
end;
end;
Label1.Caption:=lpszDrive + ' removed';
end;
end;
end;
end;




end

Felony
شنبه 12 دی 1388, 04:00 صبح
چند وقت پیش یک کامپوننت نوشتم و قرار دادم که برای تشخیص وصل شدن یا جدا شدن یک دستگاه USB بود ، میتونید از پست شماره 6 این تاپیک (http://barnamenevis.org/forum/showthread.php?t=193659)دانلودش کنید .

vahid64
دوشنبه 14 دی 1388, 17:59 عصر
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,iOCTL;

type
TForm1 = class(TForm)
Label1: TLabel;
Memo1: TMemo;
private
{ Private declarations }
procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;

public
{ Public declarations }
end;




var
Form1: TForm1;

{----------------------------------------------------------------------------}
// Device constants
const
DBT_DEVICEARRIVAL = $00008000;
DBT_DEVICEREMOVECOMPLETE = $00008004;
DBT_DEVTYP_VOLUME = $00000002;

// Device structs
type
_DEV_BROADCAST_HDR = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
end;
DEV_BROADCAST_HDR = _DEV_BROADCAST_HDR;
TDevBroadcastHeader = DEV_BROADCAST_HDR;
PDevBroadcastHeader = ^TDevBroadcastHeader;

type
_DEV_BROADCAST_VOLUME = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
dbcv_unitmask: DWORD;
dbcv_flags: WORD;
end;
DEV_BROADCAST_VOLUME = _DEV_BROADCAST_VOLUME;
TDevBroadcastVolume = DEV_BROADCAST_VOLUME;
PDevBroadcastVolume = ^TDevBroadcastVolume;


implementation



{$R *.dfm}

procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var lpdbhHeader: PDevBroadcastHeader;
lpdbvData: PDevBroadcastVolume;
dwIndex: Integer;
lpszDrive: String;
begin

// Perform inherited
inherited;

// Get the device notification header
lpdbhHeader:=PDevBroadcastHeader(Msg.lParam);

// Handle the message
lpszDrive:='Drive ';
form1.memo1.lines.Add(inttostr(Msg.WParam)+' '+inttostr(Msg.LParam) );

case Msg.WParam of
DBT_DEVICEARRIVAL : {a USB drive was connected}
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
lpdbvData:=PDevBroadcastVolume(Msg.lParam);
for dwIndex :=0 to 25 do
begin
if ((lpdbvData^.dbcv_unitmask shr dwIndex) = 1) then
begin
lpszDrive:=lpszDrive+Chr(65+dwIndex)+':';
break;
end;
end;
Label1.Caption:=lpszDrive + ' connected';
end;
end;
DBT_DEVICEREMOVECOMPLETE: {a USB drive was removed}
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
lpdbvData:=PDevBroadcastVolume(Msg.lParam);
for dwIndex:=0 to 25 do
begin
if ((lpdbvData^.dbcv_unitmask shr dwIndex) = 1) then
begin
lpszDrive:=lpszDrive+Chr(65+dwIndex)+':';
break;
end;
end;
Label1.Caption:=lpszDrive + ' removed';
end;
end;
end;
end;




end


iOCTL این چیه ؟ از کجا اومده تو USES ها؟

BORHAN TEC
دوشنبه 05 بهمن 1388, 18:29 عصر
منظور جناب Joker از ioCTL همان IoUtils است...

BORHAN TEC
دوشنبه 05 بهمن 1388, 18:33 عصر
آيا كتابخانه ويا كامپوننتي وجود داره كه با استفاده از آنها بتوان ويروسهايي رو شناسايي كرد؟ (البته رايگان)

Felony
دوشنبه 05 بهمن 1388, 21:24 عصر
آیا کتابخانه ویا کامپوننتی وجود داره که با استفاده از آنها بتوان ویروسهایی رو شناسایی کرد؟ (البته رایگان)
:لبخند:کامپوننت برای شناسایی ویروس ؟ یهو بگو کامپوننت آنتی ویروس دیگه !

mah_nikoo
سه شنبه 06 بهمن 1388, 13:47 عصر
به نظر من با توجه به اینکه ویروسها هم خودشون برنامه و حتی فایل و یا تاثیری بر فایلهای خاصی دارند میشه از توابع مربوط به فایلها استفاده کرد

Felony
سه شنبه 06 بهمن 1388, 15:16 عصر
به نظر من با توجه به اینکه ویروسها هم خودشون برنامه و حتی فایل و یا تاثیری بر فایلهای خاصی دارند میشه از توابع مربوط به فایلها استفاده کرد

کار با فایل به ویروس چه ربطی داره ؟ ویروس ها انواع مختلفی تقسیم میشن ، حالا دلیل نمیشه چون یکسری از اونها فایل ها رو الوده میکنن همه همین کار رو بکنن، در ضمن ویروس ها اصولا با توابع سطج کرنل رابطه دارن پش باید با دسترسی سطح کرنل به جنگشون رفت !

موفق باشید .

joker
سه شنبه 06 بهمن 1388, 19:18 عصر
...................

BORHAN TEC
چهارشنبه 07 بهمن 1388, 15:43 عصر
جناب Joker در اون برنامه اي كه گفته بوديد من به جاي IoCtl از IoUtils استفاده كردم كه اتفاقاً جواب داد !!!!!

BORHAN TEC
چهارشنبه 07 بهمن 1388, 15:51 عصر
در ضمن ویروس ها اصولا با توابع سطج کرنل رابطه دارن پش باید با دسترسی سطح کرنل به جنگشون رفت !

منظور از توابع سطح كرنل چيه ؟ اگه امكان داره يه كم بيشتر توضيح بدين.

در ضمن درباره حرف دوستمون كه درباره فايل ها صحبت كردند، يادم اومد كه يك نكته را بگم و اون اينه كه سرعت كار با فايل در دلفي به دليل وجود فايلهاي بدون نوع بسيار بالا است(خودم شخصاً اين موضوع را تجربه كرده ام)

BORHAN TEC
یک شنبه 11 بهمن 1388, 15:35 عصر
با كدي كه در قبل قرار داده شده چگونه مي توان جلوي اجراي Autorun را گرفت ؟
اگر امكان دارد توضيح دهيد...

BORHAN TEC
سه شنبه 04 اسفند 1388, 14:15 عصر
كسي دوست نداره جواب بده!!!

Mask
سه شنبه 04 اسفند 1388, 15:19 عصر
با كدي كه در قبل قرار داده شده چگونه مي توان جلوي اجراي Autorun را گرفت ؟
اگر امكان دارد توضيح دهيد...

با سلام
بنده قبلا پیشنهاد همکاری با هاتون را داده بودم.
انگار قابل ندونستید.
در این مورد کافیه شما با شناسایی فایل اتوران بلافاصله اون فایل رو unmount کنید.تا دسترسی بهش قطع بشه.

BORHAN TEC
چهارشنبه 05 اسفند 1388, 20:35 عصر
بنده قبلا پیشنهاد همکاری با هاتون را داده بودم.
انگار قابل ندونستید.
من كه از خدامه، خوب بيا در همين تاپيك به هم ديگه كمك كنيم. به نظرت خوب نيست؟


در این مورد کافیه شما با شناسایی فایل اتوران بلافاصله اون فایل رو unmount کنید.تا دسترسی بهش قطع بشه.
ميشه كمي بيشتر توضيح بدين يا يك نمونه كد بزارين!!!

Naruto
جمعه 07 اسفند 1388, 01:08 صبح
سلام.
پیدا کردن یه فایل با نام ونشان مشخص و در مسیری مشخص که نمیشه آنتی ویروس.
ابتدا باید با ساختار فایلها و بخصوص فایلهای اجرایی آشنا باشید و بتونید قسمتهای مختلف یک فایل رو از جهت آلودگی تحلیل کنید.
در این جور مواقع بروز اشتباه در تشخیص یا همون False Positive خیلی اتفاق میفته.
یادمه یکی دو تا تاپیک در این زمینه داشتیم.کمی جستجو کنید.



منظور از توابع سطح كرنل چيه ؟ اگه امكان داره يه كم بيشتر توضيح بدين.


یک بخشش اینه که ممکنه یک ویروس از مجوزهای سطح بالا وسیستمی استفاده کنه.
آنتی ویروس شما هم باید چنین مجوزهایی را برای مقابله داشته باشه.
مثلا ویروسهایی که به ظاهر اسم svchost.exe دارند به سادگی کنار نمیرن.
موفق باشید.

BORHAN TEC
جمعه 07 اسفند 1388, 10:09 صبح
پیدا کردن یه فایل با نام ونشان مشخص و در مسیری مشخص که نمیشه آنتی ویروس.
بله آنتي ويروس نميشه ولي ميتونه قسمتي از اون باشه به عنوان مثال اگر در ريشه يك درايو فلش مموري يك فايل Autorun.inf درست كنيم آنتي ويروس nod32 آن را به عنوان يك ويروس در نظر مي گيرد.