Beste Tweakers,
Ik ben bezig met het schrijven van een memory scanner / disassembler. Ik ben al een aantal maanden bezig en ik ben best een eind. Echter wil ik nu beginnen aan het weergeven van de disassembly. Hier loop ik tegen problemen aan die vooral te maken hebben met de afwegingen tussen verschillende mogelijkheden en de performance daarvan. Ik gebruik de BeaEngine om de disassembly te genereren. Dit gaat perfect, en het ziet er goed uit. Het control is echter het probleem voor me.
Het control moet een tabelweergave zijn, wat ook een textbox mag zijn die met tabs kolommen maakt. Dat doe ik nu in ieder geval. Met een monospaced font werkt dit prima. De eerste kolom weergeeft het adres, de tweede kolom weergeeft de bytes en de laatste kolom de disassembly. Ik heb nu de eerste 100 regels beginnend vanaf het entrypoint van de applicatie, maar aangezien ik een runtime disassembler maak, loop ik tegen het feit dat ik dynamisch moet kunnen scrollen door vrijwel de gehele address space van het proces. Ik vraag me af wat nu een goede oplossing zou kunnen zijn om dit op een goede maar ook stabiele en efficiente manier te realiseren.
Ik heb zelf een aantal ideeën die voordelen en nadelen hebben, maar ik kan me niet voorstellen dat er alsnog een betere oplossing is:
Ik ben bezig met het schrijven van een memory scanner / disassembler. Ik ben al een aantal maanden bezig en ik ben best een eind. Echter wil ik nu beginnen aan het weergeven van de disassembly. Hier loop ik tegen problemen aan die vooral te maken hebben met de afwegingen tussen verschillende mogelijkheden en de performance daarvan. Ik gebruik de BeaEngine om de disassembly te genereren. Dit gaat perfect, en het ziet er goed uit. Het control is echter het probleem voor me.
Het control moet een tabelweergave zijn, wat ook een textbox mag zijn die met tabs kolommen maakt. Dat doe ik nu in ieder geval. Met een monospaced font werkt dit prima. De eerste kolom weergeeft het adres, de tweede kolom weergeeft de bytes en de laatste kolom de disassembly. Ik heb nu de eerste 100 regels beginnend vanaf het entrypoint van de applicatie, maar aangezien ik een runtime disassembler maak, loop ik tegen het feit dat ik dynamisch moet kunnen scrollen door vrijwel de gehele address space van het proces. Ik vraag me af wat nu een goede oplossing zou kunnen zijn om dit op een goede maar ook stabiele en efficiente manier te realiseren.
Ik heb zelf een aantal ideeën die voordelen en nadelen hebben, maar ik kan me niet voorstellen dat er alsnog een betere oplossing is:
- Ik lees de totale executable file die ik wil gaan disassemblen uit het geheugen en disassemble deze. Of ik hem opsla als tekst (ik gebruik nu een tekstveld met tabjes), of opsla in een lijst, het kost veel geheugen. Lijkt me onnodig;
- Ik lees de totale executable file die ik wil gaan disassemblen uit het geheugen, schrijf deze naar een temp file en lees een klein gedeelte van deze file in en disassemble dat deel. Aangezien ik runtime moet disassemblen kan het zijn dat de gebruiker toevallig in de disassembly van een geladen DLL wil kijken, die dus vervolgens niet naar die file is geschreven. Kwa performance lijkt me dit de beste oplossing;
- Ik pak een adres dat in de view area van mijn control zit (dus binnen het vlak dat de gebruiker ziet) en disassemble een x aantal bytes terug vanaf dat adres, en een x aantal bytes vooruit. Voordeel is dat er weinig geheugen nodig is, je ieder mogelijk adres in de address space kan disassemblen, en er geen temp files nodig zijn. Nadeel: Hoe kom ik erachter in welke memory page het betreffende adres zit. Ik heb als ik het goed wil doen het base address van die betreffende page nodig, aangezien ik nooit precies zal weten hoeveel bytes ik terug moet tellen wil ik ook daadwerkelijk aan het begin van een volledige regel uitkomen. Daarmee wil ik in feite zeggen dat: stel ik heb een regel: mov edi,edi. Ik zal nooit weten wanneer ik bij de eerste byte uit kom. Als ik x bytes terug tel kan het best zijn dat ik in het midden van de regel terecht kom en dan zal de disassembler bij in ieder geval de eerste regel iets weergeven dat er eigenlijk niet hoort.