From 4827a1eb0784655893aa81431337b52314019f98 Mon Sep 17 00:00:00 2001 From: Bottersnike Date: Tue, 21 Dec 2021 01:19:43 +0000 Subject: [PATCH] More information --- images/200_only.png | Bin 0 -> 3746 bytes images/lz77.png | Bin 0 -> 16761 bytes index.html | 27 +- packet.html | 3 + protocol.html | 1392 +++++++++++++++++++++++++++++++++++++++++++ styles.css | 12 +- transport.html | 13 +- 7 files changed, 1441 insertions(+), 6 deletions(-) create mode 100644 images/200_only.png create mode 100644 images/lz77.png create mode 100644 protocol.html diff --git a/images/200_only.png b/images/200_only.png new file mode 100644 index 0000000000000000000000000000000000000000..82474f60cdc713f89cc49df68ea569b58bc6c565 GIT binary patch literal 3746 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 literal 0 HcmV?d00001 diff --git a/images/lz77.png b/images/lz77.png new file mode 100644 index 0000000000000000000000000000000000000000..44eb25f8e169a8bd9906eca07ba97936905f4a46 GIT binary patch literal 16761 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 UH&;sContents Transport layer Packet format + Application Protocol @@ -36,7 +37,7 @@

If you're here because you work on one of those aforementioned closed source projects, hello! Feel free to share knowledge with the rest of the world, or point out corrections. Or don't; you do you.

-

Contents

+

Contents

  1. Transport layer
    1. @@ -52,7 +53,29 @@
-

This site intentionally looks not-great. I don't feel like changing that, and honestly quite like the aesthetic.

+

Getting started

+

My aim with these pages is to cover as much as possible, so you don't need to try and figure them out yourself. + That said, being able to follow along yourself will almost certainly help get more out of this. For following + along with source code, you're really going to want to grab yourself a dumped copy of a game (it's going to be a + lot easier, and cheeper, than dumping one yourself). I trust you can figure out where to find that.

+

For network related things, your options are a little broader. The ideal would be physical ownership of a + cabinet, and a subscription to genuine e-amusement. Odds are you don't have both of those :P. A connection to an + alternative network works just as well. In the more likely case that you don't have a physical cabinet, it's + time to crack out that dumped copy of a game and just run it on your own PC (or a VM, if you're not on Windows) + (odds are whatever you downloaded came with the program you'll need to start it pre-packaged. If not, it rhymes + with rice.).

+

You will also need a local e-amusement-emulating server. By the time I'm done with these pages, there will + hopefully be everything you need to be able to write your own. Unfortunately I'm not finished writing them; + depending on where you acquired your game, it may have shipped with one of said servers. If it didn't, Asphyxia + CORE will do the trick (yes, it's closed source).

+

If this all sounds like way too much work, and/or you're just here because of curiosity, I plan to prepare some + pcaps of network traffic to play around with without needing a running copy of a game or a network tap on a cab. +

+ + Next page + +

This site intentionally looks not-great. I don't feel like changing that, and honestly quite like the + aesthetic.

\ No newline at end of file diff --git a/packet.html b/packet.html index f8a362a..1c6fba0 100644 --- a/packet.html +++ b/packet.html @@ -17,6 +17,7 @@ Contents Transport layer Packet format + Application Protocol @@ -888,6 +889,8 @@ self.request_allocation(4)

+ Prev page | Next page + \ No newline at end of file diff --git a/protocol.html b/protocol.html new file mode 100644 index 0000000..c52a178 --- /dev/null +++ b/protocol.html @@ -0,0 +1,1392 @@ + + + + + + + + Packet format | eAmuse API + + + + + + + + + + + + + +
ContentsTransport layerPacket formatApplication Protocol
+ +

Application Protocol

+

As the previous pages have eluded to (you did read them, didn't you?), eAmuse uses HTTP as its main way of + getting data around. This means we need an HTTP server running but, as we'll see, we don't need to think too + hard about that.

+

Every request made is a POST request, to //<model>/<module>/<method>, + with its body being encoded data as described in the previous sections. In addition to the + X-Compress: and X-Eamuse-Info: headers previously detailed, there is also a + X-PCB-ID: header. that can be set. Your machine's PCB ID uniquely defines the physical board. This + header is added in out-bound requests, and allows the server to identify you. Importantly, it's also the value + that the server uses to identify which machines are authorized to be on the network, and which are not. +

+

Every request is followed immediately by a response. Any response code other than 200 is considered + a failure.

+ +
+ Source code details +
+ +
libavs-win32-ea3.dll:0x1000f8e7
+
+
+ +

All requests follow a basic format:

+
<call model="model" srcid="srcid" tag="tag">
+    <module method="method" ...attributes>
+        children
+    </module>
+</call>
+

The responses follow a similar format:

+
<response>
+    <module status="status" ...attributes>
+        children
+    </module>
+</response>
+

With "0" being a successful status. Convention is to identify a specific method as + module.method, and we'll be following this convention in this document too. There are + a lot of possible methods, so the rest of this document is a big reference for them all. There are a + number of generic methods, and a number of game specific ones. If you haven't clocked yet, I've been working on + an SDVX 4 build for most of these pages, and each game also comes with its own set of game-specific methods. + These are namespaces under the game.%s module and, in the case of SDVX 4, are all + game.sv4_method. I may or may not document the SDVX 4 specific methods, but I've listed them + here anyway for completeness. +

+ + +

eventlog

+

eventlog.write

+

Request:

+
<call ...>
+    <eventlog method="write">
+        <retrycnt __type="u32" />
+        <data>
+            <eventid __type="str" />
+            <eventorder __type="s32" />
+            <pcbtime __type="u64" />
+            <gamesession __type="s64" />
+            <strdata1 __type="str" />
+            <strdata2 __type="str" />
+            <numdata1 __type="s64" />
+            <numdata2 __type="s64" />
+            <locationid __type="str" />
+        </data>
+    </eventlog>
+</call>
+

Event ID list:

+
    +
  • G_GAMED
  • +
  • S_ERROR
  • +
  • T_OTDEMO
  • +
+

Response:

+
<response>
+    <eventlog status="status">
+        <gamesession __type="s64" />
+        <logsendflg __type="s32" />
+        <logerrlevel __type="s32" />
+        <evtidnosendflg __type="s32" />
+    </eventlog>
+</response>
+ + +

playerdata

+

playerdata.usergamedata_send

+

Request:

+
<call ...>
+    <playerdata method="usergamedata_send">
+        placeholder
+    </playerdata>
+</call>
+

Response:

+
<response>
+    <playerdata status="status">
+        placeholder
+    </playerdata>
+</response>
+ +

playerdata.usergamedata_recv

+

Request:

+
<call ...>
+    <playerdata method="usergamedata_recv">
+        <data>
+            <refid __type="str">
+            <dataid __type="str">
+            <gamekind __type="str">
+            <recv_num __type="u32">
+        </data>
+    </playerdata>
+</call>
+
<call ...>
+    <playerdata method="usergamedata_recv">
+        <data>
+            <refid __type="str">
+            <dataid __type="str">
+            <gamekind __type="str">
+            <recv_csv __type="str">
+        </data>
+    </playerdata>
+</call>
+

Response:

+
<response>
+    <playerdata status="status">
+        placeholder
+    </playerdata>
+</response>
+ +

playerdata.usergamedata_inheritance

+

Request:

+
<call ...>
+    <playerdata method="usergamedata_inheritance">
+        placeholder
+    </playerdata>
+</call>
+

Response:

+
<response>
+    <playerdata status="status">
+        placeholder
+    </playerdata>
+</response>
+ +

playerdata.usergamedata_condrecv

+

Request:

+
<call ...>
+    <playerdata method="usergamedata_condrecv">
+        placeholder
+    </playerdata>
+</call>
+

Response:

+
<response>
+    <playerdata status="status">
+        placeholder
+    </playerdata>
+</response>
+ +

playerdata.usergamedata_scorerank

+

Request:

+
<call ...>
+    <playerdata method="usergamedata_scorerank">
+        placeholder
+    </playerdata>
+</call>
+

Response:

+
<response>
+    <playerdata status="status">
+        placeholder
+    </playerdata>
+</response>
+ + +

matching

+

matching.request

+

Request:

+
<call ...>
+    <matching method="request">
+        placeholder
+    </matching>
+</call>
+

Response:

+
<response>
+    <matching status="status">
+        placeholder
+    </matching>
+</response>
+ +

matching.wait

+

Request:

+
<call ...>
+    <matching method="wait">
+        placeholder
+    </matching>
+</call>
+

Response:

+
<response>
+    <matching status="status">
+        placeholder
+    </matching>
+</response>
+ +

matching.finish

+

Request:

+
<call ...>
+    <matching method="finish">
+        placeholder
+    </matching>
+</call>
+

Response:

+
<response>
+    <matching status="status">
+        placeholder
+    </matching>
+</response>
+ + +

system

+

system.getmaster

+

Request:

+
<call ...>
+    <system method="getmaster">
+        placeholder
+    </system>
+</call>
+

Response:

+
<response>
+    <system status="status">
+        placeholder
+    </system>
+</response>
+ +

system.getlocationiplist

+

Request:

+
<call ...>
+    <system method="getlocationiplist">
+        placeholder
+    </system>
+</call>
+

Response:

+
<response>
+    <system status="status">
+        placeholder
+    </system>
+</response>
+ +

system.xrpcproxy

+

Request:

+
<call ...>
+    <system method="xrpcproxy">
+        placeholder
+    </system>
+</call>
+

Response:

+
<response>
+    <system status="status">
+        placeholder
+    </system>
+</response>
+ +

system.convcardnumber

+

Request:

+
<call ...>
+    <system method="convcardnumber">
+        placeholder
+    </system>
+</call>
+

Response:

+
<response>
+    <system status="status">
+        placeholder
+    </system>
+</response>
+ + +

esoc

+

esoc.read

+

Request:

+
<call ...>
+    <esoc method="read">
+        placeholder
+    </esoc>
+</call>
+

Response:

+
<response>
+    <esoc status="status">
+        placeholder
+    </esoc>
+</response>
+ +

esoc.write

+

Request:

+
<call ...>
+    <esoc method="write">
+        placeholder
+    </esoc>
+</call>
+

Response:

+
<response>
+    <esoc status="status">
+        placeholder
+    </esoc>
+</response>
+ + +

cardmng

+

cardmng.inquire

+

Request:

+
<call ...>
+    <cardmng method="inquire" cardid="" cardtype="" update="" />
+</call>
+

Response:

+
<response>
+    <cardmng status="status" />
+</response>
+ +

cardmng.getrefid

+

Request:

+
<call ...>
+    <cardmng method="getrefid">
+        placeholder
+    </cardmng>
+</call>
+

Response:

+
<response>
+    <cardmng status="status">
+        placeholder
+    </cardmng>
+</response>
+ +

cardmng.bindmodel

+

Request:

+
<call ...>
+    <cardmng method="bindmodel">
+        placeholder
+    </cardmng>
+</call>
+

Response:

+
<response>
+    <cardmng status="status">
+        placeholder
+    </cardmng>
+</response>
+ +

cardmng.bindcard

+

Request:

+
<call ...>
+    <cardmng method="bindcard">
+        placeholder
+    </cardmng>
+</call>
+

Response:

+
<response>
+    <cardmng status="status">
+        placeholder
+    </cardmng>
+</response>
+ +

cardmng.authpass

+

Request:

+
<call ...>
+    <cardmng method="authpass">
+        placeholder
+    </cardmng>
+</call>
+

Response:

+
<response>
+    <cardmng status="status">
+        placeholder
+    </cardmng>
+</response>
+ +

cardmng.getkeepspan

+

Request:

+
<call ...>
+    <cardmng method="getkeepspan">
+        placeholder
+    </cardmng>
+</call>
+

Response:

+
<response>
+    <cardmng status="status">
+        placeholder
+    </cardmng>
+</response>
+ +

cardmng.getkeepremain

+

Request:

+
<call ...>
+    <cardmng method="getkeepremain">
+        placeholder
+    </cardmng>
+</call>
+

Response:

+
<response>
+    <cardmng status="status">
+        placeholder
+    </cardmng>
+</response>
+ +

cardmng.getdatalist

+

Request:

+
<call ...>
+    <cardmng method="getdatalist">
+        placeholder
+    </cardmng>
+</call>
+

Response:

+
<response>
+    <cardmng status="status">
+        placeholder
+    </cardmng>
+</response>
+ + +

esign

+

esign.request

+

Request:

+
<call ...>
+    <esign method="request">
+        placeholder
+    </esign>
+</call>
+

Response:

+
<response>
+    <esign status="status">
+        placeholder
+    </esign>
+</response>
+ + +

package

+

package.list

+

Request:

+
<call ...>
+    <package method="list">
+        placeholder
+    </package>
+</call>
+

Response:

+
<response>
+    <package status="status">
+        placeholder
+    </package>
+</response>
+ +

package.intend

+

Request:

+
<call ...>
+    <package method="intend">
+        placeholder
+    </package>
+</call>
+

Response:

+
<response>
+    <package status="status">
+        placeholder
+    </package>
+</response>
+ + +

userdata

+

userdata.read

+

Request:

+
<call ...>
+    <userdata method="read">
+        placeholder
+    </userdata>
+</call>
+

Response:

+
<response>
+    <userdata status="status">
+        placeholder
+    </userdata>
+</response>
+ +

userdata.write

+

Request:

+
<call ...>
+    <userdata method="write">
+        placeholder
+    </userdata>
+</call>
+

Response:

+
<response>
+    <userdata status="status">
+        placeholder
+    </userdata>
+</response>
+ + +

services

+

services.get

+

Request:

+
<call ...>
+    <services method="get">
+        <info>
+            <AVS2 __type="str">AVS2 version</AVS2>
+        </info>
+    </services>
+</call>
+

Response:

+
<response>
+    <services expire="" method="get" mode="" status="status">
+        <item name="service" url="url" />
+    </services>
+</response>
+

Known services are:

+
    +
  • ntp
  • +
  • keepalive
  • +
  • cardmng
  • +
  • facility
  • +
  • message
  • +
  • numbering
  • +
  • package
  • +
  • pcbevent
  • +
  • pcbtracker
  • +
  • pkglist
  • +
  • posevent
  • +
  • userdata
  • +
  • userid
  • +
  • eacoin
  • +
  • local
  • +
  • local2
  • +
  • lobby
  • +
  • lobby2
  • +
  • dlstatus
  • +
  • netlog
  • +
  • sidmgr
  • +
  • globby
  • +
+

Most of these will usually just return the URL to the eAmuse server (or your fake one ;D). ntp is a notable exception, unless you're planning on reimplementing NTP. keepalive will likely alsop be a custom URL with query parameters pre-baked.

+ + +

pcbtracker

+

pcbtracker.alive

+

Request:

+
<call ...>
+    <pcbtracker method="alive" accountid="pcbid" ecflag="ecflag" hardid="hardware ID" softid="software ID" />
+</call>
+

Response:

+
<response>
+    <pcbtracker status="status" ecenable="" eclimit="" expire="" limit="" time="">
+</response>
+ + +

pcbevent

+

pcbevent.put

+

Request:

+
<call ...>
+    <pcbevent method="put">
+        placeholder
+    </pcbevent>
+</call>
+

Response:

+
<response>
+    <pcbevent status="status">
+        placeholder
+    </pcbevent>
+</response>
+ + +

message

+

message.get

+

Request:

+
<call ...>
+    <message method="get" />
+</call>
+

Response:

+ TODO: Investigate this response more +
<response>
+    <message expire="" status="status" />
+</response>
+ + +

facility

+

facility.get

+

Request:

+
<call ...>
+    <facility method="get">
+        placeholder
+    </facility>
+</call>
+

Response:

+
<response>
+    <facility status="status">
+        placeholder
+    </facility>
+</response>
+ + +

apsmanager

+

apsmanager.getstat

+

Request:

+
<call ...>
+    <apsmanager method="getstat">
+        placeholder
+    </apsmanager>
+</call>
+

Response:

+
<response>
+    <apsmanager status="status">
+        placeholder
+    </apsmanager>
+</response>
+ + +

sidmgr

+

sidmgr.create

+

Request:

+
<call ...>
+    <sidmgr method="create">
+        placeholder
+    </sidmgr>
+</call>
+

Response:

+
<response>
+    <sidmgr status="status">
+        placeholder
+    </sidmgr>
+</response>
+ +

sidmgr.open

+

Request:

+
<call ...>
+    <sidmgr method="open">
+        placeholder
+    </sidmgr>
+</call>
+

Response:

+
<response>
+    <sidmgr status="status">
+        placeholder
+    </sidmgr>
+</response>
+ +

sidmgr.touch

+

Request:

+
<call ...>
+    <sidmgr method="touch">
+        placeholder
+    </sidmgr>
+</call>
+

Response:

+
<response>
+    <sidmgr status="status">
+        placeholder
+    </sidmgr>
+</response>
+ +

sidmgr.branch

+

Request:

+
<call ...>
+    <sidmgr method="branch">
+        placeholder
+    </sidmgr>
+</call>
+

Response:

+
<response>
+    <sidmgr status="status">
+        placeholder
+    </sidmgr>
+</response>
+ +

sidmgr.close

+

Request:

+
<call ...>
+    <sidmgr method="close">
+        placeholder
+    </sidmgr>
+</call>
+

Response:

+
<response>
+    <sidmgr status="status">
+        placeholder
+    </sidmgr>
+</response>
+ + +

dlstatus

+

dlstatus.done

+

Request:

+
<call ...>
+    <dlstatus method="done">
+        placeholder
+    </dlstatus>
+</call>
+

Response:

+
<response>
+    <dlstatus status="status">
+        placeholder
+    </dlstatus>
+</response>
+ +

dlstatus.progress

+

Request:

+
<call ...>
+    <dlstatus method="progress" />
+        <progress __type="s32" />
+    </dlstatus>
+</call>
+

Response:

+
<response>
+    <dlstatus status="status">
+        placeholder
+    </dlstatus>
+</response>
+ + +

eacoin

+

eacoin.checkin

+

Request:

+
<call ...>
+    <eacoin method="checkin">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ +

eacoin.checkout

+

Request:

+
<call ...>
+    <eacoin method="checkout">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ +

eacoin.consume

+

Request:

+
<call ...>
+    <eacoin method="consume">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ +

eacoin.getbalance

+

Request:

+
<call ...>
+    <eacoin method="getbalance">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ +

eacoin.getecstatus

+

Request:

+
<call ...>
+    <eacoin method="getecstatus">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ +

eacoin.touch

+

Request:

+
<call ...>
+    <eacoin method="touch">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ +

eacoin.opchpass

+

Request:

+
<call ...>
+    <eacoin method="opchpass">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ +

eacoin.opchecking

+

Request:

+
<call ...>
+    <eacoin method="opchecking">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ +

eacoin.opcheckout

+

Request:

+
<call ...>
+    <eacoin method="opcheckout">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ +

eacoin.getlog

+

Request:

+
<call ...>
+    <eacoin method="getlog">
+        placeholder
+    </eacoin>
+</call>
+

Response:

+
<response>
+    <eacoin status="status">
+        placeholder
+    </eacoin>
+</response>
+ + +

traceroute

+

traceroute.send

+

Request:

+
<call ...>
+    <traceroute method="send">
+        placeholder
+    </traceroute>
+</call>
+

Response:

+
<response>
+    <traceroute status="status">
+        placeholder
+    </traceroute>
+</response>
+ + +

game

+

game.sv4_sample

+

Request:

+
<call ...>
+    <game method="sv4_sample">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_new

+

Request:

+
<call ...>
+    <game method="sv4_new">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_load

+

Request:

+
<call ...>
+    <game method="sv4_load">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_load_m

+

Request:

+
<call ...>
+    <game method="sv4_load_m">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_save

+

Request:

+
<call ...>
+    <game method="sv4_save">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_save_m

+

Request:

+
<call ...>
+    <game method="sv4_save_m">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_common

+

Request:

+
<call ...>
+    <game method="sv4_common">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_shop

+

Request:

+
<call ...>
+    <game method="sv4_shop">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_hiscore

+

Request:

+
<call ...>
+    <game method="sv4_hiscore">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_buy

+

Request:

+
<call ...>
+    <game method="sv4_buy">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_exception

+

Request:

+
<call ...>
+    <game method="sv4_exception">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_entry_s

+

Request:

+
<call ...>
+    <game method="sv4_entry_s">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_entry_e

+

Request:

+
<call ...>
+    <game method="sv4_entry_e">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_frozen

+

Request:

+
<call ...>
+    <game method="sv4_frozen">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_lounce

+

Request:

+
<call ...>
+    <game method="sv4_lounce">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_save_e

+

Request:

+
<call ...>
+    <game method="sv4_save_e">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_save_pb

+

Request:

+
<call ...>
+    <game method="sv4_save_pb">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_save_c

+

Request:

+
<call ...>
+    <game method="sv4_save_c">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_play_s

+

Request:

+
<call ...>
+    <game method="sv4_play_s">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_play_e

+

Request:

+
<call ...>
+    <game method="sv4_play_e">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_serial

+

Request:

+
<call ...>
+    <game method="sv4_serial">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_save_fi

+

Request:

+
<call ...>
+    <game method="sv4_save_fi">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_print

+

Request:

+
<call ...>
+    <game method="sv4_print">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_print_h

+

Request:

+
<call ...>
+    <game method="sv4_print_h">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_load_r

+

Request:

+
<call ...>
+    <game method="sv4_load_r">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ +

game.sv4_save_campaign

+

Request:

+
<call ...>
+    <game method="sv4_save_campaign">
+        placeholder
+    </game>
+</call>
+

Response:

+
<response>
+    <game status="status">
+        placeholder
+    </game>
+</response>
+ + + \ No newline at end of file diff --git a/styles.css b/styles.css index db022ef..b7fbc90 100644 --- a/styles.css +++ b/styles.css @@ -1,9 +1,10 @@ body { /* font-family: sans-serif; */ line-height: 1.25; - max-width: 720px; + max-width: 1000px; margin: 16px auto; color: #222; + padding: 0 16px; } table { @@ -37,7 +38,6 @@ p { } code { - display: inline-block; letter-spacing: .02em; padding: 2px 4px; font-size: 90%; @@ -46,7 +46,11 @@ code { border-radius: 4px; word-break: break-word; } +code > a { + color: inherit; +} pre > code { + display: block; word-break: normal; border-radius: 4px; background: #f8f8f8; @@ -55,10 +59,12 @@ pre > code { color: #333; padding: 9.5px; line-height: 1.4; + width: min-content; +} +pre { max-width: 100%; overflow-x: auto; display: block; - width: min-content; } summary { diff --git a/transport.html b/transport.html index da81e7c..9cefb75 100644 --- a/transport.html +++ b/transport.html @@ -14,6 +14,7 @@ Contents Transport layer Packet format + Application Protocol @@ -25,13 +26,21 @@
  • none
  • lz77
  • +
    + Source code details +
    + +
    libavs-win32-ea3.dll:0x1000fa29
    +
    +

    Encryption is performed after compression, and uses RC4. RC4 is symmetric, so decryption is performed the same as encryption. That is, packet = encrypt(compress(data)) and data = decompress(decrypt(data)).

    Encryption keys

    Encryption is not performed using a single static key. Instead, each request and response has its own key that is generated.

    These keys are generated baesd on the X-Eamuse-Info header.

    This header loosely follows the format 1-[0-9a-f]{8}-[0-9a-f]{4}. This corresponds to [version]-[serial]-[salt]. TODO: Confirm this

    -

    Our per-packet key is then generated using md5(serial | salt | KEY). Identifying KEY is left as an exercise for the reader, however should not be especially challenging.

    +

    Our per-packet key is then generated using md5(serial | salt | KEY). Identifying KEY is left as an exercise for the reader, however should not be especially challenging. Check the page source if you're stuck.

    +

    LZ77

    Packets are compressed using lzss. The compressed data structure is a repeating cycle of an 8 bit flags byte, followed by 8 values. Each value is either a single literal byte, if the corresponding bit in the preceeding flag is high, or is a two byte lookup into the window.

    @@ -39,5 +48,7 @@

    The exact algorithm used for compression is not especially important, as long as it follows this format. One can feasibly perform no compression at all, and instead insert 0xFF every 8 bytes (starting at index 0), to indicate that all values are literals. While obviously poor for compression, this is an easy way to test without first implementing a compressor.

    + Prev page | Next page + \ No newline at end of file