windows - Henter BSOD-tekst fra VM

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan ville du hente BSOD-teksten fra en virtualbox vm ??


Da BSOD er ​​tekst, skal den opbevares i VM 's hukommelsesrum et eller andet sted og sandsynligvis et sted, der er veldefineret.


Jeg har flere VM'er, der er konfigureret til at stoppe på blå skærme frem for genstart, og kode er på plads for at tage skærmbilleder med jævne mellemrum.


På dette tidspunkt er min plan at skelne mellem to billeder, hvis der ikke er nogen forskel (dvs. der har ikke været nogen ændringer på skærmen) og pixels i de 4 hjørner er alle blå (og den rigtige blå), så forsøger vi ekstraktion af BSOD tekst, søg teksten til ' * STOP:' sekvensen for at bekræfte den som en BSOD.


Jeg skrånede oprindeligt på en hurtig og beskidt OCR-løsning for at udtrække tekst fra selve billedet, men hvis vi forholdsvis nemt kan hente det fra hukommelsen, ville vi fjerne muligheden for OCR-fejl.


Jeg har gennemgået manualen og API-referencen og haven ikke set noget, der umiddelbart synes at finde anvendelse.


Er det muligt at få adgang til gæstens hukommelse fra Virtual Box-værten og hente BSOD-teksten direkte fra hukommelsen?


UPDATE


Bare for at afklare, har jeg overvejet 4 forskellige muligheder på dette tidspunkt


1) Reverse engineering windows debug protokol og bygge mindst en grundlæggende debugger at lytte på vm s seriel port



  • Kræver omvendt ingeniør seriel protokol, mistanke om, at dette ville give en hel del vanskeligheder



2) Reverse engineering den gemte tilstandsfil med Virtualbox og ekstraherer teksten fra VESA-hukommelsesområdet, som jeg formoder, er gemt i den pågældende fil efter at have gemt VM'en på BSOD'en



  • Jeg har ikke kunnet finde dokumentation på dette filformat uden for selve kildekoden.



3) Kører OCR på outputbilledet hentet ved hjælp af API



  • Dette kan være den bedste vej at gå, kræver bygning eller opstilling og træning af en ocr-løsning af en slags uden for min erfaring. Kan være relativt simpelt at gøre, konstant bredde skrifttype/rent billede, kun to farver til at håndtere



4) Få adgang til gæstens hukommelse direkte ved hjælp af enten et API-opkald eller ved at oprette en udvidelse for at få adgang til/udsætte den på en eller anden måde



  • Som det er påpeget af Warren, synes det ikke at være et API for at få adgang til hukommelsen, kan det være muligt at skrive en udvidelse for at afsløre vm'ens hukommelse på en eller anden måde, men ville kræve forståelse af Virtualbox-internals.



Dette kører på Solaris-værter, og nogle kan kun have en Windows vm tilgængelig, der muligvis ikke starter. Denne VM kan være nogen relativt nyere version af Windows (XP, 2003, 2003 R2, 2008, Vista, 2008 R2). Jeg kan gyde et vilkårligt antal Linux-baserede VM'er, men jeg kan ikke gyde flere Windows VM'er på grund af licensproblemer. Min tankegang på dette punkt har været at hente det direkte fra gæsterne, at hukommelsen ville være den nemmeste at gennemføre, måske er jeg fejl i det, og en af ​​ovennævnte metoder eller en, jeg har tænkt på, ville være lettere at gennemføre

Bedste reference


Hvis du forsøger bare at få oplysningerne, hvorfor ikke bare aktivere kernefejlfinding og udsætte det over en af ​​de virtuelle serielle porte? Jeg mener, at du skal kunne bruge enten Debugging Tools for Windows (WinDbg) eller Kernel Debugger (KD) over en I/O-port. Det eneste unikke krav, fordi dette er en VM, er, at den virtuelle seriel port skal mappes til et navngivet rør på værten, og så skal debuggeren på værten (eller anden VM siden din vært ikke Windows) være konfigureret til at kommunikere over det rør. Dine kommandoer ville se sådan ud:


windbg -k com:port=\.pipe<pipe\_name>,pipe

kd -k com:port=\.pipe<pipe\_name>,pipe


Der er et stort blogindlæg af den legendariske Mark Russinovich, der beskriver, hvordan han brugte debuggeren til at ændre farverne på BSOD-skærmen. Forhåbentlig vil det give dig nogle yderligere indsigt i at bruge værktøjerne såvel som indsnævring af feltet og komme dig til det rigtige område for at udtrække den information, du leder efter.


Her er nogle referencer, der hjælper dig med at komme i gang:



  • KB Artikel 151981: Sådan opsættes en fjernfejlfinding med et nullmodemkabel

    http://support.microsoft.com/kb/151981[3]

  • En Bluescreen af ​​enhver anden farve

    http://blogs.technet.com/b/markrussinovich/archive/2010/12/14/3374820.aspx[4]

  • Fejlfindingsværktøjer til Windows

    http://msdn.microsoft.com/en-us/windows/hardware/gg463009[5]


Andre referencer 1


Det er muligt at udvinde gæstens (virtuelle) fysiske hukommelse ved hjælp af VBoxManage og en debugger.


VBoxManage debugvm TestVm dumpguestcore --filename guest.dump
gdb --core guest.dump
# dump memory [phys-mem-file] 0x0 [size vm-memory]


Bagefter kan man søge i hukommelsesdumpen for strengindhold.


Se også: http://www.halfdog.net/Misc/TipsAndTricks/VirtualBox.html#ExtractGuestPhysicalMemory[6]