⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netconnection.pas

📁 VC++编写的类似Sniffer的网络数据包监听程序
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TIConnection.open : Integer;
var
    FNetResource:TNetResourceA;
    str:string;
    res:Dword;
begin
    if pos('\\',FAddress)=1 then str:=FAddress+'\'+fsharename
    else str:='\\'+FAddress+'\'+fsharename;

    FNetResource.dwType:=RESOURCETYPE_ANY;
    FNetResource.lpLocalName:='';
    FNetResource.lpProvider:='';    FNetResource.lpRemoteName:=pchar(str);    res:=my_WNetAddConnection2(@FNetResource,pchar(fpassword),pchar(fusername),0);

    list.clear;
    list.add(FAddress);

   if autodo then//若自动则不响应事件
     begin
      if (res=0) then
        ShareEnum
      else
      if Assigned(FOnEchoClose) then
           FOnEchoClose(Self, res);
     end else
      if Assigned(FOnEchoOpen) then
          FOnEchoOpen(Self, res);

end;

function TIConnection.ShareEnum : Integer;
var
   cbBuffer,EntriesRead, TotalAvail: longint;
   hEnum:HWND;
   res:NET_API_STATUS;
   p:PSHARE_INFO1_NT;
   IP_str:string;
   ServerName:pwchar;
   i:integer;
begin
    if list.count>1 then
      begin
       list.clear;
       list.add(FAddress);
      end;
    if (pos('\\',FAddress)=1) then
      IP_str:=FAddress
     else
      IP_str:='\\'+FAddress;

     ServerName:=StringToOleStr(IP_str);

     cbBuffer:=   $0ffffff; hEnum:=0;

   res:=NetShareEnum_NT(ServerName,1,p,cbBuffer,EntriesRead,TotalAvail,hEnum);

   if (res=0) or (res=234) then
    if EntriesRead>0 then
      for i:=0 to EntriesRead-1 do
       begin
        list.add(string(p^.netname)+'   '+string(p^.remark));
        inc(p);
       end;

   if autodo then
     begin
      if ((res=0) or (res=234)) then//若自动则不响应事件
        begin
         if Assigned(FOnEchoShareEnum) then
           FOnEchoShareEnum(Self, res);
          close;
        end else
       if Assigned(FOnEchoClose) then
            FOnEchoClose(Self, res);
     end else
   if Assigned(FOnEchoShareEnum) then
          FOnEchoShareEnum(Self, res);
end;

function TIConnection.close : Integer;
var
   str:string;
begin
    if pos('\\',FAddress)=1 then str:=FAddress+'\'+fsharename
    else str:='\\'+FAddress+'\'+fsharename;

   if Assigned(FOnOpenSucceed) then //响应外部的查找用户事件
            FOnOpenSucceed(Self);

    Result:=my_WNetCancelConnection2(pchar(str),0,true);

  if FGetInfo then getserverinfo;//获取机器版本的信息

    if Assigned(FOnEchoClose) then
        FOnEchoClose(Self, Result);
end;

function usri1_flags(flags:DWORD):string;//返回说明
begin
  result:='';
//  if (flags and 1)=1 then result:='需要密码';
  if (flags and 2)=2 then result:=result+'已停用,';
  if (flags and $20)=$20 then result:=result+'空密码';
{  if (flags and 8)=8 then result:=result+'The home directory is required. Windows NT ignores this value';

//  if (flags and $40)=   $40 then result:=result+'该用户不能更改密码';
//  if (flags and $20)=   $20 then result:=result+'The Account is Locked';//  if (flags and $80)=   $80 then result:=result+'Password does not 期满'; }  if result='' then result:='信息标记:'+inttostr(flags);end;
//经验:若要返回的数可以用,要注意是否为var类 如下的 dwRec变量,要在定义中设为var
//否则API函数返回后不可以用
//谝函数一定要在CLose连接后才有用
function TIConnection.NetQueryDisplayInformation(Level:integer;var var_list:Tstringlist):integer;
var
   p:PNET_DISPLAY_USER;
   res, i:DWORD;
   dwRec:longint;
   IP_str:string;
   ServerName:pwchar;
   count:integer;
begin
     var_list.clear;
     var_list.add(FAddress);
    if (pos('\\',FAddress)=1) then
      IP_str:=FAddress
     else
      IP_str:='\\'+FAddress;

    ServerName:=StringToOleStr(IP_str);
    i:=0;
    res :=my_NetQueryDisplayInformation(ServerName, Level, i, 8000,8000,dwRec,@p);
    if((res=0) or (res=234)) then
     begin
      if dwRec>0 then
      begin
        for count:=0 to dwRec-1 do
          begin
            var_list.add(inttostr(count+1)+'->['+string(p^.name)+']  '+usri1_flags(p^.flags)+'  描述:'+string(p^.comment)+'  ID:'+inttostr(p^.user_id));
            inc(p);
          end;
      end;
     end;
end;

function TIConnection.get_user(Level:integer;var var_list:Tstringlist):integer;
var
   FNetResource:TNetResourceA;
   p:PNET_DISPLAY_USER;
   res, i:DWORD;
   dwRec:longint;
   IP_str:string;
   ServerName:pwchar;
   count:integer;
begin
     var_list.clear;

    if (pos('\\',FAddress)=1) then
      IP_str:=FAddress
     else
      IP_str:='\\'+FAddress;

    ServerName:=StringToOleStr(IP_str);
//连接主机
    ip_str:=ip_str+'\ipc$';
    FNetResource.dwType:=RESOURCETYPE_ANY;
    FNetResource.lpLocalName:='';
    FNetResource.lpProvider:='';    FNetResource.lpRemoteName:=pchar(IP_str);    res:=my_WNetAddConnection2(@FNetResource,'','',0);
    if (res<>0) and (res<>1219) then exit; //0代表成功,1219代表凭据冲突,即先前已有连接还未断开
//找用户
    i:=0;
    res :=my_NetQueryDisplayInformation(ServerName, Level, i, 8000,8000,dwRec,@p);
    if((res=0) or (res=234)) then
     begin
      if dwRec>0 then
      begin
        for count:=0 to dwRec-1 do
          begin
             if (p^.flags and 2)<>2 then//只有不停用的用户才要
               var_list.add(string(p^.name));
            inc(p);
          end;
      end;
     end;

   Result:=my_WNetCancelConnection2(pchar(ip_str),0,true);//关闭连接
end;

function TIConnection.my_EnumServices(var var_list:Tstringlist):integer;
var
  BytesNeeded,serviceReturned,resumeHandle:Dword;
  returnflag:Bool;
  lpservice:Array of TEnumServiceStatus;
  service:TEnumServiceStatus;
  i,bytes:Dword;
  hscmanager:SC_HANDLE;
  str:string;
begin
    if pos('\\',FAddress)=1 then str:=FAddress
    else str:='\\'+FAddress;

  var_list.Clear;
  var_list.add(FAddress);
  returnflag:=false;
  resumeHandle:=0;
  BytesNeeded:=0;
  hscmanager:=OpenSCManager(pchar(str),0,SC_MANAGER_ALL_ACCESS);//打开service control manager database
  if hscmanager =0 then
   Begin
//   var_list.add('无法打开service control manager database');
   exit;
   End;
  returnflag:=EnumServicesStatus(hscmanager,
                    SERVICE_WIN32 or SERVICE_DRIVER,
                    SERVICE_ACTIVE or SERVICE_INACTIVE,
                    service,
                    0,
                    BytesNeeded,
                    serviceReturned,
                    resumeHandle);
//枚举Service
  if (returnflag=false) and (GetLastError()=ERROR_MORE_DATA) then
   begin
      resumeHandle:=0;
      bytes:=BytesNeeded + sizeof(TEnumServiceStatus);
      SetLength(lpservice,bytes div sizeof(TEnumServiceStatus)+1); // 一定要设好大小,否则出错
     returnflag:=EnumServicesStatus(hscmanager,
                            SERVICE_WIN32 or SERVICE_DRIVER,
                            SERVICE_ACTIVE or SERVICE_INACTIVE,
                            lpservice[0],
                            bytes,
                            BytesNeeded,
                            serviceReturned,
                            resumeHandle);
     for i := 0 to serviceReturned-1 do
      begin
       if lpservice[i].ServiceStatus.dwCurrentState = SERVICE_STOPPED then
        var_list.Add(inttostr(i+1)+'->['+lpservice[i].lpServiceName+']  '+lpservice[i].lpDisplayName+'  :停止') else
       if lpservice[i].ServiceStatus.dwCurrentState = SERVICE_RUNNING then
         var_list.Add(inttostr(i+1)+'->['+lpservice[i].lpServiceName+']  '+lpservice[i].lpDisplayName+'  :运行') else
         var_list.Add(inttostr(i+1)+'->['+lpservice[i].lpServiceName+']  '+lpservice[i].lpDisplayName+'  :暂停');
      end;
   end;
  CloseServiceHandle(hscmanager);//关闭service control manager database

end;

end.
{procedure TForm1.Button2Click(Sender:TObject);
var
i:integer;
hService:SC_HANDLE;
lpServiceArgVectors:Pchar;
  returnstatus:TServiceStatus;
begin
lpServiceArgVectors:=nil;
for i := 0 to (ListBox1.Items.Count-1) do
if ListBox1.Selected[i] then
begin
hService:=OpenService(hscmanager,

                      Pchar(ListBox1.Items[i]),

                      SERVICE_ALL_ACCESS);
//打开该Service
if hService < 0 then
begin
showmessage('无法打开该Service');
exit;
end;
QueryServiceStatus(hService,returnstatus);
//查看该Service的状态
if returnstatus.dwCurrentState = SERVICE_STOPPED then

//如果该Service已停止则启动它
StartService(hService,0,lpServiceArgVectors);
CloseServiceHandle(hService);//关闭该Service
end;
end;


procedure TForm1.Button3Click(Sender:TObject);
var
i:integer;
begin
for i := 0 to (ListBox1.Items.Count-1) do
if ListBox1.Selected[i] then
begin
hService:=OpenService(hscmanager,

                    Pchar (ListBox1.Items[i]),

                    SERVICE_ALL_ACCESS);
//打开该Service
if hService < 0 then
begin
showmessage('无法打开该Service');
exit;
end;
QueryServiceStatus(hService,returnstatus);
//查看该Service的状态
if returnstatus.dwCurrentState = SERVICE_RUNNING then
//如果该Service正在运行则停止它
ControlService(hService,

                SERVICE_CONTROL_STOP,

                returnstatus);
CloseServiceHandle(hService);//关闭该Service
end;
end;

procedure TForm1.FormClose(Sender:TObject;varAction:TCloseAction);
begin
CloseServiceHandle(hscmanager);//关闭service control manager database
End;
end.
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -