diff --git a/js/init.go b/js/init.go index 0a21fab4..1b49fee8 100644 --- a/js/init.go +++ b/js/init.go @@ -35,4 +35,6 @@ func init() { plugin.Defines["httpRequest"] = httpRequest plugin.Defines["http"] = httpPackage{} + + plugin.Defines["random"] = randomPackage{} } diff --git a/js/random.go b/js/random.go new file mode 100644 index 00000000..1ff0412f --- /dev/null +++ b/js/random.go @@ -0,0 +1,26 @@ +package js + +import ( + "math/rand" + "net" + "github.com/bettercap/bettercap/network" +) + +type randomPackage struct { +} + +func (c randomPackage) String(size int, charset string) string { + runes := []rune(charset) + nrunes := len(runes) + buf := make([]rune, size) + for i := range buf { + buf[i] = runes[rand.Intn(nrunes)] + } + return string(buf) +} + +func (c randomPackage) Mac() string { + hw := make([]byte, 6) + rand.Read(hw) + return network.NormalizeMac(net.HardwareAddr(hw).String()) +} \ No newline at end of file diff --git a/modules/ticker/ticker.go b/modules/ticker/ticker.go index 3edaafc3..3a26d20b 100644 --- a/modules/ticker/ticker.go +++ b/modules/ticker/ticker.go @@ -72,6 +72,8 @@ func (mod *Ticker) Configure() error { return nil } +type TickEvent struct {} + func (mod *Ticker) Start() error { if err := mod.Configure(); err != nil { return err @@ -85,6 +87,8 @@ func (mod *Ticker) Start() error { break } + session.I.Events.Add("tick", TickEvent{}) + for _, cmd := range mod.Commands { if err := mod.Session.Run(cmd); err != nil { mod.Error("%s", err) diff --git a/modules/wifi/wifi_recon.go b/modules/wifi/wifi_recon.go index 2bc58343..0288f93c 100644 --- a/modules/wifi/wifi_recon.go +++ b/modules/wifi/wifi_recon.go @@ -105,7 +105,7 @@ func (mod *WiFiModule) startProbing(staMac net.HardwareAddr, ssid string) error } } - mod.Info("sent probe frames") + mod.Debug("sent probe frames") return nil } diff --git a/session/script_builtin_runtime.go b/session/script_builtin_runtime.go index 40e1d8e1..48eb50c3 100644 --- a/session/script_builtin_runtime.go +++ b/session/script_builtin_runtime.go @@ -1,6 +1,8 @@ package session import ( + "encoding/json" + "github.com/bettercap/bettercap/js" "github.com/evilsocket/islazy/log" "github.com/robertkrimen/otto" @@ -56,9 +58,18 @@ func jsOnEventFunc(call otto.FunctionCall) otto.Value { for event := range listener { if expr == "" || event.Tag == expr { + // some objects don't do well with js, so convert them to a generic map + // before passing them to the callback + var opaque interface{} + if raw, err := json.Marshal(event); err != nil { + I.Events.Log(log.ERROR, "error serializing event %s: %v", event.Tag, err) + } else if err = json.Unmarshal(raw, &opaque); err != nil { + I.Events.Log(log.ERROR, "error serializing event %s: %v", event.Tag, err) + } + // lock vm I.script.Lock() - if _, err := cb.Call(otto.NullValue(), event); err != nil { + if _, err := cb.Call(otto.NullValue(), opaque); err != nil { I.Events.Log(log.ERROR, "error dispatching event %s: %v", event.Tag, err) } I.script.Unlock()