Delphi:网络监控.doc_第1页
Delphi:网络监控.doc_第2页
Delphi:网络监控.doc_第3页
Delphi:网络监控.doc_第4页
Delphi:网络监控.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

delphi:网络监控客户端:用的是nmudp控件unit unit1;interfaceuses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, nmudp,registry;type tclient = class(tform) cudp: tnmudp; procedure formcreate(sender: tobject); procedure formdestroy(sender: tobject); procedure cudpdatareceived(sender: tcomponent; numberbytes: integer; fromip: string; port: integer); private/ procedure add; private declarations public public declarations end;var client: tclient;implementation$r *.dfmconst bufsize=2048; 发送每一笔数据的缓冲区大小 var bmpstream:tmemorystream; leftsize:longint; 发送每一笔数据后剩余的字节数 function registerserviceprocess (dwprocessid, dwtype: dword) : dword;stdcall; external kernel32.dll;procedure screencap(leftpos,toppos,rightpos,bottompos:integer); var rectwidth,rectheight:integer; sourcedc,destdc,bhandle:integer; bitmap:tbitmap; begin rectwidth:=rightpos-leftpos; rectheight:=bottompos-toppos; sourcedc:=createdc(display,nil); destdc:=createcompatibledc(sourcedc); bhandle:=createcompatiblebitmap(sourcedc, rectwidth,rectheight); selectobject(destdc,bhandle); bitblt(destdc,0,0,rectwidth,rectheight,sourcedc, leftpos,toppos,srccopy); bitmap:=tbitmap.create; bitmap.handle:=bhandle; bitmap.savetostream(bmpstream); bmpstream.position:=0; leftsize:=bmpstream.size; bitmap.free; deletedc(destdc); releasedc(bhandle,sourcedc); end; procedure add;/写入注册表自动运行var reg:tregistry;begin reg:=tregistry.create; try reg.rootkey:=hkey_current_user; if reg.openkey(softwaremicrosoftwindowscurrentversionrun,true) then reg.writestring(myapp,” + paramstr(0) + ”); finally reg.closekey; reg.free;end;end;procedure tclient.formcreate(sender: tobject);beginbmpstream:=tmemorystream.create;registerserviceprocess(getcurrentprocessid,1);/在任务栏隐藏add;end;procedure tclient.formdestroy(sender: tobject);beginbmpstream.free; end;procedure tclient.cudpdatareceived(sender: tcomponent; numberbytes: integer; fromip: string; port: integer);var ctrlcode:array0.29 of char; buf:array0.bufsize-1 of char; tmpstr:string; sendsize,leftpos,toppos,rightpos,bottompos:integer; begin cudp.readbuffer(ctrlcode,numberbytes); 读取控制码 if ctrlcode0+ctrlcode1+ctrlcode2+ctrlcode3=shut then exitwindowsex(ewx_shutdown,0); if ctrlcode0+ctrlcode1+ctrlcode2+ctrlcode3=rset then exitwindowsex(ewx_reboot,0); if ctrlcode0+ctrlcode1+ctrlcode2+ctrlcode3=lack then enablewindow(getdesktopwindow,false); if ctrlcode0+ctrlcode1+ctrlcode2+ctrlcode3=unlo then enablewindow(getdesktopwindow,true); if ctrlcode0+ctrlcode1+ctrlcode2+ctrlcode3=show then begin 控制码前4位为”show”表示主控机发出了抓屏指令 if bmpstream.size=0 then 没有数据可发,必须截屏生成数据 begin tmpstr:=strpas(ctrlcode); tmpstr:=copy(tmpstr,5,length(tmpstr)-4); leftpos:=strtoint(copy(tmpstr,1,pos(:,tmpstr)-1); tmpstr:=copy(tmpstr,pos(:,tmpstr)+1,length(tmpstr) -pos(:,tmpstr); toppos:=strtoint(copy(tmpstr,1,pos(:,tmpstr)-1); tmpstr:=copy(tmpstr,pos(:,tmpstr)+1,length(tmpstr)- pos(:,tmpstr); rightpos:=strtoint(copy(tmpstr,1,pos(:,tmpstr)-1); bottompos:=strtoint(copy(tmpstr,pos(:,tmpstr )+1,length(tmpstr)-pos(:,tmpstr); screencap(leftpos,toppos,rightpos,bottompos); 截取屏幕 end; if leftsizebufsize then sendsize:=bufsize else sendsize:=leftsize; bmpstream.readbuffer(buf,sendsize); leftsize:=leftsize-sendsize; if leftsize=0 then bmpstream.clear; 清空流 cudp.remotehost:=fromip; fromip为主控机ip地址 cudp.sendbuffer(buf,sendsize); 将数据发到主控机的2222口 end; end;end.服务器端unit unit1;interfaceuses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls, extctrls,shellapi, nmudp; const wmicb=wmuser+1000;type tserver = class(tform) sudp: tnmudp; panel1: tpanel; image1: timage; scrollbar1: tscrollbar; scrollbar2: tscrollbar; panel2: tpanel; button1: tbutton; button2: tbutton; checkbox1: tcheckbox; checkbox2: tcheckbox; checkbox3: tcheckbox; checkbox4: tcheckbox; checkbox5: tcheckbox; edit1: tedit; edit2: tedit; label1: tlabel; label2: tlabel; panel3: tpanel; procedure formcreate(sender: tobject); procedure button1click(sender: tobject); procedure sudpdatareceived(sender: tcomponent; numberbytes: integer; fromip: string; port: integer); procedure button2click(sender: tobject); procedure formdestroy(sender: tobject); procedure scrollbar1change(sender: tobject); procedure scrollbar2change(sender: tobject); procedure scrollbar1scroll(sender: tobject; scrollcode: tscrollcode; var scrollpos: integer); procedure checkbox1click(sender: tobject); procedure checkbox2click(sender: tobject); procedure checkbox4click(sender: tobject); procedure checkbox3click(sender: tobject); procedure checkbox5click(sender: tobject); private units: tpoint; myicon:tnotifyicondata; procedure wmicb(var msg:tmessage);message wm_icb; procedure scrollreset; private declarations public public declarations end;var server: tserver;implementation$r *.dfmconst bufsize=2048; def_scroll_units=8; var rsltstream,tmpstream:tmemorystream; procedure display;beginserver.visible:=not server.visible;application.showmainform:=server.visible;setforegroundwindow(application.handle);end; procedure tserver.formcreate(sender: tobject);beginrsltstream:=tmemorystream.create;tmpstream:=tmemorystream.create;myicon.cbsize:=sizeof(tnotifyicondata);myicon.wnd:=handle;myicon.uid:=1;myicon.uflags:=nif_message or nif_tip or nif_icon;myicon.ucallbackmessage:=wm_icb;myicon.hicon:=application.icon.handle;myicon.sztip:=黄金眼 v1.0;shell_notifyicon(nim_add,myicon);setwindowlong(application.handle,gwl_exstyle,ws_ex_toolwindow );end;procedure tserver.button1click(sender: tobject);var reqcode:array0.29 of char;reqcodestr:string; beginif checkbox1.checked then begin reqcodestr:=show+edit1.text; strpcopy(reqcode,reqcodestr); tmpstream.clear; rsltstream.clear; sudp.remotehost:=edit2.text; sudp.sendbuffer(reqcode,30); endelse if checkbox2.checked then begin reqcodestr:=shut; strpcopy(reqcode,reqcodestr); tmpstream.clear; rsltstream.clear; sudp.remotehost:=edit2.text; sudp.sendbuffer(reqcode,30); endelse if checkbox3.checked then begin reqcodestr:=rset; strpcopy(reqcode,reqcodestr); tmpstream.clear; rsltstream.clear; sudp.remotehost:=edit2.text; sudp.sendbuffer(reqcode,30); endelse if checkbox4.checked then begin reqcodestr:=lack; strpcopy(reqcode,reqcodestr); tmpstream.clear; rsltstream.clear; sudp.remotehost:=edit2.text; sudp.sendbuffer(reqcode,30); endelse if checkbox5.checked then begin reqcodestr:=unlo ; strpcopy(reqcode,reqcodestr); tmpstream.clear; rsltstream.clear; sudp.remotehost:=edit2.text; sudp.sendbuffer(reqcode,30); endend;procedure tserver.sudpdatareceived(sender: tcomponent; numberbytes: integer; fromip: string; port: integer);var reqcode:array0.29 of char;reqcodestr:string; begin reqcodestr:=show+edit1.text; strpcopy(reqcode,reqcodestr); sudp.readstream(tmpstream); rsltstream.copyfrom(tmpstream,numberbytes); if numberbytes bufsize then 数据已读完 begin rsltstream.position:=0; scrollreset; image1.picture.bitmap.loadfromstream(rsltstream); tmpstream.clear; rsltstream.clear; end else begin tmpstream.clear; reqcode:=show; sudp.remotehost:=edit2.text; sudp.sendbuffer(reqcode,30); end; end;procedure tserver.button2click(sender: tobject);beginclose();end;procedure tserver.wmicb(var msg:tmessage);var tcwz:tpoint;begincase msg.lparam ofwm_lbuttonup:display;wm_rbuttonup:begingetcursorpos(tcwz);end;end;end;procedure tserver.formdestroy(sender: tobject);beginshell_notifyicon(nim_delete,myicon);end;procedure tserver.scrollbar1change(sender: tobject);beginimage1.left := -units.y * scrollbar1.position;end;procedure tserver.scrollbar2change(sender: tobject);beginimage1.top := -units.y* scrollbar2.positionend;procedure tserver.scrollreset;beginunits.x := def_scroll_units;units.y := def_scroll_units;if image1.picture nil thenbeginimage1.top := 0;image1.left := 0;scrollbar2.position := 0;scrollbar1.position := 0;scrollbar2.min := 0;scrollbar1.min := 0;scrollbar2.visible := true;scrollbar1.visible := true;end;end;procedure tserver.scrollbar1scroll(sender: tobject; scrollcode: tscrollcode; var scrollpos: integer);beginimage1.left :=-units.x*scrollposend;procedure tserver.checkbox1click(sender: tobject);beginpanel3.caption :=截取客户机屏幕;end;procedure tserver.checkbox2click(sender: tobject);beginpanel3.caption :=远程关闭客户机;end;procedure tserver.checkbox4click(sender: tobject);beginpanel3.caption := 远程锁定客户机;end;procedure tserver.checkbox3click(sender: tobject);beginpanel3.caption :=远程重起客户机;end;procedure tserver.checkbox5click(sender: tobject);beginpanel3.caption :=远程解锁客户机;end;end.出处:程序员之家/张宾日期:2005-02-03资源名称利用delphi实现网络监控系统作者:网络爱好者适用语言:java .net c+ builder 文件大小14708运行平台:windows 2000 windows xp windows 9*/me 上传者:丁鹏上传日期:2004-04-14 19:21:39 点击:2807简介利用delphi实现网络监控系统摘要 本文详细阐述了如何用delphi开发网络实时监控系统,该系统可使网络管理员随时监控到网络中任何一台计算机的操作状态,若该机有违规行为,可通过本系统采取措施禁止其操作,还实现了程序的隐藏、托盘图标、加入注册表自动启动项等技术。关键词 网络 winsocket tcp/ip 控件一、问题提出现在拥有校园网和网络教室的学校越来越多,网络管理和控制成了问题,当然有许多软件可以实现,但那是要钱的,并且不便宜,至少是买一台电脑的钱,而且许多功能教育界用不到。有意思的是:许多黑客软件可以完成网络监控任务,如:冰河,并且不要钱,但不幸的是:用了黑客程序你不就不能上因特网了。所以,自己动手设计网络监控系统是一个不错的选择,因为现在有了许多功能强大的可视化开发工具。我用delphi完成了一个监控系统(大眼睛),经过实验,效果不错,并且完成了托盘图标、驻留端程序隐藏、修改注册表使程序自动启动等技术。系统的两个可执行文件经过pecompact处理,只有150k大小,也无需什么动态连接库。下图是软件运行效果图,下面就把设计思路介绍给您。二、实现的原理winsock是一组api,用于在internet上传输数据和交换信息。用它编程本来是很麻烦的,但在delphhi中并不需要直接与winsock的api打交道,因为tclientsocket和tserversocket元件封装了它的大部分api,使得对winsock的访问大大简化。socket是网络通信的基本构件,是可以被命名和寻址的通信端点,使用中的第一个socket都有其类型和一个与之相连的进程。socket存在于通信区域中,通信区域也叫地址族,是一个抽象概念,主要用于将通过socket通信线程的共有特性综合在一起。socket通常只与同一区域中的socket交换数据,也有可能跨区域通信,但这只是在执行了某种转换进程后才能实现。要通过网络传输数据,至少需要一对socket。其中,一个socket在客户端,另一个socket在服务器端。一旦客户端和服务器端都接通了socket,它们之间就可以相互通信,其连接是建立在tcp/ip协议基础上的,同时也支持其他相关协议,如xns、decnet及ipx/spx等。本系统就是基于上述原理的,它由两部分组成:驻留端和控制端。驻留端放在需要监控的机器上,windows启动时自动运行,并且要很好的隐藏起来:不出现的任务栏上,当用户按下ctrl+alt+del时,也不能从任务列表中发现。控制端放在管理员的机器上,管理员通过指令可以观察或控制被监控的机器。指令有五个:截取屏幕:可以观察到被控机的当前屏幕,看操作员在干什么。远程关机:可以关闭被控的计算机。远程重启:可以重新启动被控的计算机。锁定机器:封锁被控机的操作,键盘、鼠标操作都无效。机器解锁:解除对被控机的封锁。三、代码编写1、 控制端主窗体设计如效果图,各控件名称如下表:名称 控件类型 标题 用途hscrollb tscrollbar; 滚动图像vscrollb tscrollbar 滚动图像label1 tlabel 显示文字ipbox tcombobox 显示ip地址列表radiogroup1 tradiogroup 美化界面cuts tradiobutton 截屏选择cloma tradiobutton 关机选择restart tradiobutton 启动选择lock tradiobutton 锁定选择unlock tradiobutton 解锁选择button1 tbutton 添加ip地址button2 tbutton 执行指令button3 tbutton 关闭界面button4 tbutton 连接监控端impanel tpanel 美化界面image timage 显示图像panel1 tpanel 显示状态kz tclientsocket 建立连接tccd tpopupmenu 弹出菜单控制端代码不太复杂,主要在为了显示从被监控机器传过来的数据时有点复杂,下面单独说明一下:procedure tform1.kzread(sender: tobject; socket: tcustomwinsocket);var buf:array0.buffer-1 of char;/定义一个缓冲区,大小为2048字节temp:integer;begintemp:=socket.receivelength;/得到传来数据的长度panel1.caption:=正在接收来自+ipbox.text+的图像数据,稍侯;bmpmap.writebuffer(buf,socket.receivebuf(buf,temp);把缓冲区的数据写入流if tempbuffer then/如果数据长度小于缓冲区,说明数据已传完,显示图像beginbmpmap.position:=0;scrollreset;image.picture.bitmap.loadfromstream(bmpmap);bmpmap.clear;panel1.caption:=图像已经成功的接收!;endelse socket.sendtext(cut);/否则继续要求传输end;在显示图像时,是通过滚动条和图像控件组合使用的,请注意代码当然,为了让软件更专业,要有托盘图标,这使代码复杂一些,这些功能在本系统中都实现了,请留意源代码。下面给出该系统的源代码:(代码容易看明白,不详细解释了)unit unit1;interfaceuseswindows, messages, sysutils, classes, graphics, controls, forms,stdctrls, extctrls, comctrls, scktcomp,shellapi, menus;const wm_icb=wm_user+1000;typetform1 = class(tform)hscrollb: tscrollbar;vscrollb: tscrollbar;label1: tlabel;ipbox: tcombobox;radiogroup1: tradiogroup;cuts: tradiobutton;cloma: tradiobutton;restart: tradiobutton;lock: tradiobutton;unlock: tradiobutton;button1: tbutton;button2: tbutton;button3: tbutton;impanel: tpanel;image: timage;panel1: tpanel;kz: tclientsocket;button4: tbutton;tccd: tpopupmenu;n1: tmenuitem;n2: tmenuitem;n3: tmenuitem;n4: tmenuitem;n5: tmenuitem;procedure button2click(sender: tobject);procedure button3click(sender: tobject);procedure vscrollbchange(sender: tobject);procedure hscrollbscroll(sender: tobject; scrollcode: tscrollcode;var scrollpos: integer);procedure button1click(sender: tobject);procedure formcreate(sender: tobject);procedure formdestroy(sender: tobject);procedure button4click(sender: tobject);procedure kzread(sender: tobject; socket: tcustomwinsocket);procedure kzdisconnect(sender: tobject; socket: tcustomwinsocket);procedure kzconnect(sender: tobject; socket: tcustomwinsocket);procedure cutsclick(sender: tobject);procedure clomaclick(sender: tobject);procedure restartclick(sender: tobject);procedure lockclick(sender: tobject);procedure unlockclick(sender: tobject);procedure kzconnecting(sender: tobject; socket: tcustomwinsocket);procedure kzerror(sender: tobject; socket: tcustomwinsocket;errorevent: terrorevent; var errorcode: integer);procedure ipboxchange(sender: tobject);procedure n3click(sender: tobject);procedure n2click(sender: tobject);procedure n1click(sender: tobject);privateunits: tpoint;myicon:tnotifyicondata;procedure wmicb(var msg:tmessage);message wm_icb;procedure scrollreset; private declarations public public declarations end;varform1: tform1;implementationuses unit2, unit3;$r *.dfmconstdef_scroll_units = 8;buffer=2048;var bmpmap:tmemorystream;procedure display;beginif form1.visible=true thenform1.n1.caption:=显示(&d)elseform1.n1.caption:=隐藏(&h);form1.visible:=not form1.visible;application.showmainform:=form1.visible;setforegroundwindow(application.handle);end;procedure tform1.button2click(sender: tobject);begindisplay;end;procedure tform1.button3click(sender: tobject);beginif not assigned(form2) then form2:=tform2.create(application);form2.show;end;procedure tform1.vscrollbchange(sender: tobject);beginimage.top := -units.y * vscrollb.position;end;procedure tform1.hscrollbscroll(sender: tobject; scrollcode: tscrollcode;var scrollpos: integer);beginimage.left := -units.x * scrollposend;procedure tform1.scrollreset;beginunits.x := def_scroll_units;units.y := def_scroll_units;if image.picture nil thenbeginimage.top := 0;image.left := 0;hscrollb.position := 0;vscrollb.position := 0;hscrollb.min := 0;vscrollb.min := 0;hscrollb.visible := true;vscrollb.visible := true;end;end;procedure tform1.button1click(sender: tobject);beginif cuts.checked thenbeginpanel1.caption:=截取+ipbox.text+计算机的屏幕!;bmpmap.clear;kz.socket.sendtext(cut);endelse if cloma.checked thenbeginpanel1.caption:=关闭+ipbox.text+的计算机!;kz.socket.sendtext(ygj);kz.active:=false;endelse if restart.checked thenbeginpanel1.caption:=重新启动+ipbox.text+的计算机!;kz.socket.sendtext(yqd);kz.active:=false;endelse if lock.checked thenbeginpanel1.caption:=锁定+ipbox.text+的计算机!;kz.socket.sendtext(sdj);endelse if unlock.checked thenbeginpanel1.caption:=解锁+ipbox.text+的计算机!;kz.socket.sendtext(jsj);endend;procedure tform1.formcreate(sender: tobject);beginmyicon.cbsize:=sizeof(tnotifyicondata);myicon.wnd:=handle;myicon.uid:=1;myicon.uflags:=nif_message or nif_tip or nif_icon;myicon.ucallbackmessage:=wm_icb;myicon.hicon:=application.icon.handle;myicon.sztip:=大眼睛 v1.0;shell_notifyicon(nim_add,myicon);setwindowlong(application.handle,gwl_exstyle,ws_ex_toolwindow);bmpmap:=tmemorystream.create;ipbox.items.loadfromfile(pzwj.ini);end;procedure tform1.formdestroy(sender: tobject);beginbmpmap.free;shell_notifyicon(nim_delete,myicon);end;procedure tform1.button4click(sender: tobject);beginif ipbox.text= then exit;if button4.caption=连接(&c) thenbeginkz.address:=ipbox.text;kz.active:=true;button1.enabled:=true;endelsebeginkz.active:=false;button1.enabled:=false;end;end;procedure tform1.kzread(sender: tobject; socket: tcustomwinsocket);var buf:array0.buffer-1 of char;temp:integer;begintemp:=socket.receivelength;panel1.caption:=正在接收来自+ipbox.text+的图像数据,稍侯;bmpmap.writebuffer(buf,socket.receivebuf(buf,temp);if tempbuffer thenbeginbmpmap.position:=0;scrollreset;image.picture.bitmap.loadfromstream(bmpmap);bmpmap.clear;panel1.caption:=图像已经成功的接收!;endelse socket.sendtext(cut);end;procedure tform1.kzdisconnect(sender: tobject; socket: tcustomwinsocket);beginbutton4.caption:=连接(&c);panel1.caption:=已经和+ipbox.text+断开连接;end;procedure tform1.kzconnect(sender: tobject; socket: tcustomwinsocket);beginbutton4.caption:=断开(&d);panel1.caption:=已经成功的连接到+ipbox.text;end;procedure tform1.cutsclick(sender: tobject);beginpanel1.caption:=截取远程计算机的屏幕;end;procedure tform1.clomaclick(sender: tobject);beginpanel1.captio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论