-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmain.go
120 lines (93 loc) · 2.96 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/// 2022 MicroSCOPE Contributors. See LICENSE
package main
import (
_ "embed"
"flag"
"fmt"
"microscope/analysis"
"microscope/formats"
"microscope/heuristics"
"os"
"time"
)
const (
VERSION = "0.0.3-alpha"
)
//go:embed utils/output_template.html
var outputTemplateHTML string
//go:embed utils/output_template.txt
var outputTemplateTXT string
//go:embed utils/peid.txt
var PeIDFileContent string
func binaryOpen(path string) (*os.File, error) {
file, err := os.OpenFile(path, os.O_RDONLY, 0644)
if err != nil {
return nil, err
}
return file, nil
}
func main() {
start := time.Now()
fmt.Println("MicroSCOPE version " + VERSION)
var fileName string
var threshold int
var dimensionsLimit int
var format string
// Flag da passare a linea di comando
defaultFileName := ""
flag.StringVar(&fileName, "f", defaultFileName, "Specifica il nome del file che si vuole analizzare.")
flag.IntVar(&threshold, "t", 150, "Specifica il punteggio minimo sopra cui identificare un file malevolo")
flag.IntVar(&dimensionsLimit, "limit", 1<<32, "Specifica la dimensione massima del file binario da analizzare")
flag.StringVar(&format, "o", "html", "Specifica il formato del file di output dell'analisi (valori possibili html oppure txt)")
flag.Parse()
if fileName == "" {
fmt.Println("Deve essere specificato un file binario da analizzare. Utilizza --f [nome del file] per specificarlo.")
return
}
if threshold < 0 {
fmt.Println("Il valore di threshold non può essere minore di 0.")
return
}
// Apertura del file binario
binaryFile, err := binaryOpen(fileName)
if err != nil {
fmt.Println("Errore nell'apertura del file " + err.Error())
return
}
// Controllo dimensione del file
fi, err := binaryFile.Stat()
if err != nil {
fmt.Println("Impossibile ottenere le dimensioni del file per il seguente motivo: " + err.Error())
return
}
if fi.Size() > int64(dimensionsLimit) {
fmt.Println("Dimensione del file è maggiore del limite consentito.")
return
}
// Controlla se le dimensioni del binario sono minori del più piccolo file eseguibile mai stato creato (97 Byte)
// Fonte: https://archive.ph/w01DO#selection-265.0-265.44
if fi.Size() < 97 {
fmt.Println("Il file è troppo piccolo per poter essere analizzato.")
return
}
// Popola i campi per il file analizzato
fileAnalyzed := formats.FileAnalyzed{}
fileAnalyzed.Name = fi.Name()
fileAnalyzed.Size = fi.Size()
// Imposta alcuni file (peid.txt e l'output template)
analysis.OutputTemplateHTML = outputTemplateHTML
analysis.OutputTemplateTXT = outputTemplateTXT
heuristics.PeIDFileContent = PeIDFileContent
// Creo cartella results
if _, err := os.Stat("./results"); os.IsNotExist(err) {
os.Mkdir("./results", 0755)
}
// Ottengo il formato
fileAnalyzed.OutputFormat = format
fileAnalyzed.Threshold = threshold
// Inizia l'analisi
analysis.StartAnalysis(binaryFile, &fileAnalyzed)
defer binaryFile.Close()
// Stampa report finale
fmt.Printf("Tempo di esecuzione: %s\n", time.Since(start))
}