()
| 34 | var wg sync.WaitGroup |
| 35 | |
| 36 | func main() { |
| 37 | var err error |
| 38 | |
| 39 | // create mutex to avoid program running multiple instances |
| 40 | if _, err = CreateMutex("irmaBinMutex"); err != nil { |
| 41 | logMessage(LOG_ERROR, "Only one instance or irma can be launched") |
| 42 | os.Exit(1) |
| 43 | } |
| 44 | |
| 45 | // clean and exit on CTRL+C |
| 46 | c := make(chan os.Signal, 1) |
| 47 | signal.Notify(c, os.Interrupt) |
| 48 | go func() { |
| 49 | for sig := range c { |
| 50 | fmt.Printf("[INFO] captured %v, stopping irma and exiting..", sig) |
| 51 | exit <- true |
| 52 | } |
| 53 | }() |
| 54 | |
| 55 | // parse arguments |
| 56 | parser := argparse.NewParser("irma", "Incident Response - Minimal Analysis") |
| 57 | pConfigurationFile := parser.String("c", "configuration", &argparse.Options{Required: true, Default: "configuration.yaml", Help: "yaml configuration file"}) |
| 58 | pBuilder := parser.String("b", "builder", &argparse.Options{Required: false, Default: "", Help: "create a standalone launcher executable with packed rules and configuration"}) |
| 59 | pLog := parser.String("o", "outfile", &argparse.Options{Required: false, Default: "", Help: "save log informations inside the specified file path"}) |
| 60 | |
| 61 | err = parser.Parse(os.Args) |
| 62 | if err != nil { |
| 63 | fmt.Print(parser.Usage(err)) |
| 64 | } |
| 65 | |
| 66 | // read configuration file |
| 67 | config.getConfiguration(*pConfigurationFile) |
| 68 | if len(*pBuilder) > 0 { |
| 69 | BuildSFX(config.Yara.Path, config.Yara.Rulesrc4key, config, *pBuilder) |
| 70 | os.Exit(0) |
| 71 | } |
| 72 | |
| 73 | maxFilesizeScan = config.Advancedparameters.MaxScanFilesize |
| 74 | cleanIfFileSizeGreaterThan = config.Advancedparameters.CleanMemoryIfFileGreaterThanSize |
| 75 | defaultScannedFileExtensions = config.Advancedparameters.Extensions |
| 76 | quarantineKey = config.Response.QuarantineRC4Key |
| 77 | |
| 78 | // log inside a file |
| 79 | if len(*pLog) > 0 { |
| 80 | f, err := os.OpenFile(*pLog, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) |
| 81 | if err != nil { |
| 82 | log.Fatal(err) |
| 83 | } |
| 84 | |
| 85 | out := os.Stdout |
| 86 | mw := io.MultiWriter(out, f) |
| 87 | r, w, _ := os.Pipe() |
| 88 | |
| 89 | os.Stdout = w |
| 90 | os.Stderr = w |
| 91 | |
| 92 | go func() { |
| 93 | _, _ = io.Copy(mw, r) |
nothing calls this directly
no test coverage detected