Analyseur de trafic (winpcap)

Description

Il s'agit d'un analyseur de trafic basé sur WinPcap en console et en MASM32! J�ai aussi fait les librairies PACKET.lib et PCAP.lib, ça peut servir (toutes les sources en RadASM par dossiers dans le zip)! Si y a des modifications à faire ou des optimisations, n'hésitez pas à me le dire! Bon coding!
PS: c�est la première source que je poste ! Soyez clément ! Merci.

Source / Exemple :


;	Liens
 
;	http://www.frameip.com/
;	http://www.winpcap.org/
;	http://www.wireshark.org/

;	installer WinPcap_4_0_2.exe

.386
.model flat, stdcall
	
	include C:\masm32\include\windows.inc
	include C:\masm32\include\user32.inc
	include C:\masm32\include\kernel32.inc
	include C:\masm32\include\wsock32.inc
	include C:\masm32\include\masm32.inc
    include C:\masm32\macros\macros.asm
	include ..\packet\Packet.inc
	include ..\wpcap\wpcap.inc
	
	includelib C:\masm32\lib\kernel32.lib
	includelib C:\masm32\lib\user32.lib
	includelib C:\masm32\lib\wsock32.lib
    includelib C:\masm32\lib\masm32.lib
    
	includelib ..\packet\Packet.lib
	includelib ..\wpcap\wpcap.lib
	
	include SNIFFERMASM.Inc

.code
start:

	; =====================
	; capture de packet !!!
	; =====================
	invoke GetStdHandle,STD_OUTPUT_HANDLE							;|- handle de la fenetre dos
	mov Hconsole,eax												
	invoke SetConsoleTitle,addr szTitle								;|- change le titre

	invoke pcap_findalldevs,addr alldevs,addr errbuf				;|- cherche les cartes réseaux
	.if (eax == -1)													;|- erreur
		print offset szErrpcap_findalldevs							
	.endif
	
	assume ecx:ptr pcap_if
	mov ecx,alldevs	
	inc compteur
	
@@:	
	push ecx
    invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY	;|- déco super tendance "gris"
	print offset szSpace
	print offset ParOpen
	invoke SetConsoleTextAttribute,Hconsole,compteur				;|- déco super tendance couleur du chiffre devant la carte 
	invoke wsprintf,addr buffsz, addr szformatNb,compteur
	print offset buffsz
    invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY	;|- déco super tendance "gris"
	print offset ParClose
	                                                                ;|-
	print offset szSpace                                            ;|
                                                                    ;|
	pop ecx                                                         ;|
	push ecx                                                        ;|
	invoke wsprintf,addr buffsz, addr szformat,[ecx]._name			;|
	print offset buffsz                                             ;| afficchage des "devices"  
	print offset szRet                                              ;|
	pop ecx                                                         ;| avec leurs descripitions
	push ecx                                                        ;|
	invoke wsprintf,addr buffsz, addr szformat,[ecx].description    ;|
	print offset buffsz                                             ;|
	print offset szRet	                                            ;|
	pop ecx                                                         ;|
	push ecx                                                        ;|-
	.if ([ecx].next)                                                ;|-
		print offset szRet	                                        ;| on test si y en a une autre sinon 
		pop ecx                                                     ;| on sort
		mov ecx,[ecx].next	                                        ;|
		inc compteur                                                ;|
		jmp @B                                                      ;|
	.else                                                           ;|
		pop ecx                                                     ;|
	.endif                                                          ;|
@@:                                                                 ;|-
	assume  ecx:nothing
	
	.if(!compteur)											;|-
		print offset szNoInterfa							;| si y a pas de "dev" on exitprocess
		invoke pcap_freealldevs,alldevs						;|-
		jmp EXIT
	.else
		@@:
		print offset szQuset1
		invoke SetConsoleTextAttribute,Hconsole,1
		print offset szQuset11
   	 	invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY
		print offset szAffHsep
		invoke SetConsoleTextAttribute,Hconsole,compteur
		invoke wsprintf,addr buffsz, addr szformatNb,compteur	
		print offset buffsz
    	invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY
		print offset szQuset111
		
		mov lpstring,input()
		mov eax,lpstring                                  
		mov al,byte ptr[eax]
		
		.if (al >= "1") && (al <= "9") 		;|-      
			invoke DecToBin,lpstring   		;| là on teste les conneries que l'utilisteurs va saisir
			mov DevSelection,eax	   		;| dailleur on remarque le bug suivant ! 		
		.else								;|- si il a 10 cartes reseaux !!!! beh !!! 
			jmp EXIT
			
		.endif                 
		
		mov ecx,compteur
		.if((eax > ecx) || (eax < 1))
			print offset szOutRange
			invoke pcap_freealldevs,alldevs
			jmp EXIT
		.endif
	.endif
	
	mov eax,1
	
	assume ecx:ptr pcap_if
	mov ecx,alldevs
	assume edx:ptr pcap_if
	mov edx,alldevs
	
	.while	(eax != DevSelection)
		assume edx:ptr pcap_if
		mov edx,[ecx].next
		mov ecx,edx	
		inc eax
	.endw		

	invoke wsprintf,addr buffsz, addr szformat,[edx]._name
	print offset buffsz
	print offset szRet
	

	invoke pcap_open_live,addr buffsz,\			;|- name of the device
							 65536,\			;| portion of the packet to capture. 
												;| 65536 grants that the whole packet will be captured on all the MACs.
							 1,\				;| promiscuous mode (nonzero means promiscuous)
							 1000,\				;| read timeout
							 addr errbuf		;|- error buffer
	mov adhandle,eax
	.if !eax
		print offset szErrOpenDev
		invoke pcap_freealldevs,alldevs
		jmp EXIT
	.endif

    invoke pcap_datalink,adhandle	;|- Check the link layer. We support only Ethernet for simplicity. bon je traduis pas !!
    .if( eax != 1)
		print offset szIndic		;|- en fait la je ne savais pas si j' devais sortir ou continuer l'execution !!
	.endif		

	invoke pcap_freealldevs,alldevs	;|- la on a plus besoin de ça, on le quik !
	
	xor ecx,ecx
	.while TRUE
		invoke pcap_next_ex,adhandle,addr ph,addr packet		
		.if (eax > 0)
			assume eax: ptr pcap_pkthdr
			mov eax,ph
			
			invoke wsprintf,addr buffsz, addr szformatNb,[eax].caplen	
			assume eax:nothing
			
			print offset buffsz
			print offset szBytesCapture
			print offset szRet
			
			push offset iphead
			push packet
			call GetEthHeader
			
			invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_GREEN 
			
			movzx edx,byte ptr [iphead.smac.byte1] 					   ;|-	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;|
			movzx edx,byte ptr [iphead.smac.byte2] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;|
			movzx edx,byte ptr [iphead.smac.byte3] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;|   Affichage 
			movzx edx,byte ptr [iphead.smac.byte4] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|     addr
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;|   - MAC -
			movzx edx,byte ptr [iphead.smac.byte5] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|	- ETH - 
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;|
			movzx edx,byte ptr [iphead.smac.byte6] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|
			print offset buffsz	                                       ;|-
			
			invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY
			
			print offset szAffHsep 	                                   ;|-
			invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_RED
			
			movzx edx,byte ptr [iphead.dmac.byte1] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;|
			movzx edx,byte ptr [iphead.dmac.byte2] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;|
			movzx edx,byte ptr [iphead.dmac.byte3] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;| Affichage 
			movzx edx,byte ptr [iphead.dmac.byte4] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;| adresse
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;| Mac 
			movzx edx,byte ptr [iphead.dmac.byte5] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|
			print offset buffsz                                        ;|
			print offset szPoiMac                                      ;|
			movzx edx,byte ptr [iphead.dmac.byte6] 					   ;|	
			invoke wsprintf,addr buffsz, addr szformatHex,edx          ;|
			print offset buffsz										   ;|-
			print offset szRet	
			
			invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY
			
			mov dx,WORD ptr [iphead.eth_type]
			;============================================================
			; IPv4
			;============================================================
			.if (dx == 00800h)
				print offset zz0800
				push offset iphead
				push packet
				call GetIpHeader
				
				xor edx, edx											;|-
				mov dl,byte ptr [iphead.protocole]						;|
				.if (dl > 1)				                			;|
					mov eax,TAILLE_SZPROTOCOL							;|	taille d'une ligne	
					mul dl                                  			;|
					mov edx,offset szProtocol1		        			;|
					add eax,edx                             			;|
					sub eax,45											;|   -45 pour pointer sur 
					print eax                               			;|   le debut de la ligne
				.else                                       			;|
					mov eax,offset szProtocol1              			;|
					print eax	                            			;|-
				.endif
				
				invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_GREEN
				movzx edx,byte ptr [iphead.sip.byte1] 					  ;|-	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi	                                      ;|
				movzx edx,byte ptr [iphead.sip.byte2] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi	                                      ;|
				movzx edx,byte ptr [iphead.sip.byte3] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi	                                      ;| Affichage d'adresse
				movzx edx,byte ptr [iphead.sip.byte4] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;| 
				print offset buffsz                                       ;| IP source et
																		  ;|  
				invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY		
				print offset szAffHsep 	                                  ;| destination
				invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_RED	  ;|
																		  ;|
				movzx edx,byte ptr [iphead.dip.byte1] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi                                        ;|
				movzx edx,byte ptr [iphead.dip.byte2] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi                                        ;|
				movzx edx,byte ptr [iphead.dip.byte3] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi                                        ;|
				movzx edx,byte ptr [iphead.dip.byte4] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szRet                                        ;|-
				invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY
				
				print offset szRet 
				assume eax: ptr pcap_pkthdr                               ;|-
				mov eax,ph				                                  ;| affiche la
				push TCP_PRINT_COLOR                                      ;|	
				push [eax].caplen                                         ;|	 
				push packet                                               ;| trame en hexa		
				call PrintPacket                                          ;| 	
				assume eax:nothing                                        ;| et en ascii.	
				
			;============================================================
			; ARP
			;============================================================
			.elseif (dx == 00806h)
				print offset sz0806
				
				push offset iphead
				push packet
				call GetArpHeader
				
				invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_GREEN
				movzx edx,byte ptr [iphead.sip.byte1] 					  ;|-	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi	                                      ;|
				movzx edx,byte ptr [iphead.sip.byte2] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi	                                      ;|
				movzx edx,byte ptr [iphead.sip.byte3] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi	                                      ;| Affichage d'adresse
				movzx edx,byte ptr [iphead.sip.byte4] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;| 
				print offset buffsz                                       ;| IP source et
																		  ;|  
				invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY		
				print offset szAffHsep 	                                  ;| destination
				invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_RED	  ;|
																		  ;|
				movzx edx,byte ptr [iphead.dip.byte1] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi                                        ;|
				movzx edx,byte ptr [iphead.dip.byte2] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi                                        ;|
				movzx edx,byte ptr [iphead.dip.byte3] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szPoi                                        ;|
				movzx edx,byte ptr [iphead.dip.byte4] 					  ;|	
				invoke wsprintf,addr buffsz, addr szformatNb,edx          ;|
				print offset buffsz                                       ;|
				print offset szRet                                        ;|-
				invoke SetConsoleTextAttribute,Hconsole,FOREGROUND_INTENSITY
				
				print offset szRet 
				assume eax: ptr pcap_pkthdr                               ;|-
				mov eax,ph				                                  ;| affiche la
				push ARP_PRINT_COLOR                                      ;|	
				push [eax].caplen                                         ;|	 
				push packet                                               ;| trame en hexa		
				call PrintPacket                                          ;| 	
				assume eax:nothing                                        ;| et en ascii.	
				
			.elseif (dx == 08035h)            ;|-
				print offset sz8035           ;|
			.elseif (dx == 0809Bh)            ;|
				print offset sz809B           ;|
			.elseif (dx == 080F3h)            ;|
				print offset sz80F3           ;|
			.elseif (dx == 08100h)            ;|
				print offset sz8100           ;|
			.elseif (dx == 08137h)            ;|
				print offset sz8137           ;| les autres tu complaiteras
			.elseif (dx == 08138h)            ;|
				print offset sz8138           ;|
			.elseif (dx == 086DDh)            ;|
				print offset sz86DD           ;|
			.elseif (dx == 08847h)            ;|
				print offset sz8847           ;|
			.elseif (dx == 08848h)            ;|
				print offset sz8848           ;|
			.elseif (dx == 08863h)            ;|
				print offset sz8863           ;|
			.elseif (dx == 08864h)            ;|
				print offset sz8864           ;|
			.elseif (dx == 088A2h)            ;|
				print offset sz88A2           ;|-
			.else
				print offset szUnknowPk
			.endif
				
			print offset szRet
			print offset szRet	
		.endif
	.endw   
	
	invoke pcap_close,adhandle

	
	mov lpstring,input()                              
	mov eax,lpstring  
	
EXIT:
	
	invoke Sleep,500
	
	xor eax,eax
	invoke ExitProcess,eax

;==========================================================================
; DecToBin (decimal -> binaire)
;==========================================================================

    align 4

DecToBin proc uses ecx edx esi edi lpstr:DWORD

	mov		esi,lpstr
	xor		eax,eax

	@@:
		xor	edx,edx
		mov	dl,byte ptr[esi]
		test edx,edx
		jz @F
		inc esi
		
		sub	edx,'0'
		
		shl	eax,1		; eax = 10*eax + edx;
		mov	ecx,eax
		shl	eax,2
		add	eax,ecx
		add	eax,edx
		jmp	@B
	@@:

	ret
DecToBin endp

;==========================================================================
; PrintPacket
;==========================================================================

    align 4

PrintPacket proc  uses esi edx lpBuffPacket:DWORD,lengthPacket:DWORD,Opt:DWORD
                                                                	;|-
	LOCAL comp :DWORD                                           	;|	variable local
	LOCAL comp16 :DWORD	                                        	;|
	LOCAL BuffAffichage [MAX_PATH]:BYTE                         	;|
	                                                            	;|-            
	; =====================
	;	Affichage du Packet
	; =====================
			                       
			lea edi,BuffAffichage									;|-
			mov esi,DWORD ptr [lpBuffPacket]						;|-
			mov PosPointeur,esi			                        	;|
			mov comp,0                                          	;|
			mov comp16,0											;|- On initialise
	L1:                                                         	;|
			assume eax: ptr pcap_pkthdr                         	;|
			mov eax,ph                                          	;|
			mov ecx,lengthPacket                                	;|
			cmp comp,ecx                                        	;|
			assume eax:nothing                                  	;|
			                                                    	;|
			je E1                                               	;|
			mov eax,comp											;| Si oui, on sort de la boucle 
			mov dl,byte ptr [esi+eax]                           	;|-
			
			 														;|- ASCII compris entre :
			.if ((dl >= 00020h) && (dl <= 0007eh) || \				;|
					(dl >= 'A') && (dl <= 'Z') || \                 ;| ('A' et 'Z') ou  
					(dl >= 'a') && (dl <= 'z') || \                 ;| ('a' et 'z') ou 
					(dl >= '0') && (dl <= '9'))                     ;| ('0' et '9')
			    	mov eax,comp16                        			;| on copy  le  char
			    	mov byte ptr [edi+eax],dl 						;|-  
			.elseif (dl == 0000Dh) 
			    	mov eax,comp16                        			;| on copy  le  char
			    	mov byte ptr [edi+eax],"." 						;|-
					;add FlagDoublRet
			.elseif (dl == 0000Ah) 
			    	
			    	mov eax,comp16                        			;| on copy  le  char
			    	mov byte ptr [edi+eax],"." 						;|-
			.else	                                  				;|- 
			    mov eax,comp16                        				;| sinon   
			    mov byte ptr [edi+eax],'.'            				;| on copy 
			.endif                           		  				;| un point '.'
																	;|- 
			
			mov eax,comp                                        	;|-
			mov dl,byte ptr [esi+eax]                           	;|
			movzx edx,byte ptr [esi+eax]                        	;|
			pusha						 							;| Afichage en couleur !! WOUAHH
				pusha                                               ;|
					.if 	(Opt == TCP_PRINT_COLOR) 
						.if ((comp >= 6) && (comp < 12)) || ((comp >= 26) && (comp < 30))
							invoke SetConsoleTextAttribute,	Hconsole,FOREGROUND_GREEN
													
						.elseif ((comp >= 0) && (comp < 6)) || ((comp >= 30) && (comp < 34))
							invoke SetConsoleTextAttribute,	Hconsole,FOREGROUND_RED;|
						.else								
							invoke SetConsoleTextAttribute,	Hconsole,FOREGROUND_INTENSITY
						.endif												
					
					.elseif (Opt == ARP_PRINT_COLOR) 
						.if ((comp >= 6) && (comp < 12)) || ((comp >= 28) && (comp < 32))
							invoke SetConsoleTextAttribute,	Hconsole,FOREGROUND_GREEN;|	
													
						.elseif ((comp >= 0) && (comp < 6)) || ((comp >= 38) && (comp < 42))
							invoke SetConsoleTextAttribute,	Hconsole,FOREGROUND_RED;|	
						.else								
							invoke SetConsoleTextAttribute,	Hconsole,FOREGROUND_INTENSITY
						.endif
					.endif
				popa 
				invoke wsprintf,addr buffsz, addr szformatHex,edx   ;| caractères, un par un !
				print offset buffsz                          		;|
				print offset szSpace                          		;|
			popa                                                	;|
			inc comp				                        		;|	comp+1
			inc comp16                                          	;|
			xor edx,edx                                         	;|
			mov eax,comp                                        	;|
			mov ecx,16                                          	;|
			div ecx                                             	;|
			.if (!edx) 	                                        	;|
				invoke SetConsoleTextAttribute, Hconsole,\      	;|  
												FOREGROUND_INTENSITY;|
																	;|
				print offset szSpace                            	;|
				mov comp16,0                                    	;|
				lea eax,BuffAffichage								;|
				                       								;|
				mov byte ptr [eax+16],0                         	;|
				                                                	;|
				print eax											;|	
				print offset szRet                              	;|
			.endif                            						;|
			                             							;|
			jmp L1            										;| Retour au debut de la boucle
	E1:                                                         	;|-
			
			mov edx,16                                          	;|-
			mov ecx,comp16                                      	;|
			sub edx,ecx                                         	;|
			.if (edx > 0)                                       	;|
				.while (edx > 0)                                	;| calcul des espaces nécessaires
					pusha                                       	;| pour afficher la dernière ligne. 
					print offset szSpace                        	;|
					print offset szSpace                        	;|
					print offset szSpace                        	;|
					popa                                        	;|
					dec edx				                        	;|
				.endw												;|
			.endif                                              	;|-
			
			invoke SetConsoleTextAttribute,	Hconsole,\      		;|
											FOREGROUND_INTENSITY	;|
			
			print offset szSpace                            		;|-
			lea eax,BuffAffichage                           		;|
			mov ecx,comp16                                      	;|
			mov byte ptr [eax+ecx],0                            	;| affiche la dernière ligne.
			print eax												;|	
			print offset szRet                              		;|-
	ret
                                                                	
PrintPacket endp                                                	

;==========================================================================
; GetIpHeader 
;==========================================================================

    align 4

GetArpHeader proc  uses esi edx lpBuffPacket:DWORD,lpiphead:DWORD

	mov esi,DWORD ptr [lpBuffPacket]
	
	;add esi,14									;|- debut de l'entête IP (Byte : 14)
	assume ecx:ptr ip_header
	mov ecx,lpiphead
	
	; Modifie esi et pointe ou tu veux dans le buffer. au 28ième caractère, par exemple 
	; il y a l'adresse IP de destination !! pour pour d'info va sur le site frameip.com
	
	add esi,28									;|-
	mov dl,byte ptr [esi]	  					;| Bytes: 28 - 32
	mov byte ptr [[ecx].sip.byte1],dl 			;| 
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].sip.byte2],dl 			;| Destination Address
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].sip.byte3],dl			;|
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].sip.byte4],dl 			;|-

	add esi,7										;|-
	mov dl,byte ptr [esi]	  					;| Bytes: 33 - 37
	mov byte ptr [[ecx].dip.byte1],dl 			;| 
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].dip.byte2],dl 			;| Destination Address
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].dip.byte3],dl			;|
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].dip.byte4],dl 			;|-
	
	assume ecx:nothing
	xor eax,eax

	ret

GetArpHeader endp

;==========================================================================
; GetIpHeader 
;==========================================================================

    align 4

GetIpHeader proc  uses esi edx lpBuffPacket:DWORD,lpiphead:DWORD

	mov esi,DWORD ptr [lpBuffPacket]
	
	add esi,14									;|- debut de l'entête IP (Byte : 14)
	assume ecx:ptr ip_header
	mov ecx,lpiphead
			                             		;|- Bytes: 14
	mov dl,byte ptr [esi]  						;| Version (4 bits) + Internet header length (4 bits)  
	mov byte ptr [[ecx].ver_ihl],dl 			;|-
                                        		
	inc esi                             		;|- Bytes: 15
	mov dl,byte ptr [esi]  						;| Type de service
	mov byte ptr [[ecx].tos],dl 				;|-
                                        		
	inc esi                             		;|-
	movzx edx,byte ptr [esi]  					;| Bytes: 16 - 17 
	shl edx,8						 			;| 
	inc esi                             		;| Total length
	mov dl,byte ptr [esi]  						;|
	mov word ptr [[ecx].tlen],dx 				;|-
                                        		
	inc esi                             		;|-
	movzx edx,byte ptr [esi]  					;| Bytes: 18 - 19
	shl edx,8						 			;| 
	inc esi                             		;| Identification
	mov dl,byte ptr [esi]  						;|
	mov word ptr [[ecx].identification],dx 		;|-

	inc esi                             		;|-
	movzx edx,byte ptr [esi]  					;| Bytes: 20 - 21
	shl edx,8						 			;| 
	inc esi                             		;| flags info
	mov dl,byte ptr [esi]  						;|
	mov word ptr [[ecx].flags_fo],dx 			;|-
		
	inc esi                             		;|- Bytes: 22
	mov dl,byte ptr [esi]  						;| ttl 
	mov byte ptr [[ecx].ttl],dl 				;|-

	inc esi                             		;|- Bytes: 23
	mov dl,byte ptr [esi]  						;| protocole 
	mov byte ptr [[ecx].protocole],dl 			;|-

	inc esi                             		;|-
	movzx edx,byte ptr [esi]  					;| Bytes: 24 - 25
	shl edx,8						 			;| 
	inc esi                             		;| Header checksum
	mov dl,byte ptr [esi]  						;|
	mov word ptr [[ecx].crc],dx 				;|-

	inc esi										;|-
	mov dl,byte ptr [esi]	  					;| Bytes: 26 - 27
	mov byte ptr [[ecx].sip.byte1],dl 			;| 
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].sip.byte2],dl 			;| Destination Address
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].sip.byte3],dl			;|
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].sip.byte4],dl 			;|-

	inc esi										;|-
	mov dl,byte ptr [esi]	  					;| Bytes: 28 - 29
	mov byte ptr [[ecx].dip.byte1],dl 			;| 
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].dip.byte2],dl 			;| Destination Address
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].dip.byte3],dl			;|
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov byte ptr [[ecx].dip.byte4],dl 			;|-

	inc esi                             		;|-
	movzx edx,byte ptr [esi]  					;| Bytes: 24 - 25
	shl edx,8						 			;| 
	inc esi                             		;| Option + Padding
	mov dl,byte ptr [esi]  						;|
	shl edx,8						 			;| 
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	shl edx,8						 			;| 
	inc esi                             		;|
	mov dl,byte ptr [esi]  						;|
	mov DWORD ptr [[ecx].op_pad],edx 			;|-

	assume ecx:nothing
	xor eax,eax

	ret

GetIpHeader endp

;==========================================================================
; GetEthHeader
;==========================================================================

    align 4

GetEthHeader proc  uses esi edx lpBuffPacket:DWORD,lpiphead:DWORD
	
	mov esi,DWORD ptr [lpBuffPacket]
	
	assume ecx:ptr ip_header
	mov ecx,lpiphead	
	mov dl,byte ptr [esi]	  				;|-
	mov byte ptr [[ecx].dmac.byte1],dl 		;| Bytes: 0 - 5
	inc esi                             	;|
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].dmac.byte2],dl 		;| Destination Address
	inc esi                             	;|
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].dmac.byte3],dl		;|
	inc esi                             	;|
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].dmac.byte4],dl		;|
	inc esi                             	;|
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].dmac.byte5],dl 		;|
	inc esi                             	;|
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].dmac.byte6],dl 		;|-
	
	inc esi                             	;|-
	mov dl,byte ptr [esi]  					;| Bytes: 6 - 11
	mov byte ptr [[ecx].smac.byte1],dl 		;|
	inc esi                             	;|
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].smac.byte2],dl		;|
	inc esi                             	;|
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].smac.byte3],dl		;|
	inc esi                             	;| Source Address
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].smac.byte4],dl 		;|
	inc esi                             	;|
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].smac.byte5],dl 		;|
	inc esi                             	;|
	mov dl,byte ptr [esi]  					;|
	mov byte ptr [[ecx].smac.byte6],dl 		;|-
	
	inc esi                             	;|-
	movzx edx,byte ptr [esi]  				;| Bytes: 12 - 13 
	shl edx,8						 		;| 
	inc esi                             	;| Ethernet Type
	mov dl,byte ptr [esi]  					;|
	mov word ptr [[ecx].eth_type],dx 		;|-
	
	assume ecx:nothing
	xor eax,eax
	
	ret

GetEthHeader endp
	
end start

Conclusion :


ZIP

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.