Monday, December 16, 2013

Android: How to share folder over WiFi and access them from a Windows computer without rooting Android (using a Samba/SMB/CIFS server, a virtual computer, and some port-mapping)

Today I set myself a goal: being able to share a folder over WiFi on my Galaxy S4 (stock, not rooted) and access this shared folder from my computer (running Windows 7).

Everybody will tell you that's not possible because Windows can only access an SMB/CIFS share on the standard TCP port 445, and on a non rooted Android device a normal app can't open port in the 1-1024 range.

On a rooted Android you can use an app like Samba Filesharing for Android and this will start a SMB server on port 445 on you Androi device.
But you need a rooted device, and I don't want to root my Galaxy S4 (not yet).

So on a non-rooted device you can install another SMB server app, like Samba Server, but in this way the SMB service will work on non-standard port, like the TCP port 7777. And Windows computer can't connect to a shared folder on a TCP port other than 445.

But this is only a simple TCP connection on a standard TCP port, so I thought I should be able to map/forward a TCP connection from a port 445 to a port 7777 (the one used by Samba Server), and make it work.

Usually mapping/forwarding a TCP port is a very simple thing on windows, there are tons of free application that can forward a TCP connection.

So the plan looks simple: I will start a connection from my Windows PC to some IP on port 445, then on this IP I should accept this connection and forward it to the IP of the smartphone, on the port 7777.


The question is: where can I setup a service that listen for connections on port 445?
  • On my computer? no, because I need the standard file sharing service up and running to access the shared folder on my smartphone.
  • On my NAS? no, because a nas is meaningless if I can't access it's shared folders.
  • On my router? no, this is not going to work: routers normally will forward connection from WAN to LAN, not from LAN to LAN.
  • On a pfSense running in a Virtualbox? I tried it, but it seem that pfSense have similar limitation of other routers, so forwarding from LAN to LAN doesent works.
  • On a router running DD-WRT? Maybe (I don't know)... as of today the router I use to experiment with DD-WRT it's sitting in my closet waiting for some exciting networking experiment... but not his one: I don't want another hotbox  powered on 24h/day just for accessing a single shared folder on my smartphone...

So I went for another Windows installation, running in VirtualBox.
It turned out that Windows 7 is very attached to it's 445 port, it took me some time to convince Windows to close the 445 TCP port.
But with the help of some post, and some cycle of service-stopping/reboot activity, I've been able to get a Windows PC that doesn't listen on port 445 :-)

Here is a screenshot of the setting/services I modified/disabled in this installation, probably it's not necessary to disable all those service, but I didn't have the time to disable them 1-by-1 and reboot every time...
As you can see from TCPView running in the lower right corner, there are no services listening on port 445 :-)


The rest is easy, fire up a TCP port mapper/forwarder, listen on port 445, forward to port 7777 and you will be able to access the shared folder on your non-rooted android device, from a Windows PC :-)

Here is the portmapper running on my virtualpc
In this experiment I used PortTunnel this is a very-very-old version of the software (when there was free version) but it still works today :-)

As you can guess from the screenshot the IP address of my smartphone is 192.168.157.101, and the IP of my virtualPC is 192.168.157.107.

And in the following screenshot you can see my main computer (192.168.157.110), connected to the shared folder on my Galaxy S4 (192.168.157.101)  (trough the portmapping on the virtualpc (192.168.157.107) )
The address that my computer see is 192.168.157.107, but the data come from the smartphone  (192.168.157.101) trough the portmapping.

and here is a folder with some image, seen from my main PC
and here is the same folder on the smartphone

Here is the configuration of the samba server on the smartphone


For this experiment I've tried different Samba server on android, the only one that worked in this configuration is this one, called Samba Server.

So now I can access the shared folder on my non-rooted Galaxy S4.
There is only a tiny issue... it's a bit slow.
Copying data from the PC to the shared folder transfer data at a speed of 1.2 Mb/sec.
Maybe this is due to the software used for the port-mapping...but now I don't have time to try other port-mapping tools.

Anyway... It's not fats, but it works! :-)