Wiimms mkw-ana (tool)

From Custom Mario Kart
Revision as of 15:54, 14 February 2013 by Wiimm (talk | contribs)
Jump to navigation Jump to search

The tools mkw-ana is a new project by Wiimm to analyze the network protocol of Mario Kart Wii.



In Progress
This article is managed by Wiimm will grow slowly. Feel free to edit typos and grammatical or speech issues.


Intention

In November 2012, Wiimm decided to analyze the network protocol of Mario Kart Wii. The main goal was to discover online cheaters. Another goal is to set up his own server if any time Nintendo will shut down its servers.

So the main feature is to dump the packets of a tcpdump (done by tcpdump or wireshark) in a user-friendly format. After first experiments, it becomes also a live racing statistic tool.

Terms and definition

Template:MKWii Network Terms

The Tool

Built-in Help

Let's start with the built-in help as an overview about the tool:

Usage: mkw-ana [option]... [dumpfile]...

Commands:

  HELP                  Print this help and exit.
  DEVELOP               Special development tests.
  TEST                  Test options.

  D1|DUMP1 [file]...    Packet based hex dumper.
  D2|DUMP2 [file]...    First record base hex dumper.
  D3|DUMP3 [file]...    New and improved variant of DUMP2 (record based).
  D|DUMP [file]...      Use the best/latest dumping mode (depends on options).

  F|FLOWRATES [file]... Print flowrates (all TCP dumps, not only MKWii).
                        Use --brief for final statistics only.

  C|CLIENTS [file]...   List all clients.
  U|USERS [file]...     List all users.
  R|RECORDS [file]...   Print all record names.
  S|STAGES [file]...    Print all stages.
  L|LOG [file]...       Print all stages including tables.
    TRACKS [file]...    Print all track selections.
  T|TOTALS [file]...    Print all totals as text dump.

  RACE [file]...        Live dump of senders race statitics to the screen.

Options:

  -h --help           : Print this help and exit.
  -w --width          : Define terminal width.
  -O --old            : Enable old features and disable --new.
  -N --new            : Enable new features and disable --old.

     --sleep float    : Sleep seconds after race finished.
     --skip  float    : Skip first seconds of each tcpdump.
                        Negative values are relative to the end (not stdin).
     --term  float    : Terminate each dump at timestamp (seconds).
                        Negative values are relative to the end (not stdin).
     --combine        : Logical combine dumps to one for --skip and --term.
  -W --write file     : Write filtered packets as PCAP to the 'file'.
     --home addr      : Define an IP (or name) as home client.
     --wii  addr      : Define an IP (or name) of the Wii. Only packets from
                        and to this address are analyzed. If --home is not set,
                        'addr' is also used to define the home client.


  -p --no-proxy       : Ignore proxy packets.
  -r --receive        : Select received packets.
  -s --send           : Select send packets.
  -L --length ranges  : Select UDP packets by UDP data length.
  -S --stage list     : Select stage types, print only matched records.
  -t --type list      : Select record types, print packet if one record match.
  -T --TYPE list      : Select record types, print only matched records.
  -I --index ranges   : Dump only bytes selected by range list.

  -b --brief          : Suppress header info.
  -l --long           : Extended header info.
     --rel            : Print timestamps as relative seconds.
  -1 --one-line       : Dump one line per record.
                        If set twice, bind race records to one record.
  -2 --sep-lines      : Dump one line per record & an empty line between records.
  -a --ascii          : Append ASCII character dump.
  -x --hex-only       : Suppress AI and dump only hex values.
  -f --follow         : Follow last input file like 'tail -f'

     --bmg  file      : Read a BMG text file to scan track names and disable
                        auto load of BMG files. Multiple usage allowed.

     --log  file      : Log into the file. If first char is a '+', append data.
     --md   file      : Create a MakeDoc script with results after each race.
     --mdx  file      : Same as --md, but replace %E, %R, %N and %T in 'file'
                        by 'event id', 'race id', 'total race' and 'event type'.
     --php  file      : Create a php script with results after each race.
     --phpx file      : Same as --php, but replace %E, %R, %N and %T in 'file'
                        by 'event id', 'race id', 'total race' and 'event type'.
     --mii dir        : Command USERS: Extract Miis to existing directory 'dir'.

General Description

The tool started as simple hex dumper reading network dumps in PCAP format. In the first phase of the tool, the textual dumps of whireshark and tcpdump were much better. But after only a few days, the tool learned to handle records, clients, users, friend codes and Miis. From this moment the tool was better to analyze the Mario Kart Wii traffic.

Now, mkw-ana split the traffic into records and scans some data to detect stages of the online meeting. Stages are for example room, prepare race, count down, racing and end of race. It is able to separate races into events (grand prix and team rand prix) and to calculate racing tables. Racing data can also be exported to support live statistics.

At the moment there are three different kinds of hexdumps. All 3 are able to dump in one line mode to have large tables. Tool less is here a very good tool for vertical and horizontal scrolling. The stages are includes into the dump as comment lines. The dumped records can be filters by sending, receiving, proxy, record types, stage types and packet length. It is also possible to select the dumped bytes by indices and ranges.

Another feature is, that mkw-ana can read comment files. If making videos of the dumped meetings, you can write such comment file. Each line starts with a timestamp followed by a comment. Virtual Dub is a good tool for this job. Then you must synchronize the comment file with the network dump. The start of the first game ("GO" in the video) is a very good point for synchronization. Here is an example of a comment file (in german):

>2012-12-05 19:10:39.745 - 12:22.792
0:00:00.000 Video Start

0:12:22.792 Rennen 1.1, GO!
0:12:54.123 Tinti wird angekündigt, T=0:31.322
0:14:17.924 Power wird angekündigt, T=1:55.120
0:15:33.633 Blitz schlägt ein, T=1:35.326
...
Notes
  • The first line ist the real time of the start of the race minus the video time stamp. This is the synchronisation. An synchronisation can be done multiple times.
  • The line with video timestamp and comment follow. The focus of the comment change as the point of interest.

???

Dumping Data

Options

Download

Here is the v0.04 of the tool mkw-ana: mkw-ana-v0.05-r1429.zip (240 kB)

  • It contains binaries for:
    • Linux i386
    • Linux x86_64
    • Cygwin/Windows (A Cygwin system must be installed).
  • Some scripts as examples.

It is an alpha distribution and and only minimal support will be given at the moment.

Capture the network data

First you must capture the network traffic of the Wii. Therefore you must redirect it to a PC running a capture software. There are 3 general ways to to this:

  • If you have a manageable switch, enable port mirroring and send all Wii traffic to a PC.
  • Use your PC as router.
  • Use old network hubs (not switches). A hub will mirror all traffic of all ports to all others; it's just a multi port repeater and will slow down your network.

Use a software like tcpdump or wireshark to capture the data. Best is to save the captured data directly to a file or to send it to other commands like mkw-ana for a live analysis.

It's also possible to save the data to a file and to make a live analysis at the same time. Use the following command pipe:

tcpdump -w- -U -i eth1 host wii | tee save.dump | mkw-ana ...

If using wireshark, save the dump to a file and use the following command for a live analysis:

mkw-ana --follow DUMPFILE ...

Live Statistics

mkw-ana can scan the network traffic in real time and can produce makedoc or php data files. Together with ssh and an cgi script, a live statistic is created. Live means that the tables are updates 2-5 seconds after the race have finished.

How it works

The whole job is done by 3 processes:

  1. First, you must capture the network traffic like described above. Then use one of the commands:
    ... | mkw-ana log --md  DATAFILE
    ... | mkw-ana log --php DATAFILE
    mkw-ana --follow DUMPFILE log --md  DATAFILE
    mkw-ana --follow DUMPFILE log --php DATAFILE
    
  2. Each time, a new DATAFILE is written, it must be transferred to the web server. A script using shh, sftp scp or ftp within an endless loop will do this job automatically.
  3. Last not least, a CGI or PHP script running at the web server must read the data files to serve a html-page to the visitors.

To see, what live means, visit the live statistics on Wednesday or Thursday between 19:10 and 20:30 CET (Central European Time).

Links