docs/templates/pages/smartea.html
2022-01-17 22:10:57 +00:00

221 lines
9.2 KiB
HTML

{% extends "base.html" %}
{% block title %}Smart E-Amusement{% endblock %}
{% block body %}
<h1>Smart E-Amusement</h1>
<p>So maybe you've turned on that checkbox before, and you're wondering what magic it used? Thankfully, source code for
that tool is actually shipped along with it (provided you have a legitimate copy) so we can have a look.</p>
<p>...and that's where the trail runs cold. Upon cracking open the source you will just be faced with walls of hardcoded
binary data. Let's take a serious look at what we have here instead.</p>
<p>The first important thing to note is that every single reply from easrv is hardcoded. This means their encryption is
also hardcoded, and sure enough the header is hardcoded to <code>1-53d121c7-a8b3</code> (in fact, the entire HTTP
header block is a hardcoded string!).</p>
<p>Many of these responses are only rqeuired by specific games. I've not yet compiled a list of which is for what game,
but consider it a future expansion coming later :).</p>
<h2><code>services.get</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<services>
<item name="cardmng" url="http://localhost:8080/" />
<item name="facility" url="http://localhost:8080/" />
<item name="message" url="http://localhost:8080/" />
<item name="package" url="http://localhost:8080/" />
<item name="pcbevent" url="http://localhost:8080/" />
<item name="pcbtracker" url="http://localhost:8080/" />
<item name="posevent" url="http://localhost:8080/" />
<item name="pkglist" url="http://localhost:8080/" />
<item name="dlstatus" url="http://localhost:8080/" />
<item name="eacoin" url="http://localhost:8080/" />
<item name="lobby" url="http://localhost:8080/" />
<item name="lobby2" url="http://localhost:8080/" />
<item name="local" url="http://localhost:8080/" />
<item name="local2" url="http://localhost:8080/" />
<item name="apsmanager" url="http://localhost:8080/" />
<item name="netlog" url="http://localhost:8080/" />
<item name="ntp" url="ntp://pool.ntp.org/" />
<item name="keepalive" url="http://localhost:8080/keepalive?pa=localhost&amp;ia=localhost&amp;ga=localhost&amp;ma=localhost&amp;t1=2&amp;t2=10" />
</services>
</response>{% endhighlight %}</pre>
<p>Fairly standard response here. Many more services are listed than actually available, but that's fine. The router
address (<code>ia</code>), gateway (<code>ga</code>) and centre (<code>ma</code>) are all set to
<code>localhost</code>, ensuring pings succeed.
</p>
<h2><code>pcbtracker.alive</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<pcbtracker ecenable="0" eclimit="0" expire="0" limit="0" status="0" />
</response>{% endhighlight %}</pre>
<p>Inform the game we have no intention of supporting PASELI. Implementing PASELI involves implementing carding, and is
a sizable amount of work. Smart EA exists to start games, not implement all features.</p>
<h2><code>message.get</code></h2>
<h3>Maintenance disabled:</h3>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<message status="0" />
</response>{% endhighlight %}</pre>
<p>Just report that there's nothing to process. Nice and simple.</p>
<h3>Maintenance enabled:</h3>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<message expire="300" status="0">
<item end="86400" name="sys.mainte" start="0" />
<item end="86400" name="sys.eacoin.mainte" start="0" />
</message>
</response>{% endhighlight %}</pre>
<p>When maintenance is enabled, we publish two messages. I believe the former is to announce the whole ea network is
under maintenance, and the latter PASELI-specific.</p>
<h2><code>facility.get</code></h2>
<p>This packet notably has its encoding bytes as <code>00 FF</code> which to the best of my knowledge is not a valid
encoding. I used Shift-JIS here to decode the location name.</p>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<facility>
<location>
<id __type="str">US-01</id>
<country __type="str">US</country>
<region __type="str">.</region>
<name __type="str">・ョ・ッ・ョ・・</name>
<type __type="u8">0</type>
</location>
<line>
<id __type="str">.</id>
<class __type="u8">0</class>
</line>
<portfw>
<globalip __type="ip4">1.0.0.127</globalip>
<globalport __type="s16">8888</globalport>
<privateport __type="s16">8888</privateport>
</portfw>
<public>
<flag __type="u8">1</flag>
<name __type="str">.</name>
<latitude __type="str">0</latitude>
<longitude __type="str">0</longitude>
</public>
<share>
<eacoin>
<notchamount __type="s32">0</notchamount>
<notchcount __type="s32">0</notchcount>
<supplylimit __type="s32">1000000</supplylimit>
</eacoin>
<url>
<eapass __type="str">http://localhost</eapass>
<arcadefan __type="str">http://localhost</arcadefan>
<konaminetdx __type="str">http://localhost</konaminetdx>
<konamiid __type="str">http://localhost</konamiid>
<eagate __type="str">http://localhost</eagate>
</url>
</share>
</facility>
</response>{% endhighlight %}</pre>
<p>Pretty standard <code>facility.get</code> response here, full of the usual fake values. Notably not even the share
URLs were lucky enough to get real data.</p>
<h2><code>pcbevent.put</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<pcbevent />
</response>{% endhighlight %}</pre>
<h2><code>package.list</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<package expire="1200" status="0" />
</response>{% endhighlight %}</pre>
<h2><code>tax.get_phase</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<tax>
<phase __type="s32">0</phase>
</tax>
</response>{% endhighlight %}</pre>
<h2><code>eventlog.write</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<eventlog>
<gamesession __type="s64">1</gamesession>
<logsendflg __type="s32">0</logsendflg>
<logerrlevel __type="s32">0</logerrlevel>
<evtidnosendflg __type="s32">0</evtidnosendflg>
</eventlog>
</response>{% endhighlight %}</pre>
<h2><code>machine.get_control</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<machine>
<command>
<arg __type="str">nop</arg>
</command>
</machine>
</response>{% endhighlight %}</pre>
<h2><code>info2.common</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<info2>
<event_ctrl />
</info2>
</response>{% endhighlight %}</pre>
<h2><code>pcb2.boot</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<shop2>
<sinfo>
<nm __type="str">AS</nm>
<cl_enbl __type="bool">1</cl_enbl>
<cl_h __type="u8">0</cl_h>
<cl_m __type="u8">0</cl_m>
</sinfo>
</shop2>
</response>{% endhighlight %}</pre>
<h2><code>pcb2.error</code></h2>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<pcb2 status="0" />
</response>{% endhighlight %}</pre>
<h2><code>system.getmaster</code></h2>
<p>Just an error response unless the game is one of...</p>
<h3>Steel Chronicle (<code>KGG-*</code>):</h3>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<system>
<result __type="s32">1</result>
<strdata1 __type="str">MSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwx</strdata1>
<strdata2 __type="str">MSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwx</strdata2>
<updatedate __type="u64">1120367223</updatedate>
</system>
</response>{% endhighlight %}</pre>
<h3>Metal Gear Arcade (<code>I36-*</code>):</h3>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<system>
<result __type="s32">1</result>
<strdata1 __type="str">MjAxMTA4MTAwMDoxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MToxOjE6MQ==</strdata1>
<strdata2 __type="str">MSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwx</strdata2>
<updatedate __type="u64">1120367223</updatedate>
</system>
</response>{% endhighlight %}</pre>
<h2><code>hdkoperation.get</code></h2>
<p>Only used by Steel Chronicle as far as I can tell</p>
<pre>{% highlight "cxml" %}<?xml version="1.0" encoding="SHIFT_JIS"?>
<response>
<hdkoperation>
<nr_entry __type="s32">1</nr_entry>
<param __type="str">0,0,0,0,0,0,0,0,0</param>
</hdkoperation>
</response>{% endhighlight %}</pre>
<h2><code>op2_common.get_music_info</code></h2>
<p>This one is really long. <a href="{{ROOT}}/smartea.op2_common.get_music_info.html">It's got its own dedicated
page</a> if you really want to see it anyway.</p>
<p>It appears to be specifically for Nostalgia Op.2, however this may be incorrect.</p>
{% endblock %}