Dopo aver fatto un po' di esperienza con il primo disassembler abbiamo notato come viene facile disassemblare il codice in modo reale del "bios" disponibile sul nostro calcolatore. Abbiamo quindi appreso una montagna di informazioni utili alla programmazione, informazioni che su internet sono un tab¨, informazioni che le grosse aziende tengono sotto il cuscino.
Siamo pronti per passare a scriverci il codice del disassembler-due.
Questo secondo disassembler sarÓ un po' pi¨ potente, la sua esecuzione avviene sempre direttamente sulla macchina quindi all'esterno di un qualsiasi sistema operativo. Il programma che viene proposto nel codice seguemte gira su di un calcolatore in modalitÓ protetta e pu˛ disassemblare sia codice in "modo reale" che "in modo protetto".

Il disassembler-2 non serve per disassemblare archivi eseguibili o codice che gira sotto sistema operativo, in quanto di questi disassembler su internet ne esistono a centinaia.
Il disassembler-2 serve solamente per disassemblare il codice di un qualsiasi sistema operativo, quindi la fase iniziale della decodifica sarÓ in modo reale per poi passare alla modalitÓ protetta. Non Ŕ detto che si debba decodificare un intero sistema operativo, per˛ quello che serve Ŕ vedere le fasi iniziali della decodifica, si possono apprendere metodi e tecniche nuove.
Rimane da dire che il codice del disassembler-2 non Ŕ completo, per˛ col tempo si porterÓ a conclusione.

Guida all'assembler



Partiamo con il codice del programma
              ;bios  0009:0000
;00,08,04,00  segmento impostazioni
;00,08,04,80  segmento codice
;00,01,06,00  definizioni
;00,04,00,00  buffer di stampa
;00,80,00,00  sistema
      jmp 0000
*01           ;0003 modo esecuzione
*00 60 00 00  ;0004 totale istruzioni
*00 00 32 00  ;0008 definizioni
*00 00 40 00  ;000c sistema
*00 7c 00 00  ;0010 avvio
*10 00 80 00  ;0014 buffer di stampa
*00 00 00 00  ;0018 conversione numero
*00           ;001c opcode
*00           ;001d istruzione
*00 00        ;001e contatore di
*00 00        ;0020 contatore dx
*00 00        ;0022
*00 00 00 00  ;0024 conversione numero
*80 17 08 00  ;0028 sistema su disco
*00 60 00 00  ;002c istruzioni in stampa
*ae 9f 34 97 99 39 0b 39 00 00 00 00 00 00 00 00 ;0030 registri in stampa
*39 39 92 9e ad 39 0b 39 00 00 00 00 00 00 00 00
*39 39 92 b0 ad 39 0b 39 00 00 00 00 00 00 00 00
*39 39 92 ae ad 39 0b 39 00 00 00 00 00 00 00 00
*39 39 92 a0 ad 39 0b 39 00 00 00 00 00 00 00 00
*39 39 92 b0 99 39 0b 39 00 00 00 00 00 00 00 00
*39 39 92 9f 97 39 0b 39 00 00 00 00 00 00 00 00
*39 39 92 a0 97 39 0b 39 00 00 00 00 00 00 00 00
*39 39 92 9f 99 39 0b 39 00 00 00 00 00 00 00 00
*a0 9f 39 0b 39 00 00 00 00
*92 9f 39 0b 39 00 00 00 00
*9f 9f 39 0b 39 00 00 00 00
*a1 9f 39 0b 39 00 00 00 00
*a2 9f 39 0b 39 00 00 00 00
*a1 a6 39 0b 39 00 00 00 00
*00 00        ;00f6
*00 7c 00 00  ;00f8 cs:ip
*00 00 00 00  ;00fc eax
*00 00 00 00  ;0100 ebx
*00 00 00 00  ;0104 ecx
*80 00 00 00  ;0108 edx
*00 00 00 00  ;010c ebp
*00 00 00 00  ;0110 esi
*00 00 00 00  ;0114 edi
*80 ff 00 00  ;0118 esp
*00 00        ;011c ds
*00 00        ;011e es
*00 00        ;0120 ss
*00 00        ;0122 fs
*00 00        ;0124 gs
*02 03        ;0126 flag
      jmp 000C
      jmp 000D
      jmp 000E
      jmp 0010
      jmp 0011
:0001 push edi ;converte esadecimale*****************
      push ebx
      lea edi,00090024
      mov [edi],eax
      dec di
      add di,cx
      mov ebx,00101400
:0002 mov bl,[edi]
      rol bl,04
      and bl,0F
      mov bl,[ebx]
      mov [esi],bl
      inc esi
      mov bl,[edi]
      and bl,0F
      mov bl,[ebx]
      mov [esi],bl
      inc esi
      dec di
      loop 0002
      pop ebx
      pop edi
      ret
:0003 mov eax,00000FA0 ;stampa i registri***************
      callf 0008:0013    ;pagina video
      mov ax,fs
      mov [00090122],ax
      mov ax,gs
      mov [00090124],ax
      mov bx,040E        ;colore carattere+sfondo
      mov edi,[00010248]
      mov eax,[00010240]
      shl eax,05
      add eax,00000020
      add edi,eax
      push edi
      lea ebp,0009011C   ;registri a 16 bit
      lea esi,000900C0
      mov cx,0006
:0005 push edi
      push cx
      push si
      mov ax,[ebp+00]
      add si,0005
      mov cx,0002
      call 0001
      pop si
      mov cx,0009
:0004 mov al,[esi]
      callf 0008:0016
      add edi,00000008
      inc si
      loop 0004
      pop cx
      pop edi
      mov eax,[00010240]
      shl eax,04
      add edi,eax
      add bp,0002
      loop 0005
      pop edi
      add edi,00000050
      lea ebp,000900F8   ;registri a 32 bit
      lea esi,00090030
      mov cx,0009
:0007 push edi
      push cx
      push si
      mov eax,[ebp+00]
      add si,0008
      mov cx,0004
      call 0001
      pop si
      mov cx,0010
:0006 mov al,[esi]
      callf 0008:0016
      add edi,00000008
      inc si
      loop 0006
      pop cx
      pop edi
      mov eax,[00010240]
      shl eax,04
      add edi,eax
      add bp,0004
      loop 0007
:0008 mov ax,[00010210]  ;ciclo tastiera
      cmp al,00
      jz 0008
      mov [00010210],0000
      cmp ax,E02A
      jz 0008
      cmp al,1C
      jz 0009
      ret
:0009 mov esi,[00090014] ;salva il buffer di stampa
      and esi,00800000
      mov eax,[00090014]
      sub eax,esi
      mov [esi],eax
      lea edi,00040000
      shr eax,10
      mov cx,ax
      inc cx
:000a mov ax,0080
      mov [00010214],ax
      mov [00010218],edi
      mov [0001021C],esi
      callf 0008:0096
      add esi,00010000
      add di,0080
      loop 000A
      ret
:000b mov ebx,[00090100] ;modo reale***************
      mov ecx,[00090104]
      mov edx,[00090108]
      mov ebp,[0009010C]
      mov esi,[00090110]
      mov edi,[00090114]
      cli
      lidt [00010009]
      mov eax,00000010
      mov cr0,eax
      mov eax,[000900FC]
      mov es,[0009011E]
      mov ss,[00090120]
      mov sp,[00090118]
      push [00090126]
      pushd [000900F8]
      mov ds,[0009011C]
      sti
      iret
:000c push eax
      push ds
      push es
      push ss
      cli
      mov ax,1000
      mov ds,ax
      lidt [00000003]
      mov eax,00000013
      mov cr0,eax
      mov ax,0010
      mov ds,ax
      pop [00090120]
      pop [0009011E]
      pop [0009011C]
      popd [000900FC]
      popd [000900F8]
      pop [00090126]
      mov [00090118],sp
      mov es,ax
      mov ss,ax
      mov sp,FFFF
      sti
      jmps 0050:012B
:000d mov [00090100],ebx
      mov [00090104],ecx
      mov [00090108],edx
      mov [0009010C],ebp
      mov [00090110],esi
      mov [00090114],edi
      or [00090127],01
      xor eax,eax
      mov ax,[000900FA]
      shl eax,04
      add ax,[000900F8]
      mov [00090010],eax
      mov eax,00000400
      mov dr7,eax
      jmp 0103
:000e push ebp ;legge settori del floppy************
      mov ebp,esp
      and [ebp+08],FE
      pop ebp
      push esi
      push edi
      push ecx
      push dx
      push ds
      push ax
      push cx
      mov ax,0000
      mov ds,ax
      xor edi,edi
      mov di,bx          ;destinazione dati
      mov esi,[0009000C]
      mov al,ch          ;cilindri
      shl ax,01
      shr dx,08          ;testina
      add ax,dx
      mov cx,0012
      mul cx
      pop cx
      mov ch,00
      dec cl             ;settori
      add ax,cx
      shl eax,09
      add esi,eax        ;inizio dati da spostare
      pop ax
      xor ecx,ecx
      mov cl,al
      shl ecx,07         ;totale bytes
      repz
      movsd
      mov ah,00
      pop ds
      pop dx
      pop ecx
      pop edi
      pop esi
      iret
:000f cli ;esecuzione in modo reale***************
      lidt [00010009]
      mov eax,00000010
      mov cr0,eax
      mov ax,0000
      mov ds,ax
      mov es,ax
      mov ss,ax
      sti
      jmps 9000:0131
:0010 mov ax,0003
      int 10
      jmps 0000:7C00
:0011 cli ;int 17***********************
      mov [0000048E],FF
      mov al,20
      out 20,al
      sti
      iretd
jmpf 0008:001E
:0000 mov esi,[00090008] ;inizio codice*********************
      lea edi,00010600
      mov cx,0001
:0101 mov ax,0080
      mov [00010214],ax
      mov [00010218],edi
      mov [0001021C],esi
      callf 0008:000D    ;carica le definizioni
      add esi,00010000
      add di,0080
      loop 0101
      mov esi,[0009000C]
      mov edi,[00090028]
      mov cx,0001
:0102 mov ax,0080
      mov [00010214],ax
      mov [00010218],edi
      mov [0001021C],esi
      callf 0008:000D    ;carica il sistema
      add esi,00010000
      add di,0080
      loop 0102
      mov esi,[0009000C] ;settore di avvio
      mov edi,[00090010]
      mov ecx,00000200
      repz
      movsd
      mov eax,90000128
      mov [00000004],eax ;int 01 modo reale
      mov eax,00500003
      mov [00010018],eax ;int 01 modo prot.
      mov eax,00500134
      mov [000103C0],eax ;int 76 modo prot.
      mov [000103C8],eax ;int 77 modo prot.
      mov eax,9000012E
      mov [000003FC],eax ;int ff legge settori del floppy
      mov esi,[00090014]
      mov eax,[00090004]
      sub eax,[0009002C]
      mov [esi+F4],eax
      mov [esi],1C       ;inizio buffer
      inc si
      mov [00090014],esi
:0104 mov ebp,[00090010] ;decodifica istruzione************
      mov esi,[00090014]
      mov edi,[00090008]
      mov [esi],34
      inc esi
      mov eax,ebp
      mov cx,0004
      call 0001
      mov [esi],3739
      add esi,00000002
      mov bx,0000
      mov dx,0000
:0105 mov ah,00
      mov al,[ebp+00]    ;prefisso istruzione
      inc ebp
      cmp al,66
      jnz 0106
      mov bh,01
      jmp 0105
:0106 cmp al,67
      jnz 0107
      mov bl,01
      jmp 0105
:0107 cmp al,F0          ;lock
      jnz 0108
      mov eax,252E1826
      mov [esi],eax
      mov [esi+04],39
      add esi,00000005
      jmp 0105
:0108 cmp al,F2          ;repz
      jnz 0109
      mov eax,2C191213
      mov [esi],eax
      mov [esi+04],39
      add esi,00000005
      jmp 0105
:0109 cmp al,F3          ;repnz
      jnz 010A
      mov eax,31191213
      mov [esi],eax
      mov [esi+04],392C
      add esi,00000006
      jmp 0105
:010a cmp al,26          ;es
      jnz 010B
      mov dx,1F12
      jmp 0105
:010b cmp al,2E          ;cs
      jnz 010C
      mov dx,1F2E
      jmp 0105
:010c cmp al,36          ;ss
      jnz 010D
      mov dx,1F1F
      jmp 0105
:010d cmp al,3E          ;ds
      jnz 010E
      mov dx,1F20
      jmp 0105
:010e cmp al,64          ;fs
      jnz 010F
      mov dx,1F21
      jmp 0105
:010f cmp al,65          ;gs
      jnz 0110
      mov dx,1F22
      jmp 0105
:0110 mov [0009001C],al  ;opcode
      shl ax,04
      add di,ax
:0112 mov al,[edi]       ;istruzione modo
      cmp al,00
      jz 0111
      mov [esi],al
      inc esi
      inc di
      jmp 0112
:0111 inc di
      mov al,[edi]
      cmp al,00
      jz 0113
      cmp al,FF
      jz 0114
      cmp al,FE
      jz 0115
      cmp al,FD
      jz 0116
      cmp al,FC
      jz 0117
      cmp al,FB
      jz 0118
      cmp al,FA
      jz 0119
      cmp al,F9
      jz 011A
      cmp al,F8
      jz 011B
      cmp al,F7
      jz 011C
      jmp 011D
:0114 mov al,[ebp+00]    ;numero 8bit
      inc ebp
      mov cx,0001
      call 0001
      jmp 0111
:0115 cmp bh,01          ;numero 16bit
      jz 0138
      mov ax,[ebp+00]
      add ebp,00000002
      mov cx,0002
      call 0001
      jmp 0111
:0138 mov eax,[ebp+00]
      add ebp,00000004
      mov cx,0004
      call 0001
      jmp 0111
:0116 mov [esi],35       ;virgola
      inc esi
      jmp 0111
:0117 cmp bh,00          ;doppia word
      jz 0111
      mov [esi],1120
      add esi,00000002
      jmp 0111
:0118 xor ax,ax          ;salto relativo 8bit
      mov al,[ebp+00]
      add al,02
      cmp al,80
      jb 0133
      mov ah,FF
:0133 dec bp
      add ax,bp
      mov cx,0002
      call 0001
      jmp 0111
:0119 mov ax,[ebp+02]    ;call far
      mov cx,0002
      call 0001
      mov [esi],34
      inc esi
      mov ax,[ebp+00]
      add ebp,00000004
      mov cx,0002
      call 0001
      jmp 0111
:011a mov [esi],261E     ;al
      add esi,00000002
      jmp 0111
:011b mov ax,[ebp+00]    ;salto relativo 16bit
      add ax,0003
      dec ebp
      add ax,bp
      mov cx,0002
      call 0001
      jmp 0111
:011c mov eax,00000403   ;int xx
      mov dr7,eax
      mov eax,ebp
      mov dr0,eax
      jmp 0111
:011d mov al,[ebp+00]    ;istruzione mem/reg
      mov [0009001D],al
      inc ebp
:011e xor ax,ax
      mov al,[edi]
      shl ax,08
      inc di
      mov [0009001E],di
      mov [00090020],dx
      cmp [edi],01
      jz 011F
      cmp [edi],02
      jz 0120
      cmp [edi],03
      jz 0121
      cmp [edi],04
      jz 0122
      cmp [edi],05
      jz 0123
      cmp [edi],06
      jz 0124
      cmp [edi],07
      jz 0125
:011f mov di,ax          ;indirizzo di memoria
      mov ah,00
      mov al,[0009001D]
      shr al,06
      shl ax,07
      add di,ax
      mov ah,00
      mov al,[0009001D]
      mov cx,0008
      mov dx,0000
      div cx
      shl dl,04
      add di,dx
      mov al,[0009001D]
      cmp al,C0
      jb 0135
      cmp bh,00          ;66
      jz 0126
      add di,0200
      jmp 0126
:0135 cmp bl,00          ;67
      jz 0126
      add di,0400
      jmp 0126
:0120 mov di,ax          ;indirizzo di registro
      add di,0180
      mov ah,00
      mov al,[0009001D]
      mov cx,0040
      mov dx,0000
      div cx
      shr dl,03
      shl dl,04
      add di,dx
      cmp bh,00          ;66
      jz 0126
      add di,0200
      jmp 0126
:0121 mov di,ax          ;indirizzo in ax
      add di,0180
      dec ebp
      cmp bh,00          ;66
      jz 0126
      add di,0200
      jmp 0126
:0122 mov di,ax          ;indirizzo in un registro
      add di,0180
      mov ah,00
      mov al,[0009001C]
      mov cx,0008
      mov dx,0000
      div cx
      shl dl,04
      add di,dx
      dec ebp
      cmp bh,00          ;66
      jz 0126
      add di,0200
      jmp 0126
:0123 mov ax,[edi+01]    ;sposta la tabella
      mov di,ax
      mov ah,00
      mov al,[0009001D]
      mov cx,0040
      mov dx,0000
      div cx
      shr dl,03
      shl dl,04
      add di,dx
      dec ebp
      mov dx,[00090020]
      jmp 0112
:0124 mov [0009001D],06  ;indirizzo in al,[0000]
      dec ebp
      inc di
      jmp 011E
:0125 mov di,ax          ;tabella 0f
      mov ah,00
      mov al,[ebp+FF]
      mov [0009001C],al
      shl ax,04
      add di,ax
      mov dx,[00090020]
      jmp 0112
:0126 mov al,[edi]       ;rotazione blocco
      inc di
      cmp al,00
      jz 0127
      cmp al,FF
      jz 0128
      cmp al,FE
      jz 0129
      cmp al,2A
      jz 012A
      mov [esi],al
      inc esi
      jmp 0126
:012a mov dx,[00090020]  ;registro di segmento
      cmp dx,0000
      jz 0136
      mov [esi],dx
      add esi,00000002
:0136 mov [esi],al
      inc esi
      jmp 0126
:0128 mov al,[ebp+00]    ;numero 8bit
      inc ebp
      mov cx,0001
      call 0001
      jmp 0126
:0129 cmp bl,01          ;numero 16bit
      jz 0137
      mov ax,[ebp+00]
      add ebp,00000002
      mov cx,0002
      call 0001
      jmp 0126
:0137 mov eax,[ebp+00]
      add ebp,00000004
      mov cx,0004
      call 0001
      jmp 0126
:0127 mov dx,[00090020]  ;fine blocco
      mov di,[0009001E]
:012b inc di
      mov al,[edi]
      cmp al,00
      jz 0113
      cmp al,FF
      jz 012C
      cmp al,FE
      jz 012D
      cmp al,FD
      jz 012E
      cmp al,FC
      jz 012F
      cmp al,FB
      jz 0130
      cmp al,FA
      jz 0131
      cmp al,F9
      jz 0132
      jmp 011E
:012c mov al,[ebp+00]    ;numero 8bit
      inc ebp
      mov cx,0001
      call 0001
      jmp 012B
:012d cmp bh,01          ;numero 16bit
      jz 0134
      mov ax,[ebp+00]
      add ebp,00000002
      mov cx,0002
      call 0001
      jmp 012B
:0134 mov eax,[ebp+00]
      add ebp,00000004
      mov cx,0004
      call 0001
      jmp 012B
:012e mov [esi],35       ;virgola
      inc esi
      jmp 012B
:012f cmp bh,00          ;doppia word
      jz 012B
      mov [esi],1120
      add esi,00000002
      jmp 012B
:0130 mov [esi],4F52     ;01
      add esi,00000002
      jmp 012B
:0131 mov [esi],262E     ;cl
      add esi,00000002
      jmp 012B
:0132 mov [esi],2D20     ;dx
      add esi,00000002
      jmp 012B
:0113 mov eax,[0009002C] ;fine istruzione++++++++++++++++++
      cmp eax,[00090004]
      jb 0139
      mov [esi],1C
      inc esi
      mov [00090014],esi
:0139 cmp [00090003],01
      jz 000B
      cmp [00090003],02
      jz 000F
:0103 decd [00090004]
      jnz 0104
      call 0003          ;stampa i registri
:0100
jmpf 0008:001E
      


Introduzione alla programmazione in "Assembler"
invia E-mail