Download SoV for Windows
Download SoV for Mac OS X
Github project page

Ever wanted to play Starcraft with a friend who is behind a VPN (like OpenVPN) but the game just didn’t appear in the UDP local network list ?

This tool is meant to start UPD LAN games even over VPN. The problem is that VPNs don’t forward and translate broadcast UDP packets.

It works by using libPcap to intercept such broadcast packets from starcraft and injecting them into the VPNs interface. Your partner (who created the game) sees your broadcast packet, replies, and you see his game appear in your list. (Starcraft doesn’t use broadcast UDP after that, so once you have joined the game, you can quit SoV, or just ignore it)

Because this forwards any broadcast packet according to parameters, this may work with any game/service discovery and other similar UPD-broadcast based protocols

Please be advised, using this tool is a bit complicated, and it requires some understanding of IP. Sorry about that…

Downloads

Instructions

The principle is simple:

If you are running Windows, please scroll down.

If you are running Mac OS X, please follow the instructions for Mac OS X.

Windows

1) Installation - Finding your interfaces

c:\SoV_2_win32\>SoV /L


Here is a list of active accessible interface names :
\Device\NPF_{3C8154E6-F470-48E4-892B-EEB8B3C881A4}
Description: Intel(R) 82566DC-2 Gigabit Network Connection (Microsoft's Packet Scheduler)
10.0.0.30        mask: 255.255.255.0    cast: 255.255.255.255  gate: n/a
\Device\NPF_{88984140-205F-4A82-91CB-0B57246ACD18}
Description: TAP-Win32 Adapter V9 (Microsoft's Packet Scheduler)
192.168.10.6     mask: 255.255.255.252  cast: 255.255.255.255  gate: n/a

Finding your interface names:

In the interface listing above, in blue and with a box around them, are the name of the devices. You will need to write down 2 devices, which you should recognise using the IP address displayed:

2) Check connectivity

Without bi-directional connectivity, no point in continuing ! — It just wont work.

3) Start the games

4.a) Running in UDP RAW mode

c:\SoV_2_win32\>SoV \Device\NPF_{3C8154E6-F470-48E4-892B-EEB8B3C881A4} 192.168.10.7
Running... Press CTRL+C to stop.
Captured : 7   sent: 7    errors: 0

4.b) Running in UDP Bound mode

c:\SoV_2_win32\>SoV /bind \Device\NPF_{3C8154E6-F470-48E4-892B-EEB8B3C881A4} 192.168.10.7
Running... Press CTRL+C to stop.
Captured : 7   sent: 7    errors: 0

4.c) Running in Injection mode

( This is quite different on Mac OS X, see Mac OS X Injection Mode .)

Ok, now this will be a major PIA, but we can try. The trouble is that we have to rebuild much of the packet, and because were cheating, we have no help. Someone can write this better Im sure. Here goes.

c:\SoV_2_win32\>SoV /f "icmp" /pc
                \Device\NPF_{88984140-205F-4A82-91CB-0B57246ACD18} 192.168.10.7
Running... Press CTRL+C to stop.
Captured : 0   sent: 0   errors: 0
Got packet:
=ethe: from 00:FF:88:98:41:40 to 00:FF:89:98:41:42
=  ip: from 192.168.10.6 to 192.168.10.7
=icmp: type 8 (code 0)
... may be some more, stop it at this point with CTRL + C ...
c:\SoV_2_win32\>SoV \Device\NPF_{3C8154E6-F470-48E4-892B-EEB8B3C881A4}
                /i \Device\NPF_{88984140-205F-4A82-91CB-0B57246ACD18}
                192.168.10.7 /esrc 00:FF:88:98:41:40 /edst 00:FF:88:98:41:42
Running... Press CTRL+C to stop.
Captured : 5   sent: 5   errors: 0

Mac OS X

1) Installation - Finding your interfaces

~ $ mkdir sov && cd sov
~/sov $ curl -O http://s-softs.com/Projects/SoV/SoV_2_osx.zip
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100  4706  100  4706    0     0  14007      0 --:--:-- --:--:-- --:--:-- 20460
~/sov $ unzip SoV_2_osx.zip
Archive:  SoV_2_osx.zip
inflating: sov
~/sov $ chmod +x sov
# make it executable :)
\~/sov $ sudo ./sov -l


Here is a list of active accessible interface names :
en0
10.0.0.40        mask: 255.255.255.0    cast: 10.0.0.255       gate: n/a
tun0
192.168.10.1     mask: 255.255.255.255  cast: n/a              gate: 192.168.10.2
en1
10.0.0.41        mask: 255.255.255.0    cast: 10.0.0.255       gate: n/a
lo0
127.0.0.1        mask: 255.0.0.0        cast: n/a              gate: n/a
The rest of the instructions are the same as the windows version.
  • The only difference is that \Device\.... long thing looks like en0, and that you should always sudo the commands !.
  • So go on to step Finding your interfaces !

4.c) Injection Mode

No need to do the whole ethernet MAC address kung-fu:

    ~/sov $ sudo ./sov en1 -i tun0 192.168.10.7
    Password:
    Running... Press CTRL+C to stop.
    Captured : 1   sent: 1   errors: 0    

Same thing: if it works, play and enjoy, if it doesnt, please try further troubleshooting

Switches

Switch Argument Description
-p port Set interception and forwarding target port
default: 6111
-f pcap filter Force PCap filter to a specific value. Format described in man pcap-filter (cheatsheets)
default: udp port 6111 and dst net 255.255.255.255
-bind   Use bound UDP socket to forward packets. See 4.b.
-i device_name Inject packets into specified device using PCap (instead of UDP socket). See 4.c.
-esrc
-edst
MAC in hex
eg: 11:22:33:44:55:AA
Windows only. Set source and destination MAC address to use when injecting packets.
-nost   Dont print packet statistics
-pc   Print captured packets summary details
-pr   Print captured packets summary details and hex dump of raw contents
-v   Activate verbose mode. Output more about what SoV is doing.
-L   List available interfaces and exit.
-h   Show the list of options and exit.
-ver   Show version information and exit.

Troubleshooting

Change Log

Source code

The project’s source is hosted at http://github.com/ddlsmurf/SoV

Contributions welcome !

Technical info

In short: intercepts StarCrafts game discovery UDP broadcast packets and reinjects to a specific IP and interface to avoid broadcasts being blocked at VPNs (and NATs).

There no specific understanding of StarCraft packets, any similar UDP packets may be forwarded (using the /p port switch).

When StarCraft is looking for a game:

That broadcast packet is not forwarded by mosts VPNs.

SoV uses pcap to snoop in on the network, and looks for StarCraft packets.

When it finds one, it makes a copy, changes the destination to go specifically to the game host.

Just because its not a broadcast packet, like all other StarCraft packets, it gets caried by VPNs and the like just fine.

Here is a quick summary of how the injection methods sum up and work. Understanding of low level UDP packet headers is helpful.

OSI UDP Packet Layer Injection method Trigger flag Windows Mac OS X
2 Ethernet
(eg: MAC addresses)
injection
(Windows)
/i interface Requires injection interface,
correct MAC addresses,
uses failable logic to find IP.
Requires injection interface,
uses failable logic to find IP.
3 IP
(eg: IPv4 addresses)
injection
(Mac OS X)
4 UDP
(eg: port numbers)
RAW UDP
socket(SOCK_RAW)
default Works fine on XP.
Untested
Seems to work fine
Data Bound UDP
socket(SOCK_DGRAM)
bind()
/bind Works fine on XP.
Fails on Windows 7 on socket bind (already in use).
Seems to work fine

Credits

Known Issues

Licence and Copyright

'twas written by Eric Doughty-Papassideris

Licence: IDC v2.0 ("I Dont Care")

Disclaimer

You're getting this for free, and it comes with no garantees whatsoever. It comes as-is. I don't want to know about what happened (or not) because of this code. You are getting it "as-is", and it "is not my problem".

I am in no way affiliated with Blizzard Entertainment nor StarCraft. They are, Im quite sure, registered trademarks (and a grrrrreat game ^^). Same goes for Mac OS X, libpcap, WinPcap and Windows. (grrreat games — all of 'em)