lunedì 19 settembre 2011

debugging kernel XP with bochs

A differenza delle vmachine vmware, virtual pc e virtual box che hanno gli stessi indirizzi di memoria sia in kernel-mode emulato che in user-mode, bochs ha indirizza diversi (di pochi kb di offset rispetto a quelli reali e emulati) perchè è un traduttore mentre gli altri hanno virtual-driver e virtual-monitor che sono veri e propri driver che lavorano e ring 0 e che traducono call potenzialmente pericolose che implicano ad esempio il registro cr3 etc... di conseguenza essendo quasi 1:1 gli address reali e virtuali combaciano


allora in bochs dopo che hai caricato il S.O. e sei arrivato in modalità protetta (puoi vedere anche il salto da real mode a protct mode mettendo un breakpoint con vb 0x58:0x0000000000001c46, si blocchera poco prima del salto su segment 0x8)
per vedere i segmenti e la GDT e IDT fai sreg

bochs ha uno stub all'interno del client gdb (solo le parti essenziali, quindi i cimandi sono identici a gdb) e per vedere KPCR del kernel XP fai:

x /14xw 0xffdff000 (0xffdff000 sarebbe l'inizio della struttura KPCR mentre 14 sarebbe l'offset di KPCR->KdVersionBlock
ora l'indirizzo nel mio caso di KdVersionBlock è 0x80544cb8
ottenuto KdVersionBlock cioe 0x80544cb8 dobbiamo andare sulla struttura _DBGKD_GET_VERSION64 a cui punta

ora si deve fare x /10xw 0x80544cb8

risultato:
0x0000000080544cb8 <bogus>: 0x0a28000f 0x00020006 0x030c014c 0x0000002d</bogus>
0x0000000080544cc8 <bogus>: 0x804d7000 0xffffffff 0x805531a0 0xffffffff</bogus>
0x0000000080544cd8 <bogus>: 0x80675df4 0xffffffff</bogus>

0x804d7000
0x805531a0
0x80675df4


LISTE DOUBLE LINKATE:
x /14xw 0x805531a0

0x00000000805531a0 <bogus>: 0x821fc3a8 0x821ed9b0 0x00000000 0x00000000</bogus>

0x821fc3a8
0x821ed9b0

INFO DEL PRIMO MODULO CARICATO CIOE NTOSKRNL:

x /12xw 0x821fc3a8
-flink- -blink-
0x00000000821fc3a8 <bogus>: 0x821fc340 0x805531a0 0x00000000 0x00000000</bogus>
0x00000000821fc3b8 <bogus>: 0x00000000 0x00000000 0x804d7000
0x00000000821fc3c8 <bogus>: 0x001f7100 0x003c003c 0xe1000008 0x00180018</bogus>


l'entry point di NTOSKRNL si trova all'address 0x8068d6dc che in nome symbolico è nt!KiSystemStartup


0x8068d6dc
u 0x8068d6dc 0x8068d6dc + 100
8068d6dc: ( ): push ebp ; 55
</bogus>

Nessun commento:

Posta un commento