
    [
#gW                     (   d dl Z d dlZd dlZd dlmZmZmZmZmZ d dl	m
Z
mZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ  ej>                  e       Z! G d dejD                  jF                  ejH                        Z%y)    N)IterableListOptionalTupleType)	constants
exceptions
interfaces	rendererssymbols)requirements)format_hints)intermed)versions)network)	timeliner)infopoolscannerverinfoc                      e Zd ZdZdZdZed        Zede	j                  j                  dedeej                     fd       Zede	j                  j                  d	ed
edeeef   fd       Zede	j                  j                  d	ed
ededef
d       Zede	j                  j                  d	ed
ededee	j,                  j.                     f
d       Zddee   fdZd Zd Zy)NetScanzGScans for network objects present in a particular windows memory image.)   r   r      r   r   c           
      F   t        j                  ddddg      t        j                  dt        j                  d      t        j                  d	t
        j                  d      t        j                  d
t        j                  d      t        j                  dddd      gS )NkernelzWindows kernelIntel32Intel64)namedescriptionarchitecturesr   r   )r   	componentversionr   r   include-corruptzRadically eases result validation. This will show partially overwritten data. WARNING: the results are likely to include garbage and/or corrupt data. Be cautious!FT)r   r    defaultoptional)
r   ModuleRequirementVersionRequirementr   PoolScannerr   Infor   VerInfoBooleanRequirement)clss    _/home/panchajanya/Development/work/volatility3/volatility3/framework/plugins/windows/netscan.pyget_requirementszNetScan.get_requirements   s     **,()4
 ++"k.E.Ey ++tyy) ++'//9 ++& A	
 	
    contextsymbol_tablereturnc           	         | j                   j                  |t        j                  z   dz         j                  }| j                   j                  |t        j                  z   dz         j                  }| j                   j                  |t        j                  z   dz         j                  }t        j                  d|t        j                  z   dz   |dft
        j                  j                  t
        j                  j                  z        t        j                  d|t        j                  z   dz   |dft
        j                  j                  t
        j                  j                  z        t        j                  d|t        j                  z   dz   |dft
        j                  j                  t
        j                  j                  z        gS )	aV  Creates a list of Pool Tag Constraints for network objects.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            symbol_table: The name of an existing symbol table containing the symbols / types

        Returns:
            The list containing the built constraints.
        _TCP_LISTENER_TCP_ENDPOINT_UDP_ENDPOINTs   TcpLN)	type_namesize	page_types   TcpEs   UdpA)
symbol_spaceget_typer   BANGr9   r   PoolConstraintPoolTypeNONPAGEDFREE)r1   r2   	tcpl_size	tcpe_size	udpa_sizes        r.   create_netscan_constraintsz"NetScan.create_netscan_constraints5   s    ((119>>)O;

$ 	 ((119>>)O;

$ 	 ((119>>)O;

$ 	 &&&7/I&%..77+:N:N:S:SS	 &&&7/I&%..77+:N:N:S:SS	 &&&7/I&%..77+:N:N:S:SS	!
 	
r0   
layer_nament_symbol_tablec           
      p   t        j                  ||      }t        j                  ||      }|rd}nd}t        j
                  j                  |||      }t        j
                  j                  |||      }	 t        |j                        }	t        |j                        }
t        |j                        }t         j#                  dj%                  |j                  |j                  |j&                  |j                               |
dk(  r|dk(  rt(        j*                  }nt(        j,                  }|dk(  r:i dd	d
d	dd	dd	ddddddddddddddddddddddd dd!dd"di}n<i dd#d
d$dd$dd$dd%dd%dd%dd&dd'd(d)dd*dd*dd*dd+dd,dd-d d.d/d0d1d2d3}d4}|	d5k(  r|rt         j#                  d6       d7}	|D cg c]  \  }}}}|||f|
||	fk(  r|d4k7  r||||f c}}}}rt         j#                  d8       |j.                  |   j0                  j3                  d9d:      }|rct4        j6                  j9                  ||d;      }|r*|d<   }t         j#                  d=j%                  |             n+t         j#                  d>       nt         j#                  d?       |j3                  |
||	|f      }|s|D cg c]  \  }}}}||
k(  r||k(  r||k  r||||f }}}}}|j;                          |r/|d@   }|j3                  |      }t         j#                  dA|        n't        dBj%                  |
||j&                  |	            t         j#                  dC|        ||fS # t        $ r t        d       t        j                  d      xY wc c}}}}w c c}}}}w )Da  Tries to determine which symbol filename to use for the image's tcpip driver. The logic is partially taken from the info plugin.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            layer_name: The name of the layer on which to operate
            nt_symbol_table: The name of the table containing the kernel symbols

        Returns:
            The filename of the symbol table to use.
        )r1   r2   x64x86z4Kernel Debug Structure version format not supported!z\Kernel Debug Structure missing VERSION/KUSER structure, unable to determine Windows version!z"Determined OS Version: {}.{} {}.{}
   )   r   ip  r   znetscan-vista-x86)rL   r   iq  r   )rL   r   ir  r   )rL   r   is  r   )rL   r   i  r   znetscan-win7-x86)rL   r   i  r   )rL   r   i   r   )rL   r   i#  r   znetscan-win8-x86)rL      %  r   znetscan-win81-x86)rK   r   i (  r   znetscan-win10-10240-x86)rK   r   iZ)  r   znetscan-win10-10586-x86)rK   r   i98  r   znetscan-win10-14393-x86)rK   r   i:  r   znetscan-win10-15063-x86)rK   r   i?  r   )rK   r   iB  r   znetscan-win10-17134-x86)rK   r   icE  r   rK   r   G  r   rK   r   G  r   znetscan-vista-x64znetscan-vista-sp12-x64znetscan-win7-x64znetscan-win8-x64znetscan-win81-x64)rL   rM   rN   iM  znetscan-win81-19935-x64znetscan-win10-x64znetscan-win10-15063-x64znetscan-win10-16299-x64znetscan-win10-17134-x64znetscan-win10-17763-x64znetscan-win10-18362-x64znetscan-win10-18363-x64znetscan-win10-19041-x64znetscan-win10-20348-x64)rO   rQ   )rK   r   iaJ  r   )rK   r   i|O  r   r   rP   z@Detected 18363 data structures: working with 18363 symbol table.rR   zaRequiring further version inspection due to OS version by checking tcpip.sys's FileVersion headermemory_layerNz	tcpip.sysrM   z&Determined tcpip.sys's FileVersion: {}z,Could not determine tcpip.sys's FileVersion.zEUnable to retrieve physical memory layer, skipping FileVersion check.z>Unable to find exact matching symbol file, going with latest: z6This version of Windows is not supported: {}.{} {}.{}!zDetermined symbol filename: )r   symbol_table_is_64bitr   is_win10_18363_or_laterr   r*   get_version_structureget_kuser_structureintMinorVersionNtMajorVersionNtMinorVersion
ValueErrorNotImplementedErrorr	   VolatilityExceptionvollogdebugformatMajorVersionr   win10_x64_class_typesclass_typeslayersconfiggetr   r+   find_version_infosort)r-   r1   rF   rG   is_64bitis_18363_or_laterarchverskuservers_minor_versionnt_major_versionnt_minor_versionre   version_dicttcpip_mod_versionabcdphysical_layer_nameverfilenament_majnt_minvers_min	tcpip_vercurrent_versionslatest_versions                               r.   determine_tcpip_versionzNetScan.determine_tcpip_versiong   s_   0 00/J$<</
 DDyy..w
OT		--gz?S	!$T%6%6!7"5#7#78"5#7#78 	077$$$$!!!!		
 r!dem!77K "--K 5=!4!4  !4  !4	
  !3  !3  !3  !3  !4 "#< "#< "#< "#< "#< "#<  "#<!" "#<#$ "#<%L*!4!9  !9  !9	
  !3  !3  !3  !3  !4 $%> "#6 "#6 "#6 "#< "#<  "#<!" "#<#$ $=#<#<#<+L2  &+<LLR "' +
 
1a1ay-/?ASTTQ 1aL
 LLs #*.."<"C"C"G"G# #oo770+ (+A%LL@GG- LL!OP[  ##/1CEVW
  <H   7FFHi--..!22	 95    !!#!1"!5'++N;TU]T^_
 *LSS(())*	  	3H:>?$$U  	%F 	 00n p
X s   8?M; "N(
!N0
;*N%config_pathc                     d|i}| j                  |||      \  }}t        j                  j                  ||t        j
                  j                  dd      |||      S )a  Creates a symbol table for TCP Listeners and TCP/UDP Endpoints.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            layer_name: The name of the layer on which to operate
            nt_symbol_table: The name of the table containing the kernel symbols
            config_path: The config path where to find symbol files

        Returns:
            The name of the constructed symbol table
        
nt_symbolswindowsnetscan)re   table_mapping)r   r   IntermediateSymbolTablecreateospathjoin)r-   r1   rF   rG   r   r   symbol_filenamere   s           r.   create_netscan_symbol_tablez#NetScan.create_netscan_symbol_table>  sm    & &7'*'B'B(
$ //66GGLLI.#' 7 
 	
r0   netscan_symbol_tablec              #      K   | j                  ||      }t        j                  j                  ||||      D ]  }|\  }}}	|  yw)a>  Scans for network objects using the poolscanner module and constraints.

        Args:
            context: The context to retrieve required elements (layers, symbol tables) from
            layer_name: The name of the layer on which to operate
            nt_symbol_table: The name of the table containing the kernel symbols
            netscan_symbol_table: The name of the table containing the network object symbols (_TCP_LISTENER etc.)

        Returns:
            A list of network objects found by scanning the `layer_name` layer for network pool signatures
        N)rE   r   r)   generate_pool_scan)
r-   r1   rF   rG   r   constraintsresult_constraint
mem_object_headers
             r.   scanzNetScan.scanb  sS     ( 44W>RS!--@@Z+
F 06,KW	
s   AANshow_corrupt_resultsc              #   
  K   | j                   j                  | j                  d      }| j                  | j                   |j                  |j
                  | j                        }| j                  | j                   |j                  |j
                  |      D ]A  }t        j                  d|j                  j                  ddt        |              |s|j                         sPt        |t        j                         rt        j                  d|j                  j                  d       |j#                         D ]  \  }}}dt%        j&                  |j                  j                        d|z   ||j(                  ddd	|j+                         xs t-        j.                         |j1                         xs t-        j.                         |j3                         xs t-        j.                         f
f  bt        |t        j4                        rt        j                  d
|j                  j                  d       |j7                         t        j8                  k(  rd}n&|j7                         t        j:                  k(  rd}nd}	 |j<                  j>                  }	dt%        j&                  |j                  j                        ||jC                         xs t-        j.                         |jD                  |jG                         xs t-        j.                         |jH                  |	|j+                         xs t-        j.                         |j1                         xs t-        j.                         |j3                         xs t-        j.                         f
f t        |t        jJ                        rt        j                  d|j                  j                  d       |j#                         D ]  \  }}}
dt%        j&                  |j                  j                        d|z   ||j(                  |
dd|j+                         xs t-        j.                         |j1                         xs t-        j.                         |j3                         xs t-        j.                         f
f  t        j                  d| dt        |              D y# t@        $ r t-        j.                         }	Y [w xY ww)z3Generates the network objects for use in rendering.r   zFound netw obj @ 0x2xz of assumed type zFound UDP_ENDPOINT @ 0xr   UDP* zFound _TCP_ENDPOINT @ 0xTCPv4TCPv6zTCPv?zFound _TCP_LISTENER @ 0xTCP	LISTENINGz)Found network object unsure of its type: z	 of type N)&r1   modulesrg   r   rF   symbol_table_namer   r   r`   ra   voloffsettypeis_valid
isinstancer   r7   dual_stack_socketsr   HexPortget_owner_pidr   UnreadableValueget_owner_procnameget_create_timer6   get_address_familyAF_INETAF_INET6Stater    r]   get_local_address	LocalPortget_remote_address
RemotePortr5   )selfr   r   r   netw_objrz   laddr_protostateraddrs              r.   
_generatorzNetScan._generator~  s      %%dkk(&;<#??LL&++V-E-EtGWGW 
 		LL$$ 	
H LL%hll&9&9"%==NtT\~N^_ (0A0A0C(G$9$9:6x||7J7J26NOP &.%@%@%BMC(,,X\\-@-@A!CK!$MM$224S	8Q8Q8S$779 ;(88:$446U):S:S:U  &C$ Hg&;&;<78K8KB7OPQ..0GOOC#E002g6F6FF#E#E8$NN66E
 $(()<)<= 224S	8Q8Q8S ** 335T9R9R9T ++ ..0OI4M4M4O 335T9R9R9T 002Qi6O6O6Q " Hg&;&;<78K8KB7OPQ *2)D)D)F%C(,,X\\-@-@A!CK!$MM!'$224S	8Q8Q8S$779 ;(88:$446U):S:S:U  *G& ?zSWX`SaRbcs
\ " 8%557E8s+   J	TS"H;TS>:T=S>>Tc              #     K   | j                         D ]  }|\  }}t        |d   t        j                        s&|D cg c]:  }t        |t        j                        st        |t        j
                        rdn|< }}dj                  |d   |d   |d   |d   |d   |d	   |d
   |d         }|t        j                  j                  |d   f  y c c}w w)N	   zN/Az`Network connection: Process {} {} Local Address {}:{} Remote Address {}:{} State {} Protocol {}       r   rM         rL   r   )
r   r   datetimer   r   UnparsableValuerb   r   TimeLinerTypeCREATED)r   row_depthrow_datair    s         r.   generate_timelinezNetScan.generate_timeline  s     ??$C"FHhqk8+<+<= " 	 "!Y%>%>?!!Y%>%>?  H ==CVQKQKQKQKQKQKQKQK	>  	 7 7 ? ?!MM7 %
s   ;C?C<ACc                 :   | j                   j                  dd       }t        j                  dt        j
                  fdt        fdt        fdt        fdt        fdt        fdt        fd	t        fd
t        fdt        j                  fg
| j                  |            S )Nr$   OffsetProto	LocalAddrr   ForeignAddrForeignPortr   PIDOwnerCreated)r   )
rg   rh   r   TreeGridr   r   strrY   r   r   )r   r   s     r.   runzNetScan.run  s    #{{/@$G!!<++,#c"c"$$##H--. OO1EOF
 	
r0   )N)__name__
__module____qualname____doc___required_framework_version_versionclassmethodr/   staticmethodr
   r1   ContextInterfacer   r   r   r>   rE   r   r   r   r   r   objectsObjectInterfacer   r   boolr   r   r    r0   r.   r   r      s   Q"+H
 
0 /
##44/
DG/
	k((	)/
 /
b T%##44T% T% 	T%
 
sDy	T% T%l !
##44!
 !
 	!

 !
 
!
 !
F ##44  	
 " 
*$$44	5 6dx~ dLN<
r0   r   )&r   loggingr   typingr   r   r   r   r   volatility3.frameworkr   r	   r
   r   r   #volatility3.framework.configurationr   volatility3.framework.renderersr   volatility3.framework.symbolsr   %volatility3.framework.symbols.windowsr   0volatility3.framework.symbols.windows.extensionsr   volatility3.pluginsr   volatility3.plugins.windowsr   r   r   	getLoggerr   r`   pluginsPluginInterfaceTimeLinerInterfacer   r   r0   r.   <module>r      sh   
   	 8 8 W W < 8 2 : D ) B B			8	$}
j  00)2N2N }
r0   