
    XfW                        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j"        j#        ej$                  Z%dS )    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dS )NetScanzGScans for network objects present in a particular windows memory image.)   r   r      r   r   c           
      $   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.Ey   +ty)   +'/9   +& A	  
 	
    contextsymbol_tablereturnc           	         | j                             |t          j        z   dz             j        }| j                             |t          j        z   dz             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   sh    (119>)O;
 

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

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

 	 &&7/I&%.7+:N:SS	   &&7/I&%.7+:N:SS	   &&7/I&%.7+:N:SS	  !
 	
r0   
layer_nament_symbol_tablec                 2   t          j        ||          }t          j        ||          }|rd}nd}t          j                            |||          }t          j                            |||          }	 t          |j	                  t          |j
                  t          |j                  n1# t          $ r t          d           t          j        d          xY wt                               d                    |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/d0d1d2}
d3d4k    r|rt                               d5           d6fd7|
D             rt                               d8           |j        |         j                            d9d:          }|rtt4          j                            ||d;          }|r6|d<         t                               d=                                         n5t                               d>           nt                               d?           |
                    f          }|sfd@|
D             }|                                 |r;|dA         }|
                    |          }t                               dB|            n*t          dC                    |j                            t                               dD|            ||	fS )Ea  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-x64)rO   rQ   )rK   r   iaJ  r   r   rP   z@Detected 18363 data structures: working with 18363 symbol table.rR   c                 J    g | ]\  }}}}|||ffk    r|d k    ||||f S )r    ).0abcdnt_major_versionnt_minor_versionvers_minor_versions        r.   
<listcomp>z3NetScan.determine_tcpip_version.<locals>.<listcomp>   sW     
 
 
1a1ay-/?ASTTTQ 1aL r0   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.c                 J    g | ]\  }}}}|k    r|k    r|k    ||||f S rT   rT   )rU   nt_majnt_minvers_min	tcpip_verrZ   r[   tcpip_mod_versions        r.   r]   z3NetScan.determine_tcpip_version.<locals>.<listcomp>  sZ          7FFHi---...!222	 95 322r0   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kuserrv   version_dictphysical_layer_nameverfilenamecurrent_versionslatest_versionrZ   r[   rd   r\   s                   @@@@r.   determine_tcpip_versionzNetScan.determine_tcpip_versiong   s   0 0/JJ$</
 
 
  	DDDy..w
OTT	--gz?SS	!$T%6!7!7"5#788"5#788 	 	 	%F  	 0n   	077$$!!	 	
 	
 	
 r!!demm!7KK "-K 5==!4!4  !4  !4	
  !3  !3  !3  !3  !4 "#< "#< "#< "#< "#< "#<  "#<!" "#<#$ "#<% LL*!4!9  !9  !9	
  !3  !3  !3  !3  !4 $%> "#6 "#6 "#6 "#< "#<  "#<!" "#<#$ $=#<#<)  L0  &&+<&LLR   "'

 
 
 
 
 
*
 
 
 	 LLs   #*."<"C"G"G# # # o770+   Q(+A%LL@GG-     LL!OPPPP[    ##/1CEVW
 
  	           ;G      !!### !1"!5'++N;;_U]__   
 *LSS(()*	    	>H>>???$$s   :<B7 7.C%config_pathc                     d|i}|                      |||          \  }}t          j                            ||t          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)rv   table_mapping)r   r   IntermediateSymbolTablecreateospathjoin)r-   r1   rF   rG   r   r   symbol_filenamerv   s           r.   create_netscan_symbol_tablez#NetScan.create_netscan_symbol_table=  su    & &7'*'B'B(
 (
$ /66GLLI..#' 7 
 
 	
r0   netscan_symbol_tablec              #      K   |                      ||          }t          j                            ||||          D ]}|\  }}}	|V  dS )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.scana  sp      ( 44W>RSS!-@@Z+
 
 	 	F 06,KW		 	r0   Nshow_corrupt_resultsc              #   V	  K   | j         j        | j        d                  }|                     | j         |j        |j        | j                  }|                     | j         |j        |j        |          D ]4}t          	                    d|j
        j        ddt          |                      |s|                                sRt          |t          j                  rt          	                    d|j
        j        d           |                                D ]\  }}}dt%          j        |j
        j                  d|z   ||j        ddd	|                                pt-          j                    |                                pt-          j                    |                                pt-          j                    f
fV  Tt          |t          j                  rt          	                    d
|j
        j        d           |                                t          j        k    rd}n'|                                t          j        k    rd}nd}	 |j        j        }	n## t@          $ r t-          j                    }	Y nw xY wdt%          j        |j
        j                  ||!                                pt-          j                    |j"        |#                                pt-          j                    |j$        |	|                                pt-          j                    |                                pt-          j                    |                                pt-          j                    f
fV  t          |t          j%                  rt          	                    d|j
        j        d           |                                D ]\  }}}
dt%          j        |j
        j                  d|z   ||j        |
dd|                                pt-          j                    |                                pt-          j                    |                                pt-          j                    f
fV  t          	                    d| dt          |                      6dS )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   modulesrx   r   rF   symbol_table_namer   r   rq   rr   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    rn   get_local_address	LocalPortget_remote_address
RemotePortr5   )selfr   r   r   netw_objr   laddr_protostateraddrs              r.   
_generatorzNetScan._generator}  s      %dk(&;<#??L&+V-EtGW 
  
 		L$ 	
 
 [	 [	H LL_hl&9___tT\~~__   ( 0A0A0C0C (G$9:: NOx|7JOOOPPP &.%@%@%B%B  MC(,X\-@AA!CK!$M$2244S	8Q8S8S$7799 ;(8::$4466U):S:U:U    $ Hg&;<< 8P8KPPPQQQ..00GOCC#EE0022g6FFF#EE#E8$N6EE! 8 8 8%577EEE8 $()<== 2244S	8Q8S8S * 3355T9R9T9T + ..00OI4M4O4O 3355T9R9T9T 0022Qi6O6Q6Q    " Hg&;<< P8KPPPQQQ *2)D)D)F)F  %C(,X\-@AA!CK!$M!'$2244S	8Q8S8S$7799 ;(8::$4466U):S:U:U    & cccSWX`SaSacc   s[	 [	s   I$$JJc              #   l  K   |                                  D ]}|\  }}t          |d         t          j                  s(d |D             }d                    |d         |d         |d         |d         |d         |d	         |d
         |d                   }|t          j        j        |d         fV  d S )N	   c                 ~    g | ]:}t          |t          j                  st          |t          j                  rd n|;S )zN/A)r   r   r   UnparsableValue)rU   is     r.   r]   z-NetScan.generate_timeline.<locals>.<listcomp>  sZ        	 "!Y%>??!!Y%>??EE   r0   z`Network connection: Process {} {} Local Address {}:{} Remote Address {}:{} State {} Protocol {}       r   rM         rL   r   )r   r   datetimers   r   TimeLinerTypeCREATED)r   row_depthrow_datar    s        r.   generate_timelinezNetScan.generate_timeline  s      ??$$ 	N 	NC"FHhqk8+<==   "  H==CVQKQKQKQKQKQKQKQK	> 	>  	 7 ?!MMMMM7	N 	Nr0   c                 >   | 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
| 	                    |                    S )Nr$   OffsetProto	LocalAddrr   ForeignAddrForeignPortr   PIDOwnerCreated)r   )
rx   ry   r   TreeGridr   r   strrj   r   r   )r   r   s     r.   runzNetScan.run  s    #{/@$GG!<+,#c"c"$$##H-. OO1EOF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   rT   r0   r.   r   r      s       QQ"+H
 
 [
0 /
#4/
DG/
	k(	)/
 /
 /
 \/
b S%#4S% S% 	S%
 
sDy	S% S% S% [S%j !
#4!
 !
 	!

 !
 
!
 !
 !
 [!
F #4  	
 " 
*$4	5   [6d dx~ d d d dLN N 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   rq   pluginsPluginInterfaceTimeLinerInterfacer   rT   r0   r.   <module>r      s[  
   				 8 8 8 8 8 8 8 8 8 8 8 8 8 8 W W W W W W W W W W W W W W < < < < < < 8 8 8 8 8 8 2 2 2 2 2 2 : : : : : : D D D D D D ) ) ) ) ) ) B B B B B B B B B B		8	$	$|
 |
 |
 |
 |
j 0)2N |
 |
 |
 |
 |
r0   