Skip to the content.

What is in winhttp.dll, and how to check it

For players, and for anyone reading an antivirus report about FeverLink3. Last updated 2026-10-22 (version 0.2.1). Everything here can be checked against the source code in this repository (public, under the PolyForm Noncommercial License 1.0.0: free for noncommercial use), and where something has not been verified this page says so. If a build you downloaded behaves differently from what is written here, that is a bug in the build or in this page: please tell us (Discord azalshehri, or https://github.com/AZalshehri7/FeverLink3/issues).

The short version

Why a file called winhttp.dll

Windows programs find the DLLs they import in a fixed order, and the folder the program was started from comes before the Windows system folder (for DLLs that are not on the “known DLLs” list, which winhttp.dll is not). A DLL with the right name in the game folder is therefore loaded by the game itself, with no injection. FeverLink3 uses that to get a small piece of code running inside the game. The idea comes from MPFever (by dkdknight), which does the same, and is credited in the README.

We want to be plain about this: the same loading trick is used by malware, and security people have a name for it (DLL search order hijacking and side-loading, MITRE ATT&CK T1574.001 and T1574.002). That is why scanners are suspicious of any winhttp.dll that sits next to a program, and why a new, unsigned, rarely-seen file is more likely to be flagged. What separates FeverLink3 from the malware version of the trick is not the technique but what the file does, that the source is public, and that you can check the file against the release. The rest of this page is about those things.

What the DLL does, exactly

1. It passes the WinHTTP calls through

These are the 14 functions the game imports from WINHTTP.dll (the address tool in tools/addr lists them from the game executable and checks them against the proxy; for game builds 40420, 40423 and 40425 the lists are identical, see tools/addr/out/6ac50427.txt and 6ad0e4e5.txt):

WinHttpOpen, WinHttpConnect, WinHttpOpenRequest, WinHttpSetOption, WinHttpReadData, WinHttpSetStatusCallback, WinHttpCloseHandle, WinHttpWriteData, WinHttpQueryDataAvailable, WinHttpSetTimeouts, WinHttpQueryHeaders, WinHttpAddRequestHeaders, WinHttpSendRequest, WinHttpReceiveResponse.

On the first call of each one, the DLL loads the real library by its full path (<Windows system folder>\winhttp.dll, so it can never find itself), looks the function up by name, remembers the address and calls it with exactly the arguments it was given. If the real function cannot be found, the call returns an error to the game. The code is native/src/proxy.rs, about 130 lines.

2. What happens when the game loads it

When Windows loads the DLL, its start routine does this and nothing else:

  1. It checks two things: whether the environment variable FEVERLINK3_SESSION_DIR is set (only the developers’ command-line program sets it; it is not part of the release), and whether the program that loaded the DLL is TransportFever3.exe.
  2. If neither is true, it returns at once. In any other program the DLL is only the pass-through of step 1.
  3. Otherwise it creates the folder %LOCALAPPDATA%\FeverLink3\ (or the session folder, when the developers’ program started the game) and appends lines to native.log there: that it loaded, the game’s build timestamp, and whether that build is one the module knows. The build is identified from the game’s own program headers in memory (the link timestamp). Build 40420 is the only known build.
  4. Inside the game, if an earlier game run downloaded an update, it finishes it now (renames files in the game folder, before the game reads its mods) or puts the previous version back (“Automatic updates” below).
  5. Inside the game it starts one thread named feverlink3-live and one named feverlink3-update (the update check, once, then it ends).

On a known game build it patches the game’s code in memory, and only while a FeverLink3 session exists. The DLL contains inline detours and byte patches with the byte patterns of builds 40420, 40423 and 40425 (native/src/hooks.rs, detour.rs, patch.rs, build_table.rs). Five pieces are on by default: a hook that counts the simulation’s commands, a hook on the command list that can hold a construction command until the session says when to apply it, a patch that makes the script pool single-threaded, a patch that pins the seed of Lua’s string hash, and a one-byte patch that makes the engine’s tickCount getter return the simulation’s step count. Each checks the bytes it is about to change against the build table and installs nothing (and logs why) on an unknown build or different bytes; each is turned off by setting its variable to 0 (FEVERLINK3_HOOKS, FEVERLINK3_HOLD, FEVERLINK3_POOLPATCH, FEVERLINK3_LUA_SEED, FEVERLINK3_STEP_SEED). The diagnostic hooks (town seed and growth logs) are off unless a developer sets their variable to 1. See “What may change” below.

3. What the thread does while the game runs

The thread (launcher/src/live.rs) wakes every 100 milliseconds and:

4. What it does not do

These are statements about the code in this repository; you can search for the calls yourself.

5. How the patches are put in place

For the pieces of section 2 (the hooks in the game’s own code and the small byte patches), on a known build the module first checks the exact bytes it expects at each place, then runs a self-test of its own detour machinery (it writes a few instructions of its own into a small block of executable memory, which it allocates for the purpose and never frees, and runs them), then writes the changes all-or-none, rolls back if one fails, keeps the DLL loaded for the rest of the process, and starts a second thread that exchanges two text files with the mod (native_ctl.log, native_events.log). Every step is written to native.log. Patching another program’s code in memory and running generated code are exactly what security products watch for; any new patch is announced in the changelog and described on this page.

Known gaps

No program to run

The release zip holds winhttp.dll, the mod folder mods\release\feverlink3 and some text files. You copy the DLL and the mod folder into the game folder yourself; there is no installer and no FeverLink3 program for players to start. (The repository also holds a command-line program for developers and lab tests; it is not in the release zip, and nothing on this page depends on it.)

Files FeverLink3 creates or changes

Where What Who writes it When you uninstall
<game folder>\winhttp.dll the DLL you, when you install; the automatic update delete it
<game folder>\mods\release\feverlink3\ the mod (Lua game scripts and the window) you, when you install; the automatic update delete it
%LOCALAPPDATA%\FeverLink3\native.log the DLL’s text log the DLL optional: delete the folder
%LOCALAPPDATA%\FeverLink3\live\ session files: ctl_cmd.log, ctl_status.txt, identity.txt, to_game.log, from_game.log, mod.log, hud_state.txt, ui_out.log, resync_cursor.txt; emptied at every game start the DLL and the mod optional: delete the folder
<Steam>\userdata\<id>\3493540\local\save\feverlink3-resync-<number>.sav the host’s world while it is synced to the players. These are ordinary game saves and can be large the game and the DLL optional: delete them
<game folder>\feverlink3_update\ the automatic update: state.json (what the next start must finish), <version>\ (the checked new files), backup-<version>\ (the previous mod, until the new version started well), download\ (during a download) the DLL delete it (only while the game is closed)
<game folder>\winhttp.dll.old-<version>, winhttp.dll.failed-<version>, feverlink3_update_skip.txt the previous DLL until the new one started well; a DLL that failed and was taken back; versions not to offer again the DLL delete them
%LOCALAPPDATA%\FeverLink3\settings.txt autoupdate=off when you turned automatic updates off the DLL, when you click the switch optional: delete the folder

<game folder> is <Steam library>\steamapps\common\Transport Fever 3\. To open it: in Steam, right-click Transport Fever 3, Manage, Browse local files.

Network

What FeverLink3 uses to connect players, in this version:

What the other players receive: the display name you chose (it starts as your Windows user name, so change it if you prefer), your game actions, world checksums, chat lines, and, if you host, the world itself. A player who tests the connection by Steam ID shares that Steam ID with the person they test with.

How the session traffic is protected: every frame is encrypted and authenticated by FeverLink3 itself (AES-256-GCM, a key derived with HKDF from the secret inside the join code, a replay window per sender), independent of the path it travels on. The host decides who may send what. Anyone who has the join code can join, so treat the code like a password for that session. A join code holds the session secret, the time it was made and how to reach the host (for sessions over Steam, the host’s Steam ID). The details are in the wire protocol and section 3 of the architecture.

Check it yourself

With the game running, in PowerShell:

$p = (Get-Process TransportFever3).Id
Get-NetTCPConnection -OwningProcess $p -State Listen      # listening TCP sockets of the game: expect none from FeverLink3
Get-NetUDPEndpoint   -OwningProcess $p                    # UDP sockets of the game (these may include Steam's networking sockets)
Get-NetTCPConnection -OwningProcess $p -State Established # outgoing TCP connections (the game and Steam have their own)

(An error saying that no matching connection was found also means there is none.) For a closer look, Sysinternals Process Monitor with the filter “Process Name is TransportFever3.exe” and “Path contains FeverLink3” lists every file the DLL and the mod touch, and Wireshark or Resource Monitor shows the traffic. If you see a listening TCP socket you do not expect, or a file access outside the places in the table above, please tell us.

Automatic updates

From 0.2.0 on, FeverLink3 updates itself. This section says exactly what it does and what it trusts. The code is launcher/src/autoupdate.rs; the checks are in launcher/src/update.rs.

When. Once per game start, right after the module has loaded, on a thread of its own. It does not start while you are in a session and never changes a file during one (it waits until the session is over). It is not a background service: when the game is closed, nothing runs.

What it asks. One HTTPS request to https://api.github.com/repos/AZalshehri7/FeverLink3/releases/latest, GitHub’s page of the newest full release of this repository (drafts and pre-releases are never listed there, and the module refuses them again). If that release is not newer than yours, nothing else happens. The request carries no personal data beyond what any web request carries (your IP address reaches GitHub; the user agent is feverlink3-updater/<version>).

What it downloads, and the checks. The release’s manifest.json, its zip and the zip’s .sha256 file, only from https://github.com/AZalshehri7/FeverLink3/releases/download/<that release's tag>/, inside the game with Windows’ own WinHTTP (C:\Windows\System32\winhttp.dll; no program is started; HTTPS only, also for redirects, only to GitHub’s addresses api.github.com, github.com, objects.githubusercontent.com and release-assets.githubusercontent.com, TLS 1.2 or newer, the server’s certificate checked by Windows, size and time limits). The first check waits two minutes after the game started. The update is used only if all of these hold:

  1. the version is strictly newer than the one you run, and the manifest names that same version and zip;
  2. the zip’s SHA-256 equals the manifest’s zip_sha256 and the published .sha256 file;
  3. every file taken from the zip has exactly the size and SHA-256 the manifest lists;
  4. every file name is winhttp.dll, under mods/release/feverlink3/, or one of the documents (which are never copied), with no .., drive letter, absolute path or other trick; a release that carries anything else is refused as a whole.

Unsigned until 1.0.0. Releases before 1.0.0 carry no signature. The checks above prove that the files are the ones published on this repository’s release page and that nothing was changed on the way; they do not protect you if someone takes over the repository (a stolen GitHub account or token) and publishes a release. From 1.0.0 on the release manifest is to be signed with a key built into FeverLink3, and from then on an update without a good signature is refused (planned, signing plan). If you do not want to trust the repository’s release page automatically, turn automatic updates off (below) and update by hand after checking a release yourself (“Verify what you downloaded”).

How it changes your files. The new files are checked and stored in <game folder>\feverlink3_update\<version>\ first. Then, still in that game run, the running winhttp.dll is renamed to winhttp.dll.old-<old version> (Windows allows renaming a loaded DLL; the game keeps using the old one in memory) and the new one is put in its place. The window says “Updated to X. Restart the game to finish.” At the next game start the new DLL loads first and, before the game reads any mod, moves mods\release\feverlink3 to feverlink3_update\backup-<old version>\ and the new mod folder into its place. 30 seconds into that game the backup, the old DLL and the staged files are deleted, and so is the feverlink3_update folder once it is empty. Nothing else in the game folder is touched, and nothing outside it.

If something goes wrong. If the new version does not stay up for 30 seconds in two starts, or the mod folder cannot be swapped, the old DLL and the old mod are put back, the version goes on the skip list (feverlink3_update_skip.txt) and is not offered again, and the window says “Update to X failed: . You keep ." A game run whose files on disk no longer match the DLL in memory does not let you host or join until you restart it.

Turning it off. In the FeverLink3 window, Troubleshooting, “Automatic updates: on” (click to switch to off). The setting is stored in %LOCALAPPDATA%\FeverLink3\settings.txt (autoupdate=off) and counts from the next game start. A FeverLink3 that you built yourself from the source never updates itself (only the release workflow’s builds do).

Verify what you downloaded

Each release has these files: FeverLink3-<version>.zip, FeverLink3-<version>.zip.sha256 and manifest.json (every file in the zip with its size and SHA-256, and the zip’s SHA-256). The release notes repeat the zip’s SHA-256. Releases are built by GitHub Actions from a commit on main; nothing is built on a developer’s PC (release process).

In PowerShell, in the folder with the downloaded files:

(Get-FileHash .\FeverLink3-0.2.1.zip -Algorithm SHA256).Hash.ToLower()
Get-Content .\FeverLink3-0.2.1.zip.sha256

# the DLL you installed against the manifest (your game folder: Steam, right-click Transport Fever 3, Manage, Browse local files)
$m = Get-Content .\manifest.json -Raw | ConvertFrom-Json
($m.files | Where-Object path -eq 'winhttp.dll').sha256
(Get-FileHash 'C:\Program Files (x86)\Steam\steamapps\common\Transport Fever 3\winhttp.dll' -Algorithm SHA256).Hash.ToLower()

The values in each pair must be identical, and equal to the ones in the release notes. If they differ, do not use the file. Use the path of your own game folder in the last command.

What this does and does not prove: the zip is assembled reproducibly (the same inputs give the same bytes), so the zip hash proves that you have the file the release job produced. We have not verified that two independent compilations of the DLL give identical bytes, so the way to check the code itself is to read it and build it yourself (cargo build --release -p feverlink3_native, see the README) and compare behaviour, not to expect the same hash. Releases before 1.0.0 are not signed: neither the manifest nor the DLL carries a signature (the signing plan is for 1.0.0).

Get the file only from the project’s release page. A file called winhttp.dll from anywhere else is not ours.

If your antivirus flags it

As a player:

  1. Do not turn your antivirus off. Compare the file’s hash with the release (above).
  2. If the hash matches and you trust the project: restore the file (Windows Security, Virus and threat protection, Protection history, pick the item, Actions, Restore or Allow) and, if it comes back, add an exclusion for that one file instead of a whole folder. If you do not trust it, remove FeverLink3 (“Remove it” below).
  3. Report the false positive, so it is fixed for everyone. A report that names the exact detection and carries the file’s SHA-256 is the most useful, and vendors take more notice when several people report the same file.

Things in the file that make heuristics suspicious, so you know what to expect: it is a proxy DLL next to a program, it is not signed, it carries no version information, it is new and few people have it (reputation systems distrust rare files), it starts a thread, reads the Steam path from the registry, and uses networking.

Where to report a false positive

Checked on 2026-10-10 by loading or searching the vendor’s own page: Microsoft, Kaspersky, ESET, Malwarebytes. The other rows are taken from the list that AV-Comparatives published in May 2023 (https://av-comparatives.org/dealing-with-false-positives-reporting-issues-to-antivirus-vendors/); those pages refused automatic access when this was written, so open the page and check it before relying on it.

Product Where Notes
Microsoft Defender https://www.microsoft.com/en-us/wdsi/filesubmission (short link https://aka.ms/wdsi) Choose “Software developer” if you are the author or “Home” for a user, then “Incorrectly detected as malware” (or “as PUA”). Fields: the product that flagged it, the detection name (Windows Security, Protection history), the file (up to 50 MB), extra information in English (up to 1,900 characters). A Microsoft account is optional and lets you track the result. Low-priority submissions may not reach an analyst. Guide: https://learn.microsoft.com/en-us/defender-xdr/submission-guide
Microsoft SmartScreen https://learn.microsoft.com/en-us/windows/apps/package-and-deploy/smartscreen-reputation “Windows protected your PC” is a reputation prompt, not a malware verdict. There is no form to ask for a review of an unsigned file on a consumer PC; reputation builds with signing and downloads.
Kaspersky https://support.kaspersky.com/1870 Look the file up in OpenTip (https://opentip.kaspersky.com), then use “Submit to reanalyze”; the form asks for an email address.
ESET samples@eset.com (https://support.eset.com/en/kb141-submit-a-virus-website-or-potential-false-positive-sample-to-the-eset-lab) Put the file in a zip with the password infected, subject “False positive”, attach it with a screenshot of the detection. Or use the product: Tools, Quarantine, right-click, Submit sample for analysis.
Malwarebytes https://help.malwarebytes.com/hc/en-us/articles/31589211404571-Report-a-false-positive-to-Malwarebytes-Support Paid subscribers go through support; others post in the Malwarebytes forum (https://forums.malwarebytes.com), which needs an account.
Avast https://www.avast.com/false-positive-file-form.php  
AVG https://www.avg.com/en-us/false-positive-file-form  
Bitdefender https://www.bitdefender.com/consumer/support/answer/29358/  
Norton https://submit.norton.com/  
McAfee https://www.mcafee.com/support/?articleId=TS103032  
Sophos https://support.sophos.com/support/s/article/KBA-000001443  
Trend Micro https://success.trendmicro.com/en-US/solution/KA-0008383  
F-Secure / WithSecure https://www.withsecure.com/en/support/contact-support/submit-a-sample  
G DATA https://www.gdatasoftware.com/faq/consumer/submit-a-suspicious-file-app-or-url  
Avira https://www.avira.com/en/analysis/submit  
Panda / WatchGuard https://www.watchguard.com/wgrd-support/security-portal/report-false-positive  

Tips that every vendor asks for: name the product and the detection, send the exact file and its SHA-256, and say what the file is. Scanning the file at https://www.virustotal.com first shows whether one engine is the outlier (an outlier is usually a heuristic false positive); note that VirusTotal shares what you upload with its partners, which is fine here because the file’s source code is public.

Text you can paste into a report

False positive: winhttp.dll from FeverLink3 (public source code, PolyForm Noncommercial licence). File: winhttp.dll, SHA-256 <paste the hash>, from https://github.com/AZalshehri7/FeverLink3/releases (tag <version>). What it is: a proxy DLL for the game Transport Fever 3 (Steam app 3493540). It passes the 14 WinHTTP functions the game imports to the Windows system library unchanged, and runs a multiplayer session controller in one thread inside the game. It does not inject into other processes, persist, collect data or download code. Source and a description of its behaviour: https://github.com/AZalshehri7/FeverLink3 (folders native/ and launcher/, page docs/SECURITY_FOR_USERS.md). It is built by GitHub Actions from the tag and is not code-signed yet. Detection seen: <product and detection name>. Why we think it is a false positive: a DLL placed in an application’s folder matches the generic pattern for DLL side-loading, but the file’s behaviour is documented and its source is public. Please re-analyse it and remove the detection if you agree. Contact: <your email or GitHub issue link>.

Windows warnings: SmartScreen and Smart App Control

Who you are trusting

Remove it

  1. Close the game. In the game folder delete winhttp.dll (check first that it is ours, with the hash above, if another mod might have placed one) and the folder mods\release\feverlink3. Also delete, if they are there, winhttp.dll.old-*, winhttp.dll.failed-*, the folder feverlink3_update and feverlink3_update_skip.txt. Steam’s “Verify integrity of game files” does not remove these files.
  2. Optional: delete %LOCALAPPDATA%\FeverLink3\ (logs and session files) and the files named feverlink3-resync-*.sav in your save folder.

The game keeps no other trace of FeverLink3. The mod declares that removing it has no effect on a save (severityRemove: None in its mod.json); the game may still list it as missing when you load a save that was made with it.

Reporting a security problem

If you think you found a vulnerability, or a build that does more than this page says, tell the maintainer directly on Discord (azalshehri) before posting details in public, or open an issue at https://github.com/AZalshehri7/FeverLink3/issues without sensitive detail and ask for a private channel. The project’s threat model and policy are in Security.