Repository files navigation

Temporal Stasis

Temporal Stasis is a FFXIV network proxy library.

Unlike traditional packet capturing tools, Temporal Stasis stands between the game client and game server as a proxy, decrypting/decompressing messages and repackaging them on the fly. Temporal Stasis can be used as a library to record, drop, and even modify packets. Because it's a proxy, Temporal Stasis doesn't require modifying your game install at all, and you don't have to inject into the game process to use Temporal Stasis.

Here's a simple comparison between other packet capturing tools:

ProjectWorks without adminUsable as a libraryWorks without injectionSupports packet modification
Temporal Stasis
Deucalion
Chronofoil
Machina⚠️1⚠️2

Requirements

There are three "layers" of the FFXIV protocol that must be handled: encryption (in the lobby server), compression (in the zone server), and obfuscation (in some zone server packets). There's also some extra things that change often (like packet opcodes).

  • Temporal Stasis requires the Oodle Network Compression library. This must be present at runtime so Temporal Stasis can load it and decompress packets.
    • Libraries for Oodle Network Compression can be obtained here (in the Releases tab). For Windows users, extract oodle-network-shared.dll from msvc.zip and place it next to your application executable.
    • In the future, Temporal Stasis may allow loading Oodle from the FFXIV game executable.
  • Temporal Stasis does not deobfuscate packets. Note that obfuscation only applies to some fields of some packets in the zone server, and you might not need to worry about packet obfuscation, depending on your use case.
    • Deobfuscating packets is outside the scope of Temporal Stasis, as packet obfuscation changes every game update. You can combine Temporal Stasis with a library like Unscrambler, if you need.
  • Temporal Stasis does not provide packet opcodes or structs. IPC packet opcodes change every game update, and their fields shift often. If you are reading data out of specific packets, you are expected to know the current opcode and layout of the packet.
  • Temporal Stasis automatically provides the offsets and opcodes required for the lobby server (specifically the EncryptionInit segment and the EnterWorld packet). If these values are out of date, you must provide the correct values (in the LobbyProxyConfig class) for Temporal Stasis to work correctly.

Usage

Temporal Stasis is a library, and you're intended to use it in your own code. There's an example project in this repository (TemporalStasis.Example) that can show you around the API.

To connect to Temporal Stasis, you need to redirect the game client to connect to your proxy instead of the original lobby server, and then your proxy will then connect to the original lobby server. This can be done in a few ways:

  • Pass arguments to the game client to override the default lobby server (DEV.LobbyHost04=127.0.0.1 DEV.LobbyPort04=44994)
  • Set up a custom DNS server and override the lobby server DNS records (neolobby02.ffxiv.com)

Those arguments and that DNS record point to the Aether data center. Note that the index from the command line and name of the DNS record do not match up (if you need a reference, see the WorldDCGroupType sheet here).

The lobby proxy will rewrite some packets to make the game client connect to the zone proxy. From there, you can intercept packets in normal gameplay.

Footnotes

  1. Machina requires WinPcap installed to work without administrative privileges.

  2. Machina versions v2.4.2.2 and above require Deucalion to deobfuscate some obfuscated packets.

About

FFXIV network proxy library

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Temporal Stasis

Temporal Stasis is a FFXIV network proxy library.

Unlike traditional packet capturing tools, Temporal Stasis stands between the game client and game server as a proxy, decrypting/decompressing messages and repackaging them on the fly. Temporal Stasis can be used as a library to record, drop, and even modify packets. Because it's a proxy, Temporal Stasis doesn't require modifying your game install at all, and you don't have to inject into the game process to use Temporal Stasis.

Here's a simple comparison between other packet capturing tools:

ProjectWorks without adminUsable as a libraryWorks without injectionSupports packet modification
Temporal Stasis
Deucalion
Chronofoil
Machina⚠️1⚠️2

Requirements

There are three "layers" of the FFXIV protocol that must be handled: encryption (in the lobby server), compression (in the zone server), and obfuscation (in some zone server packets). There's also some extra things that change often (like packet opcodes).

  • Temporal Stasis requires the Oodle Network Compression library. This must be present at runtime so Temporal Stasis can load it and decompress packets.
    • Libraries for Oodle Network Compression can be obtained here (in the Releases tab). For Windows users, extract oodle-network-shared.dll from msvc.zip and place it next to your application executable.
    • In the future, Temporal Stasis may allow loading Oodle from the FFXIV game executable.
  • Temporal Stasis does not deobfuscate packets. Note that obfuscation only applies to some fields of some packets in the zone server, and you might not need to worry about packet obfuscation, depending on your use case.
    • Deobfuscating packets is outside the scope of Temporal Stasis, as packet obfuscation changes every game update. You can combine Temporal Stasis with a library like Unscrambler, if you need.
  • Temporal Stasis does not provide packet opcodes or structs. IPC packet opcodes change every game update, and their fields shift often. If you are reading data out of specific packets, you are expected to know the current opcode and layout of the packet.
  • Temporal Stasis automatically provides the offsets and opcodes required for the lobby server (specifically the EncryptionInit segment and the EnterWorld packet). If these values are out of date, you must provide the correct values (in the LobbyProxyConfig class) for Temporal Stasis to work correctly.

Usage

Temporal Stasis is a library, and you're intended to use it in your own code. There's an example project in this repository (TemporalStasis.Example) that can show you around the API.

To connect to Temporal Stasis, you need to redirect the game client to connect to your proxy instead of the original lobby server, and then your proxy will then connect to the original lobby server. This can be done in a few ways:

  • Pass arguments to the game client to override the default lobby server (DEV.LobbyHost04=127.0.0.1 DEV.LobbyPort04=44994)
  • Set up a custom DNS server and override the lobby server DNS records (neolobby02.ffxiv.com)

Those arguments and that DNS record point to the Aether data center. Note that the index from the command line and name of the DNS record do not match up (if you need a reference, see the WorldDCGroupType sheet here).

The lobby proxy will rewrite some packets to make the game client connect to the zone proxy. From there, you can intercept packets in normal gameplay.

Footnotes

  1. Machina requires WinPcap installed to work without administrative privileges.

  2. Machina versions v2.4.2.2 and above require Deucalion to deobfuscate some obfuscated packets.

About

FFXIV network proxy library

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Temporal Stasis

Temporal Stasis is a FFXIV network proxy library.

Unlike traditional packet capturing tools, Temporal Stasis stands between the game client and game server as a proxy, decrypting/decompressing messages and repackaging them on the fly. Temporal Stasis can be used as a library to record, drop, and even modify packets. Because it's a proxy, Temporal Stasis doesn't require modifying your game install at all, and you don't have to inject into the game process to use Temporal Stasis.

Here's a simple comparison between other packet capturing tools:

ProjectWorks without adminUsable as a libraryWorks without injectionSupports packet modification
Temporal Stasis
Deucalion
Chronofoil
Machina⚠️1⚠️2

Requirements

There are three "layers" of the FFXIV protocol that must be handled: encryption (in the lobby server), compression (in the zone server), and obfuscation (in some zone server packets). There's also some extra things that change often (like packet opcodes).

  • Temporal Stasis requires the Oodle Network Compression library. This must be present at runtime so Temporal Stasis can load it and decompress packets.
    • Libraries for Oodle Network Compression can be obtained here (in the Releases tab). For Windows users, extract oodle-network-shared.dll from msvc.zip and place it next to your application executable.
    • In the future, Temporal Stasis may allow loading Oodle from the FFXIV game executable.
  • Temporal Stasis does not deobfuscate packets. Note that obfuscation only applies to some fields of some packets in the zone server, and you might not need to worry about packet obfuscation, depending on your use case.
    • Deobfuscating packets is outside the scope of Temporal Stasis, as packet obfuscation changes every game update. You can combine Temporal Stasis with a library like Unscrambler, if you need.
  • Temporal Stasis does not provide packet opcodes or structs. IPC packet opcodes change every game update, and their fields shift often. If you are reading data out of specific packets, you are expected to know the current opcode and layout of the packet.
  • Temporal Stasis automatically provides the offsets and opcodes required for the lobby server (specifically the EncryptionInit segment and the EnterWorld packet). If these values are out of date, you must provide the correct values (in the LobbyProxyConfig class) for Temporal Stasis to work correctly.

Usage

Temporal Stasis is a library, and you're intended to use it in your own code. There's an example project in this repository (TemporalStasis.Example) that can show you around the API.

To connect to Temporal Stasis, you need to redirect the game client to connect to your proxy instead of the original lobby server, and then your proxy will then connect to the original lobby server. This can be done in a few ways:

  • Pass arguments to the game client to override the default lobby server (DEV.LobbyHost04=127.0.0.1 DEV.LobbyPort04=44994)
  • Set up a custom DNS server and override the lobby server DNS records (neolobby02.ffxiv.com)

Those arguments and that DNS record point to the Aether data center. Note that the index from the command line and name of the DNS record do not match up (if you need a reference, see the WorldDCGroupType sheet here).

The lobby proxy will rewrite some packets to make the game client connect to the zone proxy. From there, you can intercept packets in normal gameplay.

Footnotes

  1. Machina requires WinPcap installed to work without administrative privileges.

  2. Machina versions v2.4.2.2 and above require Deucalion to deobfuscate some obfuscated packets.

About

FFXIV network proxy library

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Temporal Stasis

Temporal Stasis is a FFXIV network proxy library.

Unlike traditional packet capturing tools, Temporal Stasis stands between the game client and game server as a proxy, decrypting/decompressing messages and repackaging them on the fly. Temporal Stasis can be used as a library to record, drop, and even modify packets. Because it's a proxy, Temporal Stasis doesn't require modifying your game install at all, and you don't have to inject into the game process to use Temporal Stasis.

Here's a simple comparison between other packet capturing tools:

ProjectWorks without adminUsable as a libraryWorks without injectionSupports packet modification
Temporal Stasis
Deucalion
Chronofoil
Machina⚠️1⚠️2

Requirements

There are three "layers" of the FFXIV protocol that must be handled: encryption (in the lobby server), compression (in the zone server), and obfuscation (in some zone server packets). There's also some extra things that change often (like packet opcodes).

  • Temporal Stasis requires the Oodle Network Compression library. This must be present at runtime so Temporal Stasis can load it and decompress packets.
    • Libraries for Oodle Network Compression can be obtained here (in the Releases tab). For Windows users, extract oodle-network-shared.dll from msvc.zip and place it next to your application executable.
    • In the future, Temporal Stasis may allow loading Oodle from the FFXIV game executable.
  • Temporal Stasis does not deobfuscate packets. Note that obfuscation only applies to some fields of some packets in the zone server, and you might not need to worry about packet obfuscation, depending on your use case.
    • Deobfuscating packets is outside the scope of Temporal Stasis, as packet obfuscation changes every game update. You can combine Temporal Stasis with a library like Unscrambler, if you need.
  • Temporal Stasis does not provide packet opcodes or structs. IPC packet opcodes change every game update, and their fields shift often. If you are reading data out of specific packets, you are expected to know the current opcode and layout of the packet.
  • Temporal Stasis automatically provides the offsets and opcodes required for the lobby server (specifically the EncryptionInit segment and the EnterWorld packet). If these values are out of date, you must provide the correct values (in the LobbyProxyConfig class) for Temporal Stasis to work correctly.

Usage

Temporal Stasis is a library, and you're intended to use it in your own code. There's an example project in this repository (TemporalStasis.Example) that can show you around the API.

To connect to Temporal Stasis, you need to redirect the game client to connect to your proxy instead of the original lobby server, and then your proxy will then connect to the original lobby server. This can be done in a few ways:

  • Pass arguments to the game client to override the default lobby server (DEV.LobbyHost04=127.0.0.1 DEV.LobbyPort04=44994)
  • Set up a custom DNS server and override the lobby server DNS records (neolobby02.ffxiv.com)

Those arguments and that DNS record point to the Aether data center. Note that the index from the command line and name of the DNS record do not match up (if you need a reference, see the WorldDCGroupType sheet here).

The lobby proxy will rewrite some packets to make the game client connect to the zone proxy. From there, you can intercept packets in normal gameplay.

Footnotes

  1. Machina requires WinPcap installed to work without administrative privileges.

  2. Machina versions v2.4.2.2 and above require Deucalion to deobfuscate some obfuscated packets.

About

FFXIV network proxy library

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Temporal Stasis

Temporal Stasis is a FFXIV network proxy library.

Unlike traditional packet capturing tools, Temporal Stasis stands between the game client and game server as a proxy, decrypting/decompressing messages and repackaging them on the fly. Temporal Stasis can be used as a library to record, drop, and even modify packets. Because it's a proxy, Temporal Stasis doesn't require modifying your game install at all, and you don't have to inject into the game process to use Temporal Stasis.

Here's a simple comparison between other packet capturing tools:

ProjectWorks without adminUsable as a libraryWorks without injectionSupports packet modification
Temporal Stasis
Deucalion
Chronofoil
Machina⚠️1⚠️2

Requirements

There are three "layers" of the FFXIV protocol that must be handled: encryption (in the lobby server), compression (in the zone server), and obfuscation (in some zone server packets). There's also some extra things that change often (like packet opcodes).

  • Temporal Stasis requires the Oodle Network Compression library. This must be present at runtime so Temporal Stasis can load it and decompress packets.
    • Libraries for Oodle Network Compression can be obtained here (in the Releases tab). For Windows users, extract oodle-network-shared.dll from msvc.zip and place it next to your application executable.
    • In the future, Temporal Stasis may allow loading Oodle from the FFXIV game executable.
  • Temporal Stasis does not deobfuscate packets. Note that obfuscation only applies to some fields of some packets in the zone server, and you might not need to worry about packet obfuscation, depending on your use case.
    • Deobfuscating packets is outside the scope of Temporal Stasis, as packet obfuscation changes every game update. You can combine Temporal Stasis with a library like Unscrambler, if you need.
  • Temporal Stasis does not provide packet opcodes or structs. IPC packet opcodes change every game update, and their fields shift often. If you are reading data out of specific packets, you are expected to know the current opcode and layout of the packet.
  • Temporal Stasis automatically provides the offsets and opcodes required for the lobby server (specifically the EncryptionInit segment and the EnterWorld packet). If these values are out of date, you must provide the correct values (in the LobbyProxyConfig class) for Temporal Stasis to work correctly.

Usage

Temporal Stasis is a library, and you're intended to use it in your own code. There's an example project in this repository (TemporalStasis.Example) that can show you around the API.

To connect to Temporal Stasis, you need to redirect the game client to connect to your proxy instead of the original lobby server, and then your proxy will then connect to the original lobby server. This can be done in a few ways:

  • Pass arguments to the game client to override the default lobby server (DEV.LobbyHost04=127.0.0.1 DEV.LobbyPort04=44994)
  • Set up a custom DNS server and override the lobby server DNS records (neolobby02.ffxiv.com)

Those arguments and that DNS record point to the Aether data center. Note that the index from the command line and name of the DNS record do not match up (if you need a reference, see the WorldDCGroupType sheet here).

The lobby proxy will rewrite some packets to make the game client connect to the zone proxy. From there, you can intercept packets in normal gameplay.

Footnotes

  1. Machina requires WinPcap installed to work without administrative privileges.

  2. Machina versions v2.4.2.2 and above require Deucalion to deobfuscate some obfuscated packets.

About

FFXIV network proxy library

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Temporal Stasis

Temporal Stasis is a FFXIV network proxy library.

Unlike traditional packet capturing tools, Temporal Stasis stands between the game client and game server as a proxy, decrypting/decompressing messages and repackaging them on the fly. Temporal Stasis can be used as a library to record, drop, and even modify packets. Because it's a proxy, Temporal Stasis doesn't require modifying your game install at all, and you don't have to inject into the game process to use Temporal Stasis.

Here's a simple comparison between other packet capturing tools:

ProjectWorks without adminUsable as a libraryWorks without injectionSupports packet modification
Temporal Stasis
Deucalion
Chronofoil
Machina⚠️1⚠️2

Requirements

There are three "layers" of the FFXIV protocol that must be handled: encryption (in the lobby server), compression (in the zone server), and obfuscation (in some zone server packets). There's also some extra things that change often (like packet opcodes).

  • Temporal Stasis requires the Oodle Network Compression library. This must be present at runtime so Temporal Stasis can load it and decompress packets.
    • Libraries for Oodle Network Compression can be obtained here (in the Releases tab). For Windows users, extract oodle-network-shared.dll from msvc.zip and place it next to your application executable.
    • In the future, Temporal Stasis may allow loading Oodle from the FFXIV game executable.
  • Temporal Stasis does not deobfuscate packets. Note that obfuscation only applies to some fields of some packets in the zone server, and you might not need to worry about packet obfuscation, depending on your use case.
    • Deobfuscating packets is outside the scope of Temporal Stasis, as packet obfuscation changes every game update. You can combine Temporal Stasis with a library like Unscrambler, if you need.
  • Temporal Stasis does not provide packet opcodes or structs. IPC packet opcodes change every game update, and their fields shift often. If you are reading data out of specific packets, you are expected to know the current opcode and layout of the packet.
  • Temporal Stasis automatically provides the offsets and opcodes required for the lobby server (specifically the EncryptionInit segment and the EnterWorld packet). If these values are out of date, you must provide the correct values (in the LobbyProxyConfig class) for Temporal Stasis to work correctly.

Usage

Temporal Stasis is a library, and you're intended to use it in your own code. There's an example project in this repository (TemporalStasis.Example) that can show you around the API.

To connect to Temporal Stasis, you need to redirect the game client to connect to your proxy instead of the original lobby server, and then your proxy will then connect to the original lobby server. This can be done in a few ways:

  • Pass arguments to the game client to override the default lobby server (DEV.LobbyHost04=127.0.0.1 DEV.LobbyPort04=44994)
  • Set up a custom DNS server and override the lobby server DNS records (neolobby02.ffxiv.com)

Those arguments and that DNS record point to the Aether data center. Note that the index from the command line and name of the DNS record do not match up (if you need a reference, see the WorldDCGroupType sheet here).

The lobby proxy will rewrite some packets to make the game client connect to the zone proxy. From there, you can intercept packets in normal gameplay.

Footnotes

  1. Machina requires WinPcap installed to work without administrative privileges.

  2. Machina versions v2.4.2.2 and above require Deucalion to deobfuscate some obfuscated packets.

About

FFXIV network proxy library

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Temporal Stasis

Temporal Stasis is a FFXIV network proxy library.

Unlike traditional packet capturing tools, Temporal Stasis stands between the game client and game server as a proxy, decrypting/decompressing messages and repackaging them on the fly. Temporal Stasis can be used as a library to record, drop, and even modify packets. Because it's a proxy, Temporal Stasis doesn't require modifying your game install at all, and you don't have to inject into the game process to use Temporal Stasis.

Here's a simple comparison between other packet capturing tools:

ProjectWorks without adminUsable as a libraryWorks without injectionSupports packet modification
Temporal Stasis
Deucalion
Chronofoil
Machina⚠️1⚠️2

Requirements

There are three "layers" of the FFXIV protocol that must be handled: encryption (in the lobby server), compression (in the zone server), and obfuscation (in some zone server packets). There's also some extra things that change often (like packet opcodes).

  • Temporal Stasis requires the Oodle Network Compression library. This must be present at runtime so Temporal Stasis can load it and decompress packets.
    • Libraries for Oodle Network Compression can be obtained here (in the Releases tab). For Windows users, extract oodle-network-shared.dll from msvc.zip and place it next to your application executable.
    • In the future, Temporal Stasis may allow loading Oodle from the FFXIV game executable.
  • Temporal Stasis does not deobfuscate packets. Note that obfuscation only applies to some fields of some packets in the zone server, and you might not need to worry about packet obfuscation, depending on your use case.
    • Deobfuscating packets is outside the scope of Temporal Stasis, as packet obfuscation changes every game update. You can combine Temporal Stasis with a library like Unscrambler, if you need.
  • Temporal Stasis does not provide packet opcodes or structs. IPC packet opcodes change every game update, and their fields shift often. If you are reading data out of specific packets, you are expected to know the current opcode and layout of the packet.
  • Temporal Stasis automatically provides the offsets and opcodes required for the lobby server (specifically the EncryptionInit segment and the EnterWorld packet). If these values are out of date, you must provide the correct values (in the LobbyProxyConfig class) for Temporal Stasis to work correctly.

Usage

Temporal Stasis is a library, and you're intended to use it in your own code. There's an example project in this repository (TemporalStasis.Example) that can show you around the API.

To connect to Temporal Stasis, you need to redirect the game client to connect to your proxy instead of the original lobby server, and then your proxy will then connect to the original lobby server. This can be done in a few ways:

  • Pass arguments to the game client to override the default lobby server (DEV.LobbyHost04=127.0.0.1 DEV.LobbyPort04=44994)
  • Set up a custom DNS server and override the lobby server DNS records (neolobby02.ffxiv.com)

Those arguments and that DNS record point to the Aether data center. Note that the index from the command line and name of the DNS record do not match up (if you need a reference, see the WorldDCGroupType sheet here).

The lobby proxy will rewrite some packets to make the game client connect to the zone proxy. From there, you can intercept packets in normal gameplay.

Footnotes

  1. Machina requires WinPcap installed to work without administrative privileges.

  2. Machina versions v2.4.2.2 and above require Deucalion to deobfuscate some obfuscated packets.

About

FFXIV network proxy library

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Temporal Stasis

Temporal Stasis is a FFXIV network proxy library.

Unlike traditional packet capturing tools, Temporal Stasis stands between the game client and game server as a proxy, decrypting/decompressing messages and repackaging them on the fly. Temporal Stasis can be used as a library to record, drop, and even modify packets. Because it's a proxy, Temporal Stasis doesn't require modifying your game install at all, and you don't have to inject into the game process to use Temporal Stasis.

Here's a simple comparison between other packet capturing tools:

ProjectWorks without adminUsable as a libraryWorks without injectionSupports packet modification
Temporal Stasis
Deucalion
Chronofoil
Machina⚠️1⚠️2

Requirements

There are three "layers" of the FFXIV protocol that must be handled: encryption (in the lobby server), compression (in the zone server), and obfuscation (in some zone server packets). There's also some extra things that change often (like packet opcodes).

  • Temporal Stasis requires the Oodle Network Compression library. This must be present at runtime so Temporal Stasis can load it and decompress packets.
    • Libraries for Oodle Network Compression can be obtained here (in the Releases tab). For Windows users, extract oodle-network-shared.dll from msvc.zip and place it next to your application executable.
    • In the future, Temporal Stasis may allow loading Oodle from the FFXIV game executable.
  • Temporal Stasis does not deobfuscate packets. Note that obfuscation only applies to some fields of some packets in the zone server, and you might not need to worry about packet obfuscation, depending on your use case.
    • Deobfuscating packets is outside the scope of Temporal Stasis, as packet obfuscation changes every game update. You can combine Temporal Stasis with a library like Unscrambler, if you need.
  • Temporal Stasis does not provide packet opcodes or structs. IPC packet opcodes change every game update, and their fields shift often. If you are reading data out of specific packets, you are expected to know the current opcode and layout of the packet.
  • Temporal Stasis automatically provides the offsets and opcodes required for the lobby server (specifically the EncryptionInit segment and the EnterWorld packet). If these values are out of date, you must provide the correct values (in the LobbyProxyConfig class) for Temporal Stasis to work correctly.

Usage

Temporal Stasis is a library, and you're intended to use it in your own code. There's an example project in this repository (TemporalStasis.Example) that can show you around the API.

To connect to Temporal Stasis, you need to redirect the game client to connect to your proxy instead of the original lobby server, and then your proxy will then connect to the original lobby server. This can be done in a few ways:

  • Pass arguments to the game client to override the default lobby server (DEV.LobbyHost04=127.0.0.1 DEV.LobbyPort04=44994)
  • Set up a custom DNS server and override the lobby server DNS records (neolobby02.ffxiv.com)

Those arguments and that DNS record point to the Aether data center. Note that the index from the command line and name of the DNS record do not match up (if you need a reference, see the WorldDCGroupType sheet here).

The lobby proxy will rewrite some packets to make the game client connect to the zone proxy. From there, you can intercept packets in normal gameplay.

Footnotes

  1. Machina requires WinPcap installed to work without administrative privileges.

  2. Machina versions v2.4.2.2 and above require Deucalion to deobfuscate some obfuscated packets.

About

FFXIV network proxy library

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages