diff --git a/config.template.json b/config.template.json new file mode 100644 index 0000000..e67f0b8 --- /dev/null +++ b/config.template.json @@ -0,0 +1,16 @@ +{ + "server": "", + "name_server": "https://1.1.1.1/dns-query", + "windivert_filter_string": "outbound and (ip ? ip.DstAddr != 1.2.3.4 and ip.DstAddr != 1.1.1.1 : true)", + "ip_cidr_rules": { + "proxy": [] + }, + "app_rules": { + "proxy": [] + }, + "domain_rules": { + "proxy": [], + "direct": [], + "blocked": [] + } +} diff --git a/elevator.js b/elevator.js deleted file mode 100644 index e69de29..0000000 diff --git a/lib/ldplayer.js b/lib/ldplayer.js new file mode 100644 index 0000000..f8d8db8 --- /dev/null +++ b/lib/ldplayer.js @@ -0,0 +1,38 @@ +//////////////////////////////////////////////////////////////////////// +// LDPlayer API +/////////////////////////////////////////////////////////////////////// + +var SHELL = require("lib/shell"); +var SYS = require("lib/system"); + +exports.VERSIONINFO = "LDPlayer (ldplayer.js) version 0.1"; +exports.global = global; +exports.require = global.require; + +exports.getList = function() { + var data = []; + var cmd = [ + SYS.getEnvString("SYSTEMDRIVE") + "/LDPlayer/LDPlayer3.0/ldconsole.exe", + "list2" + ]; + var result = SHELL.exec(cmd); + var lines = result.split(/\r?\n/); + + for(var i = 0; i < lines.length; i++) { + var row = lines[i].split(','); + + if(row.length == 7) { + data.push({ + index: row[0], + title: row[1], + topWindowHandle: row[2], + binddWindowHandle: row[3], + androidStarted: row[4], + PID: row[5], + PIDVBox: row[6] + }); + } + } + + return data; +}; diff --git a/lib/noxplayer.js b/lib/noxplayer.js new file mode 100644 index 0000000..ff2eb15 --- /dev/null +++ b/lib/noxplayer.js @@ -0,0 +1,71 @@ +//////////////////////////////////////////////////////////////////////// +// LDPlayer API +/////////////////////////////////////////////////////////////////////// + +var SHELL = require("lib/shell"); +var SYS = require("lib/system"); + +exports.VERSIONINFO = "NoxPlayer (noxplayer.js) version 0.1"; +exports.global = global; +exports.require = global.require; + +exports.binPath = SYS.getEnvString("PROGRAMFILES(X86)") + "/Nox/bin/nox_adb.exe"; + +exports.getDevices = function() { + var data = []; + var cmd = [ + exports.binPath, + "devices" + ] + var result = SHELL.exec(cmd); + var lines = result.split(/\r?\n/); + for(var i = 0; i < lines.length; i++) { + var row = lines[i].split(/\s+/); + + if(row.length == 2) { + data.push({ + host: row[0], + type: row[1] + }); + } + } + + return data; +}; + +exports.getHostname = function(host) { + return SHELL.exec([ + exports.binPath, + "-s", + host, + "shell", + "getprop", + "net.hostname" + ]).trim(); +}; + +exports.getPID = function(host) { + var row = host.split(':'); + var addr = row[0]; + var port = row[1]; + var cmd = "netstat -ano | findstr :" + port + " | findstr :0"; + var result = SHELL.exec(cmd); + return result.substring(result.lastIndexOf(' ')); +}; + +exports.getList = function() { + var data = []; + var devices = exports.getDevices(); + + for(var i = 0; i < devices.length; i++) { + var hostname = exports.getHostname(devices[i].host); + var pid = exports.getPID(devices[i].host); + + data.push({ + hostname: hostname, + PID: pid + }); + } + + return data; +}; diff --git a/shadowloader.js b/shadowloader.js new file mode 100644 index 0000000..7b71f47 --- /dev/null +++ b/shadowloader.js @@ -0,0 +1,121 @@ +//////////////////////////////////////////////////////////////////////// +// SSloader +//////////////////////////////////////////////////////////////////////// + +var SS = require("lib/shadowsocks"); +var SYS = require("lib/system"); +var FILE = require("lib/file"); +var SHELL = require("lib/shell"); +var LDPlayer = require("lib/ldplayer"); +var NoxPlayer = require("lib/noxplayer"); +var JSON = require("lib/json"); + +var PIDList = []; + +var NumSessions = 0; +var _NumSessions = 0; +var NumBridges = 0; +var _NumBridges = 0; + +exports.main = function() { + console.info("Waiting new launched"); + sleep(10000); + + while(true) { + sleep(10000); + + //////////////////////////////////////////////////////////////// + // LDPlayer + //////////////////////////////////////////////////////////////// + var LDPList = LDPlayer.getList(); + for(var i = 0; i < LDPList.length; i++) { + var pid = parseInt(LDPList[i].PIDVBox); + var title = LDPList[i].title; + if(pid > 0 && PIDList.indexOf(pid) == -1) { + console.info("New launched LDPlayer: " + title); + + PIDList.push(pid); + + var listenPort; + if(!(title in __config.StaticIP.LDPlayer)) { + console.error("Not assigned static IP: " + title); + continue; + } else { + listenPort = SS.connect(__config.StaticIP.LDPlayer[title]); + } + + SHELL.run([ + SYS.getCurrentScriptDirectory() + "/bin/shadow.exe", + "-c", + SYS.getCurrentScriptDirectory() + "/config.template.json", + "-s", + "socks://localhost:" + listenPort, + "-p", + pid + ]); + + NumSessions = SS.getCountOfSessions(); + NumBridges = SS.getCountOfBridges(); + + if(!(NumSessions > _NumSessions && NumBridges > _NumBridges)) { + console.error("Retrying..."); + PIDList.pop(); + } + + _NumSessions = NumSessions; + _NumBridges = NumBridges; + + console.info("Waiting new launched"); + sleep(10000); + } + } + + //////////////////////////////////////////////////////////////// + // NoxPlayer + //////////////////////////////////////////////////////////////// + + var NoxPList = NoxPlayer.getList(); + for(var i = 0; i < NoxPList.length; i++) { + var pid = parseInt(NoxPList[i].PID); + var hostname = NoxPList[i].hostname; + if(pid > 0 && PIDList.indexOf(pid) == -1) { + console.info("New launched NoxPlayer: " + hostname); + + PIDList.push(pid); + + var listenPort; + if(!(hostname in __config.StaticIP.NoxPlayer)) { + console.error("Not assigned static IP: " + hostname); + continue; + } else { + listenPort = SS.connect(__config.StaticIP.NoxPlayer[hostname]); + } + + SHELL.run([ + SYS.getCurrentScriptDirectory() + "/bin/shadow.exe", + "-c", + SYS.getCurrentScriptDirectory() + "/config.template.json", + "-s", + "socks://localhost:" + listenPort, + "-p", + pid + ]); + + NumSessions = SS.getCountOfSessions(); + NumBridges = SS.getCountOfBridges(); + + if(!(NumSessions > _NumSessions && NumBridges > _NumBridges)) { + console.error("Retrying..."); + PIDList.pop(); + } + + _NumSessions = NumSessions; + _NumBridges = NumBridges; + + console.info("Waiting new launched"); + sleep(10000); + } + } + } +}; +