Forbrug af Windows NT Kernel System Call Trace Session Dumps

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger på en eller anden måde at logge (programmatisk eller til en logfil) hvert systemopkald, som et udvalgt antal processer kalder i et givet tidsrum. Brug af svaret på Er der noget som linux ptrace syscall i Windows? Jeg har været i stand til korrekt at bruge ETW til at spore alle de systemopkald, der kaldes til en etl-fil, som jeg derefter kan oversætte til en XML-fil ved hjælp af tracerpt. Når jeg kigger på XML-filerne og de andre tilgængelige formater, har jeg fundet to hovedproblemer:



  1. Systemopkaldene er angivet i hukommelsesadressen til opkaldet, men jeg kan ikke synes at finde nogen god måde at oversætte disse adresser til navne. Til reference er en prøve systemopkaldsadresse 0xFFFFF80002AC22BC.

  2. Alle proces-id'erne er indstillet til 0xFFFFFFFF, men det ser ud til, at systemopkaldene logges for alle processer, ikke kun processen, der startede sporet. Hvordan skal jeg bestemme, hvilken proces der lavede hvilket systemopkald, eller i hvert fald filtrere til et enkelt eller et udvalg af processer, som jeg vil spore?



Har nogen nogen løsninger på ovenstående problemer, eller endnu bedre, nogle eksempler kode, som kan tage en af ​​disse logfil filformater, der tracerpt kan udgive og sætte det i et menneskeligt læseligt og brugbart format?

Bedste reference


Så jeg tror, ​​efter at have kigget rundt, har jeg kunnet løse disse problemer på en måde, som i det mindste gør det nyttigt (selvom det desværre ikke er nyttigt for mig på grund af andre problemer).



  1. Adresserne er konsekvente, og jeg har en teori om, at disse adresser er en konstant forskydning inde i bibliotekets billede på hukommelsen, så alt du skal gøre er at tage forskellen fra adressen til biblioteket, den tilhører , og det kunne manuelt kortlægge navnet på systemopkaldet, eller du kunne bruge et symboltabell til den eksekverbare til at finde navnet. Ingen af ​​disse er blevet testet af mig, men synes at være vejen at gå efter, når du kigger på det.

  2. For at finde ud af, hvilken proces der foretages systemopkald, når du går igennem logfilen, hvis du indeholder kontekstomskifteroplysninger, ved du hvilken proces der er på hvilken kerne på hvilket tidspunkt og hvert systemopkald indbefatter, hvilken kerne systemopkaldet er forekommer på, så det vil give dig den tråd, der kalder systemopkaldet nøjagtigt.


Andre referencer 1


(1) Biblioteket, der indeholder kernesystemfunktionerne angivet af kernesporeren, lægges ikke på samme sted hver gang systemet genstartes. På en måde kan du løse systemopkaldsadresserne ved at bruge kernel debugger. For eksempel vil ln <address> give give dig navnet på funktionen på <address>. Hvis du skriver lm i kernen på tværs af flere genstarter, vil du bemærke, at modulet 'nt' altid er på en anden placering.


(2) Fra hvad jeg har læst, har du ret om at skulle spore konverteringskonfiguration, men jeg har aldrig faktisk forsøgt at gøre dette.