Windows XP remote management toolkit with SSH and agent transports.
Project description
xpctl is a Python CLI and library for managing a Windows XP target over either a
direct TCP agent or SSH. It packages the agent, the transport clients, and the
higher-level reverse-engineering helpers in one installable project.
What is included
- A Python API for executing commands, transferring files, and managing the agent
- A Click-based CLI for day-to-day operations
- A packaged Python 3.4-compatible XP agent
- Reverse-engineering helpers for debugger, COM, memory, and GUI workflows
- GitHub Actions for CI, docs deployment, and automated releases to PyPI
- A devcontainer for contributor onboarding
Installation
pip install xpctl
Quick start
xpctl configure
xpctl --help
For development:
python3.14 -m venv .venv
. .venv/bin/activate
pip install -e ".[dev,docs]"
The repository includes .python-version pinned to 3.14.3 so tools like
pyenv and pipenv resolve a consistent default interpreter. The package
targets the latest three CPython releases and currently supports Python 3.12+ at
runtime.
Common commands:
xpctl configure --profile lab
xpctl setup bootstrap
xpctl ping
xpctl --profile lab ping
xpctl --profile lab ps
xpctl --profile lab upload ./local.bin "C:\\xpctl\\tmp\\local.bin"
xpctl --profile lab agent status
xpctl configure behaves like aws configure: it walks through host, port,
username, password, and transport settings, validates the connection live, and
writes profiles to ~/.xpcli/config.
Bundled installers
The repo keeps Windows XP tooling archives under installs/.
python-3.4.10.zip: Python 3.4.10 for Windows XP. This is an unofficial build kept here because a Python 3.4-compatible runtime is needed for the XP agent.setup-x86-2.874.exe: Cygwin setup bootstrap pinned to a Windows XP-era snapshot. The XP bootstrap batch installs fromhttp://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/2016/08/30/104223/.ollydbg-1.10.zip: OllyDbg 1.10.x64dbg-2025.08.19.zip: x64dbg snapshot based on the 2025.08.19 release. This is the last working release I could find.windbg: placeholder, archive to be added later.cdb: placeholder, archive to be added later.
XP bootstrap bundle
If you need to bring up a fresh XP VM, generate a local bootstrap bundle:
xpctl setup bootstrap
That writes artifacts/xp-bootstrap/ with:
bootstrap_xpctl.batpython-3.4.10.zipsetup-x86-2.874.exeagent.py
Copy that directory onto the XP machine and run bootstrap_xpctl.bat as an
administrator:
cd D:\xp-bootstrap
bootstrap_xpctl.bat
The batch file performs the following steps:
- Installs Cygwin packages (bash, openssh, unzip, curl) from a pinned 2016 HTTP mirror
- Unpacks and installs Python 3.4.10 to
C:\Python34 - Installs the Visual C++ runtime
- Configures the Cygwin
sshdservice (user:cyg_server, password:xpctl-sshd) - Copies the packaged agent to
C:\xpctl\agent.pyand starts it on port9578 - Opens firewall ports for SSH (22) and the agent (9578)
The script waits up to 30 seconds for the agent to begin listening before
exiting. Once it completes, you can connect from your host with xpctl ping.
Development
make install
make lint
make test
make build
make docs
The docs are built with MkDocs Material and are intended to be published through GitHub Pages.
Release automation
Releases are published through .github/workflows/release.yml. That workflow
uses debaser to generate a deterministic
human-readable release name from the Git SHA.
Pushes to main automatically cut a patch release unless the commit is already a
generated Release v... commit. Manual annotated v<version> tags still publish
through the same workflow, which keeps PyPI trusted publishing pinned to a
single workflow file.
Local release flow:
brew install debaser
make release BUMP=patch
That command:
- bumps
src/xpctl/__about__.py - creates a commit and annotated
v<version>tag - pushes the branch and tag when a remote is configured
The release workflow then:
- validates the version/tag match
- builds the wheel and source distribution
- publishes the package to PyPI
- creates a GitHub Release with a
debaser-generated title
Documentation
Documentation sources live under docs/ and are
published to GitHub Pages from .github/workflows/docs.yml.
Project layout
src/xpctl/ Public package
docs/ GitHub Pages documentation
scripts/ Development and workflow helpers
tests/ Test suite
.devcontainer/ Reproducible contributor environment
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file xpctl-0.1.6.tar.gz.
File metadata
- Download URL: xpctl-0.1.6.tar.gz
- Upload date:
- Size: 68.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c5cac4c2f0236e00eb1921b86c8fe37cce44d0c967ce4332e44fa58aeaa242af
|
|
| MD5 |
f42dc9a7a360f192a42d5ccd2649f427
|
|
| BLAKE2b-256 |
03897d63a2fea03bba8b8786d194c2fa31689d47998a577417c141b152834045
|
Provenance
The following attestation bundles were made for xpctl-0.1.6.tar.gz:
Publisher:
release.yml on nficano/xpctl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
xpctl-0.1.6.tar.gz -
Subject digest:
c5cac4c2f0236e00eb1921b86c8fe37cce44d0c967ce4332e44fa58aeaa242af - Sigstore transparency entry: 1154470672
- Sigstore integration time:
-
Permalink:
nficano/xpctl@af3f9bd85904a3a39f8ca63d5b4774f83543b230 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/nficano
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@af3f9bd85904a3a39f8ca63d5b4774f83543b230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file xpctl-0.1.6-py3-none-any.whl.
File metadata
- Download URL: xpctl-0.1.6-py3-none-any.whl
- Upload date:
- Size: 33.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40ecb29b9c2aa2b51b1a80ddf7fe5b85f3711f8e88efff3eac219bd578ac5f44
|
|
| MD5 |
9ea8cc1fd65dddec471f6cce4b4fad87
|
|
| BLAKE2b-256 |
7a7d082ba5a6f889327f2c162343fdc29ed04e3a45ee17c010fd2abddf16971c
|
Provenance
The following attestation bundles were made for xpctl-0.1.6-py3-none-any.whl:
Publisher:
release.yml on nficano/xpctl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
xpctl-0.1.6-py3-none-any.whl -
Subject digest:
40ecb29b9c2aa2b51b1a80ddf7fe5b85f3711f8e88efff3eac219bd578ac5f44 - Sigstore transparency entry: 1154470676
- Sigstore integration time:
-
Permalink:
nficano/xpctl@af3f9bd85904a3a39f8ca63d5b4774f83543b230 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/nficano
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@af3f9bd85904a3a39f8ca63d5b4774f83543b230 -
Trigger Event:
push
-
Statement type: