;------------------------------------------------------------------------
; 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