COMPILER & CODE ANALYSE. Eine Einführung in die Code Analyse auf Grundlage von Compilern und deren Optimierung. 1



Ähnliche Dokumente
1 ÜBERSETZER. Compilerbau 1

Mikrocomputertechnik. Adressierungsarten

Excel Funktionen durch eigene Funktionen erweitern.

Karlsruher Institut für Technologie

Technische Informatik 2 Adressierungsarten

Java Kurs für Anfänger Einheit 5 Methoden

Wer in der Grundschule ein wenig aufgepasst hat, sollte in der Lage sein schriftlich eine Zahl durch eine zweite zu teilen.

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Tutorium Informatik 1. Aufgabe 2: Formatierte Ein- und Ausgabe

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Grammatiken. Einführung

Professionelle Seminare im Bereich MS-Office

THEMA: "SAS STORED PROCESSES - SCHNELL GEZAUBERT" HELENE SCHMITZ

Einführung in die Java- Programmierung

Übung Theoretische Grundlagen

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Einführung in die Programmierung Laborübung bei Korcan Y. Kirkici. 12.Übung bis

Programmierung für Mathematik (HS13)

Import SIMATIC-Variablen

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Version 0.3. Installation von MinGW und Eclipse CDT

Objektorientierte Programmierung

Deklarationen in C. Prof. Dr. Margarita Esponda

Java: Vererbung. Teil 3: super()

Zählen von Objekten einer bestimmten Klasse

Übungen Programmieren 1 Felix Rohrer. Übungen

Grundlagen von Python

YouTube: Video-Untertitel übersetzen

Datensicherung und Wiederherstellung

PCC Outlook Integration Installationsleitfaden

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

5. Tutorium zu Programmieren

Einführung zum MS Visual Studio

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Wir machen neue Politik für Baden-Württemberg

Was ist ein Compiler?

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Windows 7 - Whoami. Whoami liefert Informationen wie z.b. die SID, Anmelde-ID eines Users, sowie Gruppenzuordnungen, Berechtigungen und Attribute.

I.1 Die Parrot Assemblersprache

Interaktive Medien Richtlinien für das Codieren Version vom 18. Juni 2014

Einführung in die technische Informatik

Grundbegriffe der Informatik

Tutorium Rechnerorganisation

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Anti-Botnet-Beratungszentrum. Windows XP in fünf Schritten absichern

Was meinen die Leute eigentlich mit: Grexit?

Einführung in die Programmierung

Arbeiten mit dem Outlook Add-In

Installation OMNIKEY 3121 USB

Artikel Schnittstelle über CSV

Windows 7 32 Bit (x32) Windows 7 64 Bit (x64)

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

SEMINAR Modifikation für die Nutzung des Community Builders

Sin-Funktion vgl. Cos-Funktion

Leitfaden Internet-Redaktion kursana.de

Die Programmiersprache C99: Zusammenfassung

BEISPIELKLAUSUR Softwareentwicklung:

Die Post hat eine Umfrage gemacht

S7-Hantierungsbausteine für R355, R6000 und R2700

Programmierung in C. Grundlagen. Stefan Kallerhoff

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

How-to: Webserver NAT. Securepoint Security System Version 2007nx

Erstellen einer digitalen Signatur für Adobe-Formulare

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Übungen zu C++ Kapitel 1

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Whitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager -rückläufer Script. combit GmbH Untere Laube Konstanz

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Impulse Inklusion Selbst-bestimmtes Wohnen und Nachbarschaft

Kapitel 3 Frames Seite 1

Übung 9 - Lösungsvorschlag

Proxy. Krishna Tateneni Übersetzer: Stefan Winter

BEDIENUNG ABADISCOVER

teamsync Kurzanleitung

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

SDD System Design Document

Applet Firewall und Freigabe der Objekte

Einführung zum Arbeiten mit Microsoft Visual C Express Edition

IT-Basics 2. DI Gerhard Fließ

Softwaretechnik Teil Webprogrammierung (HTML, PHP) SS2011

Mit der RoeTest-Software können Barcodes wie folgt erstellt werden:

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Mediator 9 - Lernprogramm

Einstellungen für SEPA-Lastschriften in der VR-NetWorld-Software

Updatehinweise für die Version forma 5.5.5

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Statuten in leichter Sprache

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Mächtigkeit von WHILE-Programmen

FlowFact Alle Versionen

Testen mit JUnit. Motivation

IntelliRestore Seedload und Notfallwiederherstellung

Die Wirtschaftskrise aus Sicht der Kinder

Datentypen: Enum, Array, Struct, Union

Step by Step Webserver unter Windows Server von Christian Bartl

Transkript:

1 COMPILER & CODE ANALYSE Eine Einführung in die Code Analyse auf Grundlage von Compilern und deren Optimierung. 1

INHALT Einleitung Werkzeuge Compiler Aufbau Optimierung Beispiel Code Analyse Einführung Erklärung Beispiele IDA Pro The Interactive Disassembler Einführung Beispiel 2

EINLEITUNG Benötigtes Vorwissen Rechnerstruktur Befehlssatz Register Compiler Optimierung / Code Veränderung Code Analyse Sprachkonstrukte wiedererkennen Programmsicherheit überprüfen 3

VERWENDETE WERKZEUGE UND PROGRAMME Visual Studio 2005 http://msdn.microsoft.com/vstudio MASM32 http://www.codingcrew.de/masm32 OllyDbg http://www.ollydbg.de IDA Pro http://www.datarescue.com Windasm http://www.google.de 4

COMPILER Compiler = Übersetzer Quellsprache => Zielsprache überprüfen der Syntax Optimierung 5

COMPILER AUFBAU 6

COMPILER FRONT-END Analysephase Quellcode Lexikalische Analyse Scanner Sieber Syntaktische Analyse Parser Semantische Analyse Automaten Optimierung 7

COMPILER FRONT-END LEXIKALISCHE ANALYSE Scanner lesen des Quellcodes erzeugt eine Symbolfolge (Token) Sieber lesen der Symbolfolge analysieren erkennen entfernen von Kommentaren, Leerzeichen etc. 8

COMPILER FRONT-END SYNTAKTISCHE ANALYSE Parser Symbolfolge (Token) überprüfen Ausgabe in einen Syntaxbaum Top-Down-Parser Bottom-Up-Parser 9

COMPILER FRONT-END SEMANTISCHE ANALYSE attributieren des Syntaxbaumes Kontextsensitive Korrektheit Typisierte Variablen (type-checking) Symboltabelle 10

COMPILER BACK-END Synthesephase Zwischencodeerzeugung Optimierung Code-Generator Optimierung 11

COMPILER BACK-END ZWISCHENCODE Erzeugung Pseudosprache Plattform / Maschinenunabhängig Optimierung Plattform- / Maschinenunabhängig Schleifen Optimierungen Datenfluss Optimierungen 12

COMPILER BACK-END CODE-GENERATOR Erzeugung Zielsprache Plattformabhängig Optimierung Plattform- / Maschinenabhängig Register Zuweisungen Operationsumwandlungen 13

COMPILER OPTIMIERUNG Verbessern des erzeugten Codes Größe verkleinern Geschwindigkeit verbessern Unterschiedliche Anwendungsgebiete Optimierung Verschiedene Ansatzpunkt Strategien Auswahl des Optimierungsgrades 14

COMPILER OPTIMIERUNG ANSÄTE 15

COMPILER OPTIMIERUNG STRATEGIEN (1) Datenfluss Optimierung Konstanten Faltung Konstanten Verbreitung Schleifen Optimierung Loop unrolling/unfolding Loop fusion/fission Code-Generator Optimierung Toten Code eliminieren Stärke Reduktion 16

COMPILER BEISPIEL (1) Quellcode Stream Scanner var a,b : int; a := 2; b := a * a + 1; var a,b : int; NL a := 2; NL b := a * a + 1; NL id( var ) sep id( a ) com id( b ) col id(int) sem sep id( a ) bec int( 2 ) sem sep id( b ) bec id( a ) mul id( a ) add int( 1 ) sem sep 17

COMPILER BEISPIEL (2) Sieber id( var ) id( a ) com id( b ) col id(int) sem id( a ) bec int( 2 ) sem id( b ) bec id( a ) mul id( a ) add int( 1 ) sem Syntaxbaum 18

COMPILER BEISPIEL (3) Programmcode mov dword_403000, 2 ; int a mov eax, dword_403000 ; int a imul eax, dword_403000 ; int a add eax, 1 mov dword_403020, eax ; int b Programmcode mit Optimierung mov dword_403000, 2 ; int a mov dword_403020, 5 ; int b 19

CODE ANALYSE Code Analyse ist Kopfsache Code Analyser bzw. Disassembler handeln nach Algorithmen Notwendiges Wissen Programmaufbau Befehlsformat Register 20

CODE ANALYSE GENERELLES Es gibt 2 Hauptarten von Programmen Konsolen Grafische Anwendungen Weitere sind Treiber Dienste Arbeiten direkt über API wird von den meisten Disassemblern erkannt Nutzen Standardbibliotheken wird von den meisten Disassemblern erkannt Nutzen eigene Bibliotheken werden nicht erkannt. 21

sd WndProc Programm Windows WC:WNDClass RegisterClass(wc) loop getmessage()!= null TranslateMessage dispatchmessage WndProc Verarbeitet alle Ereignisse 22

CODE ANALYSE DUMP 23

CODE ANALYSE BEFEHLE Befehlsformat: Quelle: Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2A Präfix Opcode MOD R/M Byte SIB Byte Displacement / Immediate 24

CODE ANALYSE BEFEHLE (1) Präfix lock and repeat Präfixe branch hints Präfixe operand-size override address-size override Präfix MOD R/M Byte Adressierung acht Register und 24 Adressierungsmodi SIB Byte base-plus-index MOV [EAX + 4], EBX scale-plus-index MOV [EAX*4], EBX 25

CODE ANALYSE REGISTER Register 32 Bit EAX = (16 + AX = (AH + AL)) EBX = ---------- ---------- ECX = ---------- ---------- EDX = ---------- ---------- ESP ist der Stackpointer EBP wird für Variablen auf dem Stack verwendet 26

CODE ANALYSE DISASSEMBLIEREN Manuell Disassembliert Original PUSH 0 PUSH 40300Ch PUSH 403000h PUSH 0 CALL 0000001 RETN JMP dword ptr ds:[00402000h] includelib c:\masm32\lib\user32.lib EXTERN MessageBoxA@16:NEAR _DATA SEGMENT TEXT1 DB 'Kein Problem!',0 TEXT2 DB 'Message',0 _DATA ENDS _TEXT SEGMENT START: PUSH OFFSET 0 PUSH OFFSET TEXT2 PUSH OFFSET TEXT1 PUSH 0 CALL MessageBoxA@16 RETN _TEXT ENDS END START 27

CODE ANALYSE DUMP Originaldump 28

CODE ANALYSE PROBLEME DISASSEMBLIEREN / ANALYSIEREN Änderungen am Programmcode verhindern die korrekte Interpretation der Disassembler Datenfelder werden als Befehle interpretiert JMP DWORD PTR [EBX] Versteckte Sprünge Variable hat eine Adresse als Wert 29

CODE ANALYSE REGISTER DB 50/RETN wird als xor al,bl erkannt Routine l1 wird nicht erkannt MOV EBX, OFFSET l1 vor dem ersten Push ermöglicht IDA die Erkennung von l1 IDA weiß, dass es sich um eine leere Routine handelt includelib c:\masm32\lib\user32.lib EXTERN MessageBoxA@16:NEAR ; Data segment _DATA SEGMENT TEXT1 DB 'Kein Problem!',0 TEXT2 DB 'Message',0 _DATA ENDS ; Code segment _TEXT SEGMENT START: PUSH OFFSET START PUSH OFFSET 0 PUSH OFFSET TEXT2 PUSH OFFSET TEXT1 PUSH 0 CALL MessageBoxA@16 POP EDX ADD EDX, l1 - Start CALL EDX RETN DB 50 l1: RETN _TEXT ENDS END START 30

CODE ANALYSE VERSTECKE SPRUNGZIELE JMP DWORD PTR [EBX] EBX zeigt auf eine Speicherstelle, die das Sprungziel enthält JMP EBX EBX enthält die Zieladresse JMP DWORD PTR [lo] der Inhalt von der Variable lo definiert die Adresse 31

CODE ANALYSE VERSTECKE SPRÜNGE(1) Adresse von l2 in mem1 gespeichert erst wir sie in EAX geladen dann auf den Stack geschoben und mit RETN wird nach EAX gesprungen includelib c:\masm32\lib\user32.lib EXTERN MessageBoxA@16:NEAR ; Data segment _DATA SEGMENT mem1 DD OFFSET l2 TEXT1 DB 'Kein Problem!',0 TEXT2 DB 'Message',0 _DATA ENDS ; Code segment _TEXT SEGMENT START: MOV EAX, mem1 PUSH EAX RETN l1: RETN l2: PUSH OFFSET 0 PUSH OFFSET TEXT2 PUSH OFFSET TEXT1 PUSH 0 CALL MessageBoxA@16 RETN _TEXT ENDS END START 32

CODE ANALYSE VERSTECKE SPRÜNGE(2) Adresse wird in EAX geladen 4 Byte werden auf dem Stack reserviert danach die Adresse auf den Stack geschoben und mit RETN wird zu l2 gesprungen includelib c:\masm32\lib\user32.lib EXTERN MessageBoxA@16:NEAR ; Data segment _DATA SEGMENT mem1 DD OFFSET l2 TEXT1 DB 'Kein Problem!',0 TEXT2 DB 'Message',0 _DATA ENDS ; Code segment _TEXT SEGMENT START: MOV EAX, mem1 SUB ESP, 4 MOV DWORD PTR [ESP], EAX RETN l1: RETN l2: PUSH OFFSET 0 PUSH OFFSET TEXT2 PUSH OFFSET TEXT1 PUSH 0 CALL MessageBoxA@16 RETN _TEXT ENDS END START 33

CODE ANALYSE VERSTECKE SPRÜNGE(3) Adresse wird in EAX geladen 4 Byte werden auf den Stack reserviert danach die Adresse auf den Stack geschoben 0x15EB wird AX geschrieben JMP $ - 2 springt 2 Byte zurück zu 15EB, welches im Speicher EB15: EB = JMP short 15 = 21 Byte vor JMP $ - 2 spring zu l1 und mit RETN wird zu l2 gesprungen includelib c:\masm32\lib\user32.lib EXTERN MessageBoxA@16:NEAR ; Data segment _DATA SEGMENT mem1 DD OFFSET l2 TEXT1 DB 'Kein Problem!',0 TEXT2 DB 'Message',0 _DATA ENDS ; Code segment _TEXT SEGMENT START: MOV EAX, mem1 SUB ESP, 4 MOV DWORD PTR [ESP], EAX MOV AX, 015EBH JMP $ - 2 l2: PUSH OFFSET 0 PUSH OFFSET TEXT2 PUSH OFFSET TEXT1 PUSH 0 CALL MessageBoxA@16 RETN l1: RETN _TEXT ENDS END START 34

CODE ANALYSE Daten erkennen Variable: Größe und Typ herausfinden Strings / Arrays Strukturen Programmstruktur erkennen Funktionen Verzweigungen Schleifen Objekte 35

CODE ANALYSE DATEN Globale Variablen werden im Datensegment gehalten Lokale Variablen auf dem Stack oder in Registern Parameter von für Funktionen werde über den Stack übergeben Nicht-Initialisierte Parameter werden ebenfalls im Datensegment gehalten 36

CODE ANALYSE VARIABLEN(1) Größe und Typ herausfinden BYTE b = 0xab; WORD w = 0x1234; DWORD dw = 0x34567890; 37

CODE ANALYSE VARIABLEN(2) WORD w = 0x1234; BYTE b = 0xab; DWORD dw = 0x34567890; 38

CODE ANALYSE VARIABLEN(3) Die Größe kann nicht an Hand der Datenorganisation erkannt werden Sie kann nur an Hand der Befehle erkannt werden: 00401000: C6 05 6E 33 40 00 mov byte ptr ds:[0040336eh],14h 14 00401007: 66 C7 05 6C 33 40 mov word ptr ds:[0040336ch],0ah 00 0A 00 00401010: C7 05 70 33 40 00 mov dword ptr ds:[00403370h],1eh 1E 00 00 00 39

CODE ANALYSE VARIABLEN STRING UND ARRAYS Strings Definiertes Ende Werden mit 0 Terminiert Werden in ASCII oder Unicode Codiert Lokal definierte werden nicht immer Erkannt Arrays Kein Definiertes Ende Datentyp unbekannt Nicht jede Schleife durchläuft das ganze Array Datentyp kann nur über die Befehle identifiziert werden Größe nur mit dem Debugger ermittelbar 40

CODE ANALYSE STRUKTUREN Als globale Variablen Ähnlich eines Arrays, enthält aber unterschiedliche Typen Werden im Programm über das Datensegment angesprochen Wenn sie als globale Variable deklariert sind und an Funktionen übergeben werden, dann werden sie zwar auf den Stack geschoben, aber in der Funktion trotzdem über das Datensegment angesprochen API Strukturen wie WNDClass werden von Disassembler automatisch erkannt. 41

CODE ANALYSE FUNKTIONEN(1) Werden meistens durch Call oder Jump angesprochen Haben meistens einen Prolog PUSH EBP MOV EBP, ESP SUB ESP, N 42

CODE ANALYSE FUNKTIONEN(2) Rückgabe über EAX, ST(0) oder EDX:EAX EAX kann auch der Zeiger auf eine Struktur sein Parameter werden mit Stack übergeben werden mit dem Datensegment übergeben direkt im Programmcode übergeben (nur Assemblerprogrammierer machen so was)... CALL PROC1 DB "Dieser Parameter steht im Code",0... ; Rücksprung Adresse vom Stack holen ; Parameter mit Adresse bestimmen ; Tue was ; Springe zurück RETN 43

CODE ANALYSE VERZWEIGUNGEN(1) Bestehen aus 2 Sprüngen cmp edx, [ebp + 4] jl short loc_40103f... jmp short loc_40104c loc_40103f:... loc_40104c:... retn = if (a < b) {... } else {... } Switch-Anweisungen sind folgen von CMP und Sprungbefehlen 44

CODE ANALYSE SCHLEIFEN Ähnlich Verzweigungen bloß mit Rücksprung Bestehen aus Body Bedingungsprüfung (optional) Zähler Behandlung 45

CODE ANALYSE OBJEKTE Ähnlich den Strukturen Es gibt statische und Dynamische Objekte Beim Aufruf von Klassenmethoden wird die Objekt Referenz mit an die Funktion übergeben 46

IDA PRO EINFÜHRUNG Vorstellung des Programmes 47

IDA PRO BEISPIEL Unoptimierter Graph Optimierter Graph 48

FAZIT (1) Code Analyse nicht trivial erfordert sehr viel Einarbeitungszeit Erfahrung sehr wichtig große Programme oder Probleme schwierig nachzuvollziehen Optimierungen verändern Programm Struktur 49

FAZIT (2) warum kein komplexeres Programm / Beispiel? LAME Optimierung sehr wichtig! ohne: mit: 50

51 ENDE DER PRÄSENTATION