DLL-Downloader
Search, download, and optionally scan DLL files with VirusTotal
Overview
DLL-Downloader is a Python tool that searches and downloads DLL files from trusted sources and can optionally scan them using VirusTotal. It works as both a CLI tool and a Python library.
Key Features
| Feature | Description |
|---|---|
| Search & Download | Resolve DLL names and download the correct file |
| ZIP Extraction | Optionally extract the DLL when the source returns a ZIP |
| Architecture Support | x86 and x64 downloads with PE architecture validation |
| VirusTotal Scan | Optional security scan before saving |
| Batch Mode | Download many DLLs from a file |
| Library Mode | Use the downloader directly from Python |
| Clean Architecture | Domain/use-case/infrastructure separation |
Installation
From PyPI (Recommended)
pip install dll-downloader
From Source
git clone https://github.com/seifreed/DLL-Downloader.git
cd DLL-Downloader
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -e .
Configuration
You can configure settings using .config.json, environment variables, or ~/.vt.toml.
JSON config (.config.json)
{
"virustotal_api_key": "your_virustotal_api_key_here",
"download_directory": "./downloads",
"download_base_url": "https://es.dll-files.com",
"http_timeout": 60,
"virustotal_timeout": 60.0,
"verify_ssl": true,
"scan_before_save": true,
"malicious_threshold": 5,
"suspicious_threshold": 1,
"log_level": "INFO",
"user_agent": null
}
VirusTotal key via ~/.vt.toml
apikey="your_virustotal_api_key_here"
Environment variables
export DLL_VIRUSTOTAL_API_KEY="your_virustotal_api_key_here"
export DLL_DOWNLOAD_DIRECTORY="./downloads"
export DLL_VIRUSTOTAL_TIMEOUT="60"
Quick Start
# Download a single DLL
python3 dll-downloader.py msvcp140.dll
# Download x86 and fail if the source does not provide a matching PE DLL
python3 dll-downloader.py msvcp140.dll --arch x86
# Download and extract when the source returns a ZIP
python3 dll-downloader.py msvcp140.dll --extract
# Download from a list
python3 dll-downloader.py --file dll_list.txt
# Emit machine-readable JSON
python3 dll-downloader.py msvcp140.dll --json
# Emit SARIF for CI/security pipelines
python3 dll-downloader.py msvcp140.dll --sarif
Usage
Command Line Interface
python3 dll-downloader.py <dll_name> [options]
Available Options
| Option | Description |
|---|---|
--file |
File with one DLL name per line |
--arch |
Target architecture (x86 or x64; default: x64) |
--debug |
Enable debug output |
--no-scan |
Skip VirusTotal scan |
--force |
Force download even if cached |
--output-dir |
Custom output directory |
--extract |
Extract the DLL when the download is a ZIP archive |
--json |
Emit machine-readable JSON output |
--sarif |
Emit SARIF v2.1.0 output |
Some providers return the DLL inside a ZIP archive. By default, dll-downloader
expects the payload to be a real ZIP and validates that it contains a valid PE
DLL. Without --extract, the validated ZIP is saved as-is. With --extract,
the tool saves the unpacked .dll, which is useful in CI/CD workflows. If the
payload is not a valid ZIP or the embedded DLL is not a valid PE file, the
download fails with an explicit error.
The selected architecture is also validated against the embedded PE header.
If --arch x86 is requested and the source returns an x64 DLL, the download
fails instead of saving a mislabeled file.
The HTTP transport retries transient failures up to 5 times by default and
rotates across a pool of 5 legitimate User-Agent strings unless you provide
an explicit user_agent in configuration.
Retry policy settings:
http_max_retrieshttp_retry_backoff_secondshttp_retry_jitter_secondsuser_agentuser_agent_pool
For pipeline integration, --json emits one structured JSON document and
--sarif emits one SARIF v2.1.0 log. Both formats also serialize boundary
errors such as invalid CLI input or unreadable DLL list files.
Python Library
Basic Usage
from dll_downloader.api import (
Architecture,
DownloadDLLRequest,
)
from dll_downloader.runtime import (
load_settings,
create_dependencies,
)
settings = load_settings()
use_case, http_client, scanner = create_dependencies(settings)
try:
response = use_case.execute(DownloadDLLRequest(
dll_name="msvcp140.dll",
architecture=Architecture.X64,
scan_before_save=True,
force_download=False,
extract_archive=True,
))
print(response)
finally:
http_client.close()
if scanner:
scanner.close()
Requirements
- Python 3.13 or 3.14
- See
pyproject.tomlfor dependencies
Software Bill of Materials (SBOM)
A CycloneDX 1.6 SBOM for the runtime dependency closure is committed at
sbom.cdx.json and regenerated by:
python scripts/generate_sbom.py -o sbom.cdx.json
It documents the application and its runtime dependencies (not the
development/test tooling) with full supplier, license, hash, and
source/distribution provenance. The SBOM scores 10.0/10.0 Grade A on
every NTIA and BSI TR-03183-2 profile of sbomqs;
CI enforces this contract via scripts/check_sbom_quality.py:
sbomqs score --profile ntia,bsi-v1.1,bsi-v2.0,bsi-v2.1 sbom.cdx.json
python scripts/check_sbom_quality.py sbom.cdx.json
The SBOM Quality badge above is dynamic: --badge sbom-score.json writes a
shields.io endpoint file that the
badge fetches live, and CI fails if the committed badge drifts from the real
score:
python scripts/check_sbom_quality.py sbom.cdx.json --badge sbom-score.json
Reporting Issues & Security
- Bugs and feature requests: open a GitHub issue. Existing issues and discussions are searchable and serve as the public archive.
- Security vulnerabilities: please do not open a public issue. Follow the private reporting process in SECURITY.md.
Contributing
Contributions are welcome. See CONTRIBUTING.md for the contribution process, coding standards, and the testing policy (tests are required for new functionality, and the project enforces 100% coverage). The fork-and-pull-request workflow is used; CI runs lint, type checks, security scans, and the full test suite on every change.
Notable changes are recorded in CHANGELOG.md.
Support the Project
If you find DLL-Downloader useful, consider supporting its development:
License
See the LICENSE file for details.
Attribution Required:
- Author: Marc Rivero Lopez
- Repository: github.com/seifreed/DLL-Downloader
Built for secure, reliable DLL acquisition
Metadata
Release files for dll-downloader 1.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dll_downloader-1.2.0.tar.gz | 156.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dll_downloader-1.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 251.8 kB
Release files / dll_downloader-1.2.0.tar.gz
| Download URL | dll_downloader-1.2.0.tar.gz |
|---|---|
| Size | 156.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
66dbb51a5e7357777fac745cb485126f37d34441ceb760643794054b7bd6511e
|
|
BLAKE2b-256 checksum How to use checksums |
d1c5f31a683c29c48e1dabbb6de632140f98ee74a0cb3187b113c2edae58f040
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 16, 2026.
Transparency logRelease files / dll_downloader-1.2.0-py3-none-any.whl
| Download URL | dll_downloader-1.2.0-py3-none-any.whl |
|---|---|
| Size | 95.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
828666f596f33cfe8d5e494f267027e762531738c6c776986b069aac59950192
|
|
BLAKE2b-256 checksum How to use checksums |
f6f5b52c8dfb596ae007ea0a119c152dd087b8b18d697e5afeafff912da812ba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 16, 2026.
Transparency log