/
keylog.go
93 lines (82 loc) · 1.91 KB
/
keylog.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
package main
import (
"os"
"github.com/Hundemeier/key2sACN/keylogger"
)
//KeyEvent is an abstract event for storing the events information
//If Value is 1 then this is a DOWN event, 0 is UP and 2 is REPEATED
type KeyEvent struct {
KeyboardID int
KeyCode uint16
Value int32
}
//listening stores wether or not on a given device id is being listened
var listening = make(map[int]bool)
var keylogs = make([]*keylogger.KeyLogger, 0)
func initKeylogger(conf config) {
//get all devices and then try to start as man y as possible according to the listener list
devs, err := keylogger.NewDevices()
if err != nil {
logErr(err)
os.Exit(-1)
}
for id, listen := range conf.Listening {
if listen {
for _, dev := range devs {
if dev.Id == id {
startKeylogger(dev, keyChan)
break
}
}
}
}
}
func startKeylogger(device *keylogger.InputDevice, ch chan KeyEvent) (err error) {
rd := keylogger.NewKeyLogger(device)
keylogs = append(keylogs, rd)
in, err := rd.Read()
if err != nil {
return
}
//only start if we do not have already a listener
if !listening[device.Id] {
//function that formattes to the formatted channel
go func() {
listening[device.Id] = true
for i := range in {
if i.Type == keylogger.EV_KEY {
event := KeyEvent{
KeyboardID: device.Id,
KeyCode: i.Code,
Value: i.Value,
}
ch <- event
setEvent(KEY_EVENT, "", event)
}
}
listening[device.Id] = false
//delete from list of keyloggers
deleteKeylogger(rd)
}()
}
return
}
func stopKeylogger(deviceID int) {
for _, logger := range keylogs {
if logger.Dev.Id == deviceID {
logger.Stop()
}
}
}
func deleteKeylogger(logger *keylogger.KeyLogger) {
for i, log := range keylogs {
if log == logger {
//delete:
if i == len(keylogs)-1 {
keylogs = keylogs[:len(keylogs)]
} else {
keylogs = append(keylogs[:i], keylogs[i+1:]...)
}
}
}
}