HTML page generated by asm2html - ASM to HTML converter - Copyright (c) 2004 Mateusz Tymek
Get this tool at www.decard.net


;------------------------------------------------------------------------
; ViGuardNaked v0.1 (29 Juillet 2001)
; Freeware, Open Source, GPL, et plus si affinités.
;------------------------------------------------------------------------
;
; C'est quoi: un petit programme rapidement torché, une nuit pendant laquelle,  
;      il faut bien le dire, je me faisais chier comme un rat, mal écrit et 
;      pas du tout optimisé. Ne regardez pas cette source. J'ai honte.
;
; But: décrypter, analyser et dumper sur disque les fichiers de certification
;      créés par Viguard (nom par defaut: certify.bvd, attribut hidden).
;
; Raison: démontrer que Viguard est un mauvais détecteur d'integrité 
;      qui se fait passer pour ce qu'il n'est pas: un antivirus,
;      et qu'il est sans doute incapable de restaurer la majorité 
;      des exécutables infectés. Aussi, qu'il re-certifie des programmes
;      infectés ou modifiés sans prévenir l'utilisateur.
;
; Limitations: pour cause de flemme aigüe, ce programme ne traite que 
;      les cinq types majeurs d'exécutables (PE, LE, NE, MZ, COM), et 
;      les fichiers macros (DOC, XLS). A vrai dire, je ne sais pas si
;      Viguard "certifie" d'autres types de fichiers.
;
; Manuel d'utilisation: Lancez le programme. Selectionnez un fichier *.bvd.
;      C'est tout. Dans le répertoire, deux nouveaux fichiers sont créés:
;        - certify.dec est à consulter avec un éditeur hexa, c'est exactement
;          le fichier de départ, sauf qu'il est decrypté.
;        - certify.dmp est l'analyse du contenu du fichier précédent, octet
;          par octet. Peut se lire avec un éditeur de texte.
;
; Coded by Le Concombre Masqué. Contacter Guillermito (guillermito@pipo.com),
;      qui me transmettra les lettres de menaces légales, les demandes en
;      marriage, et les bug reports.
;
; Testé avec les fichiers certify.bvd de Viguard 9 v25b9 et v25e9
;
; S'assemble avec un petit coup de:
;      TASM32 /ml /m3 /z /t z
;      TLINK32 -Tpe -aa z,,,import32 
;------------------------------------------------------------------------

callW macro   x
extrn x:PROC
call x
endm

   .486
   .model flat

.data

openfilename_struct:
lStructSize       dd openfilename_struct_size
hwndOwner         dd 0
hInstance         dd 0
lpstrFilter       dd offset filter
lpstrCustomFilter dd 0
nMaxCustFilter    dd 0
nFilterIndex      dd 0
lpstrFile         dd offset namebuffer
nMaxFile          dd 255
lpstrFileTitle    dd 0
nMaxFileTitle     dd 32
lpstrInitialDir   dd 0
lpstrTitle        dd 0
Flags             dd 1000h+4h+200000h
nFileOffset       dw 0
nFileExtension    dw 0
lpstrDefExt       dd 0
lCustData         dd 0
lpfnHook          dd 0
lpTemplateName    dd 0
openfilename_struct_size equ $-offset openfilename_struct

filter		db "Viguard stupid certify files *.bvd",0,"*.bvd",0
		db "All stupid files *.*",0,"*.*",0,0
namebuffer	db 255 dup(0)

file_size   		dd ?
file_handle		dd ?
file_mem_buffer		dd ?
file_nb_bytes_read	dd ?
uu_mem_buffer		dd ?
fichier_uu_handle	dd ?
file_name		db "certify.dec",0
file_name2		db "certify.dmp",0
uusize	   		dd ?
dump_mem_buffer		dd ?

stupid_xor:
 db 0, 0, 0, 0, 0, 0, 0, 0
 db 0, 0, 0, 0, 0, 0, 0, 0
 db 0, 0, 0, 0, 0, 0, 0, 0
 db 0, 0, 0, 0, 0, 0, 0, 0
 db 0, 0, 0

stupid_xor_for_docs: 
 db 0, 0, 0, 0, 0, 0, 0, 0
 db 0, 0, 0, 0, 0, 0, 0, 0
 db 0, 0, 0, 0, 0, 0, 0, 0
 db 0, 0, 0, 0, 0, 0

bin2asciidec_value db "0000000000d", 0
bin2asciihex_value db "00000000h", 0

titre	db "Output ViGuardNaked v0.1 by The Concombre Masqué",0dh,0ah
	db "Contenu du fichier certify.bvd apres décryptage, dans l'ordre",0dh,0ah
        db "exact du fichier original; a comparer avec certify.dec",0dh,0ah
size_titre equ ($-offset titre)
header	db 0dh,0ah,0dh,0ah
	db "------------------------------------------------------------",0dh,0ah
	db "                   HEADER GENERAL",0dh,0ah
	db "------------------------------------------------------------",0dh,0ah
size_header equ ($-offset header)
header1	db 0dh,0ah,"XOR de ce fichier (- 4 premiers octets): "
size_header1 equ ($-offset header1)
header2 db 0dh,0ah,"     Version de Viguard? (toujours 6 ?): "
size_header2 equ ($-offset header2)
header3 db 0dh,0ah,"         Nombre de programmes certifiés: " 
size_header3 equ ($-offset header3)
unk	db 0dh,0ah,0dh,0ah," Fichier de type inconnu ou pas encore analysé par flemme"
size_unk equ ($-offset unk)
nb_fichiers dd ?
prochaine_section dd ?
type_fichier dd ?
prog	db 0dh,0ah,0dh,0ah
	db "------------------------------------------------------------",0dh,0ah
	db "                  PROGRAMME CERTIFIE",0dh,0ah
	db "------------------------------------------------------------",0dh,0ah
size_prog equ ($-offset prog)
prog1	db 0dh,0ah,"              Taille section: " 
size_prog1 equ ($-offset prog1)
prog2	db 0dh,0ah,"                Type fichier: " 
size_prog2 equ ($-offset prog2)
prog3	db 0dh,0ah,"             Taille nom long: " 
size_prog3 equ ($-offset prog3)
prog4	db 0dh,0ah,"                    Nom long: " 
size_prog4 equ ($-offset prog4)
prog5	db 0dh,0ah,"Taille nom DOS (0 si pareil): " 
size_prog5 equ ($-offset prog5)
prog6	db 0dh,0ah,"                     Nom DOS: " 
size_prog6 equ ($-offset prog6)
prog7	db 0dh,0ah,"              Taille fichier: " 
size_prog7 equ ($-offset prog7)
prog8	db 0dh,0ah,"Debut PE header (word a 3ch): " 
size_prog8 equ ($-offset prog8)
prog9	db 0dh,0ah,"   Taille PE+Section headers: " 
size_prog9 equ ($-offset prog9)
prog10	db 0dh,0ah,0dh,0ah,"PE+Section headers en entier: " 
size_prog10 equ ($-offset prog10)
prog11	db 0dh,0ah,"         XOR de la section " 
size_prog11 equ ($-offset prog11)
prog12	db 0dh,0ah,0dh,0ah,"16 premiers octets de code: " 
size_prog12 equ ($-offset prog12)
prog13	db "    ? (toujours zero ou un?): " 
size_prog13 equ ($-offset prog13)
prog14	db 0dh,0ah,"      XOR de tout le fichier: " 
size_prog14 equ ($-offset prog14)
prog15	db 0dh,0ah,0dh,0ah,"Header MZ (28 octets): "
size_prog15 equ ($-offset prog15)
prog16	db 0dh,0ah,"16 premiers octets de code: " 
size_prog16 equ ($-offset prog16)
prog17	db "6 derniers octets de code: "
size_prog17 equ ($-offset prog17)
prog18	db 0dh,0ah,0dh,0ah,"24 premiers octets de code: " 
size_prog18 equ ($-offset prog18)
prog19	db 0dh,0ah,"12 octets suivants: " 
size_prog19 equ ($-offset prog19)
prog20	db 0dh,0ah,"     offset de ces 12 octets: " 
size_prog20 equ ($-offset prog20)
prog21	db 0dh,0ah,0dh,0ah,"Si jmp, les 16 octets au jmp (si pas jmp, VG remet les memes): " 
size_prog21 equ ($-offset prog21)
prog22	db 0dh,0ah,"96 premiers octets de code: " 
size_prog22 equ ($-offset prog22)
prog23	db 0dh,0ah,"              FileTime stamp: " 
size_prog23 equ ($-offset prog23)
prog24	db 0dh,0ah,"                     Inconnu: " 
size_prog24 equ ($-offset prog24)
prog25	db 0dh,0ah,0dh,0ah,"16 octets (128 bits), sans doute un hash MD5 des macros présentes: " 
size_prog25 equ ($-offset prog25)


type1 db "PE w32 exec"
type2 db "MZ DOS exec"
type3 db "COM DOS exe"
type4 db "LE w driver"
type5 db "NE w16 exec"
type6 db "Fich. Macro"
type7 db "--Inconnu--"

.code

programme:

;-------------------------------------------------------------------
;                 OPEN THE FUCKING CERTIFY.BVD
;-------------------------------------------------------------------

;-------- choose a file -------------

push offset openfilename_struct
callW GetOpenFileNameA                   ;choose file
test eax, eax
jz end

;-------- open it --------------

push 0
push 80h				;FILE_ATTRIBUTE_NORMAL
push 3					;OPEN_EXISTING
push 0
push 0
push 80000000h+40000000h		;GENERIC_READ+GENERIC_WRITE
push dword ptr [lpstrFile]
callW CreateFileA			;open file
inc eax
jz end
dec eax
mov file_handle, eax

;---------- get its size ---------

push 0
push dword ptr file_handle
callW GetFileSize			;get file size in bytes
inc eax
jz close_file
dec eax
mov file_size, eax

;--------- alloc memory for file --------

mov eax, file_size
add eax, 1024			;1 ko more for security
push eax			;number of bytes to allocate
push 40h			;40h=LMEM_ZEROINIT
callW LocalAlloc
test eax, eax
jz close_file
mov file_mem_buffer, eax

;------- read entire file into file_mem_buffer ------------

push 0
push offset file_nb_bytes_read
push file_size
push file_mem_buffer
push file_handle
callW ReadFile
test eax, eax
jz free_memory
mov eax, file_nb_bytes_read
cmp eax, file_size			;verify we have all the file in memory
jnz free_memory

;----------------------------------------------------------------
;    DE-XOR THE FUCKING CERTIFY.BVD AND SAVE A RAW CERTIFY.DEC
;----------------------------------------------------------------

;---- get nb of files in certify in ebp ---

xor eax, eax
mov esi, file_mem_buffer
mov ax, word ptr [esi+5]
mov ebp, eax

;---- pointer at beginning of file header ----

add esi, 7

;---- get size of section header to decrypt in ecx ----

decrypt_one_file_section:
xor eax, eax
lodsw
mov ecx, eax
sub ecx, 4

;---- check the file type marker ----

;add esi, 2

lodsw
cmp ax, 1
jnz not_a_doc
mov ebx, offset stupid_xor_for_docs
mov stupid_xor_size, 30
jmp suitezz
not_a_doc:
mov ebx, offset stupid_xor ;base
mov stupid_xor_size, 35
suitezz:

;------- decrypt the stuff --------

xor edx, edx ;pointer
mov edi, esi

xor_one_file_section:
lodsb
xor al, byte ptr [ebx+edx]
stosb
inc edx
cmp edx, stupid_xor_size
jne not_end_of_key
xor edx, edx
not_end_of_key:
loop xor_one_file_section

dec ebp
jnz decrypt_one_file_section

;------- open a new file on the disk ----------------

push 0					;handle
push 80h				;80h=FILE_ATTRIBUTE_NORMAL
push 2					;2=OPEN_ALWAYS
push 0					;address of security descriptor
push 0					;0=Prevents the file from being shared
push 40000000h				;40000000h=GENERIC_WRITE
push offset file_name			;address of name of the file
call CreateFileA
mov fichier_uu_handle, eax

;------- write buffer in it ----------------

push 0
push offset uusize			;address of number of bytes written 
push file_size				;number of bytes to write
push file_mem_buffer			;address of data to write to file
push fichier_uu_handle			;handle of file to write to
callW WriteFile

;------- close it ----------------

close_uu_file:
push dword ptr fichier_uu_handle
callW CloseHandle

;----------------------------------------------------------------
;      ANALYSE, DUMP, AND SAVE THE DUMP AS CERTIFY.DMP 
;----------------------------------------------------------------

;--------- alloc memory for dump --------

mov eax, file_size
shl eax, 5			;x32
push eax			;number of bytes to allocate
push 40h			;40h=LMEM_ZEROINIT
callW LocalAlloc
test eax, eax
jz close_file
mov dump_mem_buffer, eax

mov esi, file_mem_buffer
mov edi, dump_mem_buffer

;------- write title ------------

mov eax, offset titre
mov ecx, size_titre
call copie_string

mov ax, 0a0dh
stosw

;--- write full name of certify file -------------

push esi
mov esi, offset namebuffer
mov ecx, 255

write_full_name:
lodsb 
test al, al
jz finito
stosb
loop write_full_name
finito:
pop esi

;------- write header general ------------

mov eax, offset header
mov ecx, size_header
call copie_string

;-------- write xor ---------------

mov eax, offset header1
mov ecx, size_header1
call copie_string
lodsd
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

;----------- write second field ------------

mov eax, offset header2
mov ecx, size_header2
call copie_string
xor eax, eax
lodsb
call bin2asciihex
mov ecx, 3
mov eax, offset bin2asciihex_value + 6
call copie_string

;----------- write number of files in this certify ------------

mov eax, offset header3
mov ecx, size_header3
call copie_string
xor eax, eax
lodsw
push eax
mov nb_fichiers, eax
call bin2asciihex
mov ecx, 5
mov eax, offset bin2asciihex_value + 4
call copie_string

pop eax
call bin2asciidec
;mov eax, "    "
;stosd
mov ax, "[ "
stosw
mov ecx, 5
mov eax, offset bin2asciidec_value + 6
call copie_string
mov al, "]"
stosb 

;-------------- analyse une section ---------

analyse_une_section:

;------- ecrit titre fichier ---------

mov eax, offset prog
mov ecx, size_prog
call copie_string

;------- ecrit taille section ---------

mov eax, offset prog1
mov ecx, size_prog1
call copie_string
xor eax, eax
lodsw
push eax
push eax
add eax, esi
sub eax, 2
mov prochaine_section, eax
pop eax
call bin2asciihex
mov ecx, 5
mov eax, offset bin2asciihex_value + 4
call copie_string

pop eax
call bin2asciidec
mov eax, "    "
stosd
mov ax, "[ "
stosw
mov ecx, 5
mov eax, offset bin2asciidec_value + 6
call copie_string
mov al, "]"
stosb 

;--------- ecrit type fichier --------------

mov eax, offset prog2
mov ecx, size_prog2
call copie_string
xor eax, eax
lodsw
push eax
mov type_fichier, eax
call bin2asciihex
mov ecx, 5
mov eax, offset bin2asciihex_value + 4
call copie_string

pop eax
cmp eax, 0028h	;pe
jne suivant11
mov ebx, offset type1
jmp ecrit_type
suivant11:
cmp eax, 0021h	;MZ
jne suivant22
mov ebx, offset type2
jmp ecrit_type
suivant22:
cmp eax, 0022h	;com1
jne suivant33
mov ebx, offset type3
jmp ecrit_type
suivant33:
cmp eax, 0024h	;com2
jne suivant44
mov ebx, offset type3
jmp ecrit_type
suivant44:
cmp eax, 0040h	;LE
jne suivant55
mov ebx, offset type4
jmp ecrit_type
suivant55:
cmp eax, 0030h	;NE
jne suivant66
mov ebx, offset type5
jmp ecrit_type
suivant66:
cmp eax, 0001h	;DOC/XLS
jne suivant77
mov ebx, offset type6
jmp ecrit_type
suivant77:
mov ebx, offset type7

ecrit_type:

mov eax, "    "
stosd
mov ax, "[ "
stosw
mov eax, ebx
mov ecx, 11
call copie_string
mov al, "]"
stosb

;-------- ecrit taille nom fichier ---------

mov eax, offset prog3
mov ecx, size_prog3
call copie_string
xor eax, eax
lodsb
push eax
mov ebp, eax
call bin2asciihex
mov ecx, 3
mov eax, offset bin2asciihex_value + 6
call copie_string

pop eax
call bin2asciidec
mov eax, "    "
stosd
mov eax, "[   "
stosd
mov ecx, 4
mov eax, offset bin2asciidec_value + 7
call copie_string
mov al, "]"
stosb 

;--------- ecrit nom fichier --------

mov eax, offset prog4
mov ecx, size_prog4
call copie_string
mov ecx, ebp
rep movsb

;----- verif for docs 'cause different format -----

cmp type_fichier, 1
jz pas_de_nom_dos

;------- ecrit taille nom DOS fichier -----------

mov eax, offset prog5
mov ecx, size_prog5
call copie_string
xor eax, eax
lodsb
push eax
mov ebp, eax
call bin2asciihex
mov ecx, 3
mov eax, offset bin2asciihex_value + 6
call copie_string

pop eax
test eax, eax
jz pas_de_nom_dos

call bin2asciidec
mov eax, "[   "
stosd
mov ecx, 5
mov eax, offset bin2asciidec_value + 6
call copie_string
mov al, "]"
stosb 

;------- ecrit nom DOS fichier --------------

mov eax, offset prog6
mov ecx, size_prog6
call copie_string
mov ecx, ebp
rep movsb

pas_de_nom_dos:

;---------- ici on separe en fonction de chaque type ------------

cmp type_fichier, 0028h	;pe
jne suivant1
call pe
jmp fichier_suivant
suivant1:
cmp type_fichier, 0021h	;MZ
jne suivant2
call mz
jmp fichier_suivant
suivant2:
cmp type_fichier, 0022h	;com1
jne suivant3
call com1
jmp fichier_suivant
suivant3:
cmp type_fichier, 0024h	;com2
jne suivant4
call com2
jmp fichier_suivant
suivant4:
cmp type_fichier, 0040h	;LE
jne suivant5
call le
jmp fichier_suivant
suivant5:
cmp type_fichier, 0030h	;NE
jne suivant6
call ne
jmp fichier_suivant
suivant6:
cmp type_fichier, 0001h	;Macro
jne suivant7
call macros
jmp fichier_suivant
suivant7:

;---- au cas ou on connait pas -----------

mov eax, offset unk
mov ecx, size_unk
call copie_string

fichier_suivant:
dec nb_fichiers
jz fin_dump
mov esi, prochaine_section
jmp analyse_une_section

fin_dump:

;calculate size
sub edi, dump_mem_buffer
mov file_size, edi

;------- open a new file on the disk ----------------

push 0					;handle
push 80h				;80h=FILE_ATTRIBUTE_NORMAL
push 2					;2=OPEN_ALWAYS
push 0					;address of security descriptor
push 0					;0=Prevents the file from being shared
push 40000000h				;40000000h=GENERIC_WRITE
push offset file_name2			;address of name of the file
call CreateFileA
mov fichier_uu_handle, eax

;------- write buffer in it ----------------

push 0
push offset uusize			;address of number of bytes written 
push file_size				;number of bytes to write
push dump_mem_buffer			;address of data to write to file
push fichier_uu_handle			;handle of file to write to
callW WriteFile

;------- close it ----------------

close_uu_file2:
push dword ptr fichier_uu_handle
callW CloseHandle

free_memory:
push file_mem_buffer
callW LocalFree
push uu_mem_buffer
callW LocalFree

close_file:
push dword ptr file_handle
callW CloseHandle

end:
push -1
callW ExitProcess

;----------------------------------------------------------------
;             ROUTINES FOR EACH TYPE OF FILE
;----------------------------------------------------------------

;-------- MACROS -----------

macros:

; datetime fichier

mov eax, offset prog23
mov ecx, size_prog23
call copie_string
lodsd
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

; taille fichier

mov eax, offset prog7
mov ecx, size_prog7
call copie_string
lodsd
push eax
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

pop eax
call bin2asciidec
mov ax, "[ "
stosw
mov ecx, 11
mov eax, offset bin2asciidec_value 
call copie_string
mov al, "]"
stosb 

;inconnu

mov eax, offset prog24
mov ecx, size_prog24
call copie_string
xor eax, eax
lodsw
call bin2asciihex
mov ecx, 5
mov eax, offset bin2asciihex_value+4
call copie_string

;inconnu bis

mov eax, offset prog24
mov ecx, size_prog24
call copie_string
xor eax, eax
lodsw
call bin2asciihex
mov ecx, 5
mov eax, offset bin2asciihex_value+4
call copie_string

;dump 16 octets (hash?) s'il y a lieu

cmp esi, prochaine_section
jz pas_de_hash

mov eax, offset prog25
mov ecx, size_prog25
call copie_string

mov ebp, 16d
call dump_bin2hexa_et_ascii

pas_de_hash:
ret

;-------- NE -----------

ne:

; taille fichier

mov eax, offset prog7
mov ecx, size_prog7
call copie_string
lodsd
push eax
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

pop eax
call bin2asciidec
mov ax, "[ "
stosw
mov ecx, 11
mov eax, offset bin2asciidec_value 
call copie_string
mov al, "]"
stosb 

ret

;---------- LE -------------

le:

; taille fichier

mov eax, offset prog7
mov ecx, size_prog7
call copie_string
lodsd
push eax
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

pop eax
call bin2asciidec
mov ax, "[ "
stosw
mov ecx, 11
mov eax, offset bin2asciidec_value 
call copie_string
mov al, "]"
stosb 

ret

;------------ COM2 -------------

com2:

; taille fichier

mov eax, offset prog7
mov ecx, size_prog7
call copie_string
lodsd
push eax
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

pop eax
call bin2asciidec
mov ax, "[ "
stosw
mov ecx, 11
mov eax, offset bin2asciidec_value 
call copie_string
mov al, "]"
stosb 

;dump 96 octets

mov eax, offset prog22
mov ecx, size_prog22
call copie_string

mov ebp, 96d
call dump_bin2hexa_et_ascii

ret

;---------- COM1 -----------

com1:

; taille fichier

mov eax, offset prog7
mov ecx, size_prog7
call copie_string
lodsd
push eax
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

pop eax
call bin2asciidec
mov ax, "[ "
stosw
mov ecx, 11
mov eax, offset bin2asciidec_value 
call copie_string
mov al, "]"
stosb 

; xor tout le fichier

mov eax, offset prog14
mov ecx, size_prog14
call copie_string
lodsd
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

;dump 24 premiers

mov eax, offset prog18
mov ecx, size_prog18
call copie_string

mov ebp, 24d
call dump_bin2hexa_et_ascii

;dump 12 suivants

mov eax, offset prog19
mov ecx, size_prog19
call copie_string

mov ebp, 12d
call dump_bin2hexa_et_ascii

; offset de ces 12 suivants

mov eax, offset prog20
mov ecx, size_prog20
call copie_string
lodsd
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

;dump 16 au jump

mov eax, offset prog21
mov ecx, size_prog21
call copie_string

mov ebp, 16d
call dump_bin2hexa_et_ascii

;dump 6 derniers

mov eax, offset prog17
mov ecx, size_prog17
call copie_string

mov ebp, 6
call dump_bin2hexa_et_ascii

ret

;----------- MZ ---------------

mz:

; taille fichier

mov eax, offset prog7
mov ecx, size_prog7
call copie_string
lodsd
push eax
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

pop eax
call bin2asciidec
mov ax, "[ "
stosw
mov ecx, 11
mov eax, offset bin2asciidec_value 
call copie_string
mov al, "]"
stosb 

; xor tout le fichier

mov eax, offset prog14
mov ecx, size_prog14
call copie_string
lodsd
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

;dump hex MZ header

mov eax, offset prog15
mov ecx, size_prog15
call copie_string

mov ebp, 28d
call dump_bin2hexa_et_ascii

;dump 16 premiers code

mov eax, offset prog16
mov ecx, size_prog16
call copie_string

mov ebp, 16d
call dump_bin2hexa_et_ascii

;dump 6 derniers code

mov eax, offset prog17
mov ecx, size_prog17
call copie_string

mov ebp, 6
call dump_bin2hexa_et_ascii

ret

;------------ PE -------------------

pe:

; taille fichier

mov eax, offset prog7
mov ecx, size_prog7
call copie_string
lodsd
push eax
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

pop eax
call bin2asciidec
mov ax, "[ "
stosw
mov ecx, 11
mov eax, offset bin2asciidec_value 
call copie_string
mov al, "]"
stosb 

;debut pe header

mov eax, offset prog8
mov ecx, size_prog8
call copie_string
xor eax, eax
lodsw
call bin2asciihex
mov ecx, 5
mov eax, offset bin2asciihex_value+4
call copie_string

;taille pe header

mov eax, offset prog9
mov ecx, size_prog9
call copie_string
xor eax, eax
lodsw
mov ebp, eax
call bin2asciihex
mov ecx, 5
mov eax, offset bin2asciihex_value+4
call copie_string

;dump hex pe header

mov eax, offset prog10
mov ecx, size_prog10
call copie_string

call dump_bin2hexa_et_ascii

; xor sections
;int 3
mov ecx, prochaine_section
sub ecx, esi
sub ecx, 18d
shr ecx, 2
mov ebx, 1

toutes_les_sections:

push ecx

mov eax, offset prog11
mov ecx, size_prog11
call copie_string

mov eax, ebx
call bin2asciidec
mov ecx, 1
mov eax, offset bin2asciidec_value+9
call copie_string
inc ebx

mov ax, " :"
stosw

lodsd
call bin2asciihex
mov ecx, 9
mov eax, offset bin2asciihex_value
call copie_string

pop ecx
loop toutes_les_sections

;16 octets code

mov eax, offset prog12
mov ecx, size_prog12
call copie_string

mov ebp, 16
call dump_bin2hexa_et_ascii

; 2 derniers

mov eax, offset prog13
mov ecx, size_prog13
call copie_string

xor eax, eax
lodsw
call bin2asciihex
mov ecx, 5
mov eax, offset bin2asciihex_value+4
call copie_string

ret

;----------------------------------------------------------------
;  BIN => HEXAascii et ASCII       (esi/edi et ebp=compteur en entree)
;----------------------------------------------------------------

dump_bin2hexa_et_ascii:
mov eax, 0a0dh
stosw
mov ebx, 16

dump_bin2hexa_et_ascii_loop:
xor eax, eax
lodsb

	push ebx
	push edi
	push eax
	cmp al, 20h
	ja sup_a_20h
	mov al, 2eh
	jmp change_pas
	sup_a_20h:
	cmp al, 0a0h
	ja change_pas
	cmp al, 7fh
	jb change_pas
	mov al, 2eh	
	change_pas:
	shl ebx, 1
	add ebx, 20
	add edi, ebx
	mov byte ptr [edi], al
	pop eax
	pop edi
	pop ebx

call bin2asciihex
mov ecx, 2
mov eax, offset bin2asciihex_value+6
call copie_string
mov al, 20h
stosb
dec ebx
jnz suitez
mov eax, "    "
stosd
mov ebx, 16
add edi, 16
mov ax, 0a0dh
stosw
suitez:
dec ebp
jnz dump_bin2hexa_et_ascii_loop

mov ecx, ebx
mov eax, 20202020h
padde_la_ligne:
stosw
stosb
loop padde_la_ligne
stosd

sub ebx, 16
neg ebx
add edi, ebx 
mov ax, 0a0dh
stosw

ret

;----------------------------------------------------------------
;  COPIE STRING A EDI    (eax=source, ecx=compteur)
;----------------------------------------------------------------

copie_string:
push esi
mov esi, eax
rep movsb
pop esi
ret

;----------------------------------------------------------------
;  EAX => HEXAascii    (eax en entree)
;----------------------------------------------------------------

bin2asciihex:
pusha
mov edi, offset bin2asciihex_value
add edi, 7
mov ecx, 8

bin2asciihex_loop:
push eax
and eax, 0000000fh
cmp eax, 9
ja ajoute_a
add al, "0"
jmp ajoute_0
ajoute_a:
add al, "a"-10
ajoute_0:
mov byte ptr [edi], al
dec edi
pop eax
shr eax, 4
loop bin2asciihex_loop
popa

ret

;----------------------------------------------------------------
;  EAX => DECIMALascii    (eax en entree)
;----------------------------------------------------------------

bin2asciidec:
pusha
mov edi, offset bin2asciidec_value
add edi, 9
mov ecx, 10 

bin2asciidec_loop:
xor edx, edx
mov ebx, 10
div ebx
add dl, "0"
mov byte ptr [edi], dl
dec edi
loop bin2asciidec_loop
popa

ret

end programme