コード例 #1
0
class Main:
    def __init__(self, mainWin):
        self.mainWin = mainWin
        self.globalVariables = GlobalVariables()

    def GetDeviceList(self):
        deviceList = []
        isFirstElement = True
        for device in (self.globalVariables.ExecuteCommand(
                "devices -l").strip()).split("\n"):
            try:
                iStart = device.find("model:")
                if iStart != -1:
                    iEnd = device.find(" ", iStart)
                    deviceList.append((device[iStart:iEnd]).strip())
            except:
                "No device found"
        return deviceList

    def GetApplicationList(self, device):
        appList = []
        #cmd="-s "+device+" shell \"su -c ls '/data/data/'\""
        cmd = "-s " + device + " shell ls \"/data/data/\""
        for app in (
                self.globalVariables.ExecuteCommand(cmd).strip()).split("\n"):
            try:
                appList.append(app.strip())
            except:
                "App not found"
        return appList

    def GetDirContent(self, device, dir, appContents, appendPath=False):
        #cmd="-s "+device+" shell \"su -c ls '/data/data/"+appName+"/'\""
        cmd = "-s " + device + " shell ls " + dir
        for appContent in (
                self.globalVariables.ExecuteCommand(cmd).strip()).split("\n"):
            try:
                if appendPath:
                    appContents.append(
                        dir.replace("\"", "") + appContent.strip())
                else:
                    appContents.append(appContent.strip())
            except:
                "No app content found"

    def GetApplicationContent(self, device, appName):
        appContents = []
        self.GetDirContent(device, "\"/data/data/" + appName + "/\"",
                           appContents)
        appDir = self.globalVariables.ExecuteCommand(
            "-s {} shell ls /sdcard/Android/data/ | grep {}".format(
                device, self.mainWin.cmbApp.currentText())).strip()
        if appDir != "":
            print(appDir)
            self.GetDirContent(device,
                               "\"/sdcard/Android/data/" + appName + "/\"",
                               appContents, True)
        return appContents

    '''def IsDirectory(self, device, path):
		#cmd="-s "+device+" shell \"su -c cat "+path+"'\""
		cmd="-s "+device+" shell cat \""+path+"\""
		cmdOutput=self.globalVariables.ExecuteCommand(cmd).strip()
		if cmdOutput.find("Is a directory") != -1:
			return True
		return False'''

    def BuildFileStructure(self, device, appName, dirPath):
        #cmd="-s "+device+" shell \"su -c ls -R '/data/data/"+appName+"/"+dirPath+"/'\""
        if (dirPath.find("/sdcard") == 0):
            cmd = "-s " + device + " shell ls -R \"" + dirPath + "\""
        else:
            cmd = "-s " + device + " shell ls -R \"/data/data/" + appName + "/" + dirPath + "\""
        fileList = []
        directory = ""
        for dirContent in (
                self.globalVariables.ExecuteCommand(cmd).strip()).split("\n"):
            try:
                dirContent = dirContent.strip()
                if dirContent:
                    if dirContent.find(":") != -1 and len(
                            dirContent) == dirContent.find(":") + 1:
                        directory = dirContent[:-1]
                    else:
                        file = directory + "/" + dirContent
                        fileList.append(file.replace("//", "/"))
            except:
                "No file found"
        return fileList

    def GetFileContent(self, device, path):
        path = path.replace(" ", "\\ ").replace("//", "/")
        #cmd="-s "+device+" shell \"su -c cat '"+path+"'\""
        cmd = "-s " + device + " shell cat \"" + path + "\""
        return self.globalVariables.ExecuteCommand(cmd).strip()

    def DownloadDBFile(self, device, filePath, outputPath):
        filePath = filePath.replace(" ", "\\ ").replace("//", "/")
        cmd = "-s " + device + " pull " + filePath + " \"" + outputPath + "\""
        self.globalVariables.ExecuteCommand(cmd)

    def GetAllTables(self, dbPath):
        tables = []
        con = sqlite3.connect(dbPath)
        cursor = con.cursor()
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
        for table_name in cursor.fetchall():
            tables.append(table_name[0])
        return tables

    def GetTableData(self, dbPath, tableName):
        rows = []
        con = sqlite3.connect(dbPath)
        cursor = con.cursor()
        cursor.execute("SELECT * FROM " + tableName)

        colnames = cursor.description
        row = ''
        for colname in colnames:
            row += colname[0] + " | "
        rows.append(row)

        for row in cursor.fetchall():
            rows.append(row)
        return rows

    def ListApplication(self):
        appList = self.GetApplicationList(self.mainWin.cmbDevice.currentText())
        self.mainWin.cmbApp.clear()
        for app in appList:
            self.mainWin.cmbApp.addItem(app)

    def ListApplicationContent(self):
        deviceName = self.mainWin.cmbDevice.currentText()
        appName = self.mainWin.cmbApp.currentText()
        appContents = self.GetApplicationContent(deviceName, appName)
        self.mainWin.lstAppDirs.clear()
        for appContent in appContents:
            self.mainWin.lstAppDirs.addItem(QListWidgetItem(appContent))

    def ListFileFromDir(self):
        if len(self.mainWin.lstAppDirs.selectedItems()) == 1:
            deviceName = self.mainWin.cmbDevice.currentText()
            appName = self.mainWin.cmbApp.currentText()
            appDirName = str(self.mainWin.lstAppDirs.selectedItems()[0].text())

            appDirFiles = self.BuildFileStructure(deviceName, appName,
                                                  appDirName)
            self.mainWin.lstAppDirFiles.clear()
            for file in appDirFiles:
                self.mainWin.lstAppDirFiles.addItem(QListWidgetItem(file))
        else:
            print("Multiple Item Selected")

    def DisplayFileContent(self):
        mainWin.chkLogcat.setChecked(False)
        if len(self.mainWin.lstAppDirFiles.selectedItems()) == 1:
            deviceName = self.mainWin.cmbDevice.currentText()
            filePath = (self.mainWin.lstAppDirFiles.selectedItems()[0].text())
            fileContent = self.GetFileContent(deviceName, filePath).strip()
            if fileContent.find("SQLite format 3") == 0:
                if not os.path.exists("dbs"):
                    os.makedirs("dbs")
                fileName = filePath[filePath.rfind('/') + 1:]
                dbPath = "./dbs/" + fileName
                self.DownloadDBFile(deviceName, filePath, dbPath)
                tableList = self.GetAllTables(dbPath)
                self.mainWin.txtFileContent.setText("SQLiteDB : " + dbPath)
                for table in tableList:
                    print(table)
                    self.mainWin.txtFileContent.append(
                        "\n\n\nTable => " + table.format(type(str), repr(str)))
                    rows = self.GetTableData(dbPath, table)
                    isFirstRow = True
                    for columns in rows:
                        rowData = ""
                        for column in columns:
                            try:
                                rowData += column.format(type(str), repr(str))
                                if not isFirstRow:
                                    rowData += " | "
                            except:
                                rowData += str(column)
                                if not isFirstRow:
                                    rowData += " | "
                        isFirstRow = False
                        dataLen = len(rowData)
                        if dataLen > 174:
                            dataLen = 174
                        self.mainWin.txtFileContent.append("-" * dataLen)
                        self.mainWin.txtFileContent.append(rowData)
                        self.mainWin.txtFileContent.append("-" * dataLen)
            elif fileContent.find("ELF") == 1:
                if not os.path.exists("lib"):
                    os.makedirs("lib")
                fileName = filePath[filePath.rfind('/') + 1:]
                libPath = "./lib/" + fileName
                self.DownloadDBFile(deviceName, filePath, libPath)
                self.mainWin.txtFileContent.setText(
                    "Performed \"strings\" command on : ELF lib :" + libPath +
                    "\n\n")
                self.mainWin.txtFileContent.append(
                    self.globalVariables.ExecuteCommand(
                        "strings " + libPath, False))
            else:
                self.mainWin.txtFileContent.setText(fileContent)

        else:
            print("Multiple Item Selected")
        if mainWin.chkHtmlDecode.isChecked():
            text = html.unescape(self.mainWin.txtFileContent.toPlainText())
            self.mainWin.txtFileContent.setText(text)

        if mainWin.chkURLDecode.isChecked():
            text = self.mainWin.txtFileContent.toPlainText()
            text = text.encode('ascii', 'ignore')
            self.mainWin.txtFileContent.setText(text)

    def DisplayLogcat(self):
        if mainWin.chkLogcat.isChecked():
            mainWin.chkURLDecode.setVisible(False)
            mainWin.chkHtmlDecode.setVisible(False)
            mainWin.txtFileContent.setVisible(False)
            mainWin.txtLogcat.setVisible(True)
        else:
            mainWin.chkHtmlDecode.setVisible(True)
            mainWin.chkURLDecode.setVisible(True)
            mainWin.txtFileContent.setVisible(True)
            mainWin.txtLogcat.setVisible(False)

    def DecodeHTMLEntity(self):
        text = self.mainWin.txtFileContent.toPlainText()
        if mainWin.chkHtmlDecode.isChecked():
            text = html.unescape(text)
            self.mainWin.txtFileContent.setText(text)
        else:
            self.DisplayFileContent()

    def DecodeURL(self):
        text = self.mainWin.txtFileContent.toPlainText()
        if mainWin.chkURLDecode.isChecked():
            text = text.encode('ascii', 'ignore')
            self.mainWin.txtFileContent.setText(text)
        else:
            self.DisplayFileContent()

    def FetchAPK(self):
        apkName = self.mainWin.cmbApp.currentText()
        appDir = self.globalVariables.ExecuteCommand(
            "-s {} shell ls /data/app/ | grep {}".format(device,
                                                         apkName)).strip()
        self.globalVariables.ExecuteCommand(
            "-s {} pull /data/app/{}/base.apk {}/{}.apk".format(
                device, appDir, self.globalVariables.outputDir, apkName))
        return apkName

    def RunAPKTool(self):
        apkName = self.FetchAPK()
        self.globalVariables.ExecuteCommand(
            "java -jar {} d {}/{}.apk -f -o {}/{}".format(
                self.globalVariables.apktoolPath,
                self.globalVariables.outputDir, apkName,
                self.globalVariables.outputDir, apkName), False)

    def RunJDGUITool(self):
        apkName = self.FetchAPK()
        self.globalVariables.ExecuteCommand(
            "{} {}/{}.apk -o {}/{}.jar".format(
                self.globalVariables.dex2jarPath,
                self.globalVariables.outputDir, apkName,
                self.globalVariables.outputDir, apkName), False)
        self.globalVariables.ExecuteCommand(
            "java -jar {} {}/{}.jar".format(self.globalVariables.jdGUIPath,
                                            self.globalVariables.outputDir,
                                            apkName), False, False)

    def RunMobSFTool(self):
        isSuccess = self.globalVariables.InitializeMobSFVariables()
        if isSuccess:
            apkName = self.FetchAPK()
            self.globalVariables.ExecuteCommand(
                "curl -F 'file=@./apps/{}.apk' {}/api/v1/upload -H \"Authorization:{}\""
                .format(apkName, self.globalVariables.mobSFURL,
                        self.globalVariables.mobSFAPIKey), False, False)
            webbrowser.open_new_tab("{}/recent_scans/".format(
                self.globalVariables.mobSFURL))

    def RunReinstallAPK(self):
        apkName = self.mainWin.cmbApp.currentText()
        self.globalVariables.ExecuteCommand(
            "java -jar {} b {}/{}/".format(self.globalVariables.apktoolPath,
                                           self.globalVariables.outputDir,
                                           apkName), False)
        self.globalVariables.ExecuteCommand(
            "java -jar {} {}/{}/dist/{}.apk".format(
                self.globalVariables.signJar, self.globalVariables.outputDir,
                apkName, apkName), False)
        self.globalVariables.ExecuteCommand("uninstall {}".format(apkName))
        self.globalVariables.ExecuteCommand(
            "install {}/{}/dist/{}.s.apk".format(
                self.globalVariables.outputDir, apkName, apkName))

    def RunSnapshot(self):
        apkName = self.mainWin.cmbApp.currentText()
        outputDir = "{}/{}_{}".format(self.globalVariables.snapshotDir,
                                      apkName,
                                      str(datetime.now()).replace(" ", "_"))
        if not os.path.exists(outputDir):
            os.mkdir(outputDir)
        appDir = self.globalVariables.ExecuteCommand(
            "-s {} shell ls /data/app/ | grep {}".format(device,
                                                         apkName)).strip()
        self.globalVariables.ExecuteCommand(
            "-s {} pull /data/data/{}/ {}/data_data".format(
                device, apkName, outputDir))
        self.globalVariables.ExecuteCommand(
            "-s {} pull /data/app/{}/ {}/data_app".format(
                device, appDir, outputDir))
コード例 #2
0
class Main:
    def __init__(self, mainWin):
        self.mainWin = mainWin
        self.globalVariables = GlobalVariables()
        self.isSuNeeded = True
        self.device = ""

    def ComposeCmd(self, cmd):
        commandPath = ""
        if self.isSuNeeded:
            commandPath = "-s {} shell \"su -c {}\"".format(self.device, cmd)
        else:
            commandPath = "-s {} shell {}".format(self.device, cmd)
        return commandPath

    def GetDeviceList(self):
        deviceList = []
        isFirstElement = True
        for device in (self.globalVariables.ExecuteCommand(
                "devices -l").strip()).split("\n"):
            try:
                iStart = device.find("model:")
                if iStart != -1:
                    iEnd = device.find(" ", iStart)
                    deviceList.append((device[iStart:iEnd]).strip())
            except:
                "No device found"
        return deviceList

    def GetApplicationList(self):
        self.isSuNeeded = True
        cmd = self.ComposeCmd("ls '/data/data/'")
        output = self.globalVariables.ExecuteCommand(cmd)
        if output.lower().find("unknown id") == 0:
            self.isSuNeeded = False
        else:
            self.isSuNeeded = True
        cmd = self.ComposeCmd("ls '/data/data/'")
        appList = []
        for app in (
                self.globalVariables.ExecuteCommand(cmd).strip()).split("\n"):
            try:
                appList.append(app.strip())
            except:
                "App not found"
        return appList

    def GetDirContent(self, dir, appContents, appendPath=False):
        cmd = self.ComposeCmd("ls '{}'".format(dir))
        for appContent in (
                self.globalVariables.ExecuteCommand(cmd).strip()).split("\n"):
            try:
                if appendPath:
                    appContents.append(
                        dir.replace("\"", "") + appContent.strip())
                else:
                    appContents.append(appContent.strip())
            except:
                "No app content found"

    def GetApplicationContent(self, appName):
        appContents = []
        self.GetDirContent("/data/data/{}".format(appName), appContents)
        cmd = "{} | {} {}".format(
            self.ComposeCmd("ls /sdcard/Android/data/"),
            self.globalVariables.isWindowsOS and "findstr" or "grep",
            self.mainWin.cmbApp.currentText())
        appDir = self.globalVariables.ExecuteCommand(cmd).strip()
        if appDir != "":
            self.GetDirContent("/sdcard/Android/data/" + appName + "/",
                               appContents, True)
        return appContents

    '''def IsDirectory(self, path):
		cmd=self.ComposeCmd("cat '"+path+"'")
		cmdOutput=self.globalVariables.ExecuteCommand(cmd).strip()
		if cmdOutput.find("Is a directory") != -1:
			return True
		return False'''

    def BuildFileStructure(self, appName, dirPath):
        if (dirPath.find("/sdcard") == 0):
            cmd = self.ComposeCmd("ls -R '" + dirPath + "'")
        else:
            cmd = self.ComposeCmd("ls -R '/data/data/" + appName + "/" +
                                  dirPath + "'")
        fileList = []
        directory = ""
        for dirContent in (
                self.globalVariables.ExecuteCommand(cmd).strip()).split("\n"):
            try:
                dirContent = dirContent.strip()
                if dirContent:
                    if dirContent.find(":") != -1 and len(
                            dirContent) == dirContent.find(":") + 1:
                        directory = dirContent[:-1]
                    else:
                        file = directory + "/" + dirContent
                        fileList.append(file.replace("//", "/"))
            except:
                "No file found"
        return fileList

    def GetFileContent(self, path):
        path = path.replace(" ", "\\ ").replace("//", "/")
        cmd = self.ComposeCmd("cat '" + path + "'")
        return self.globalVariables.ExecuteCommand(cmd).strip()

    def DownloadDBFile(self, filePath, outputPath):
        filePath = filePath.replace(" ", "\\ ").replace("//", "/")
        if self.isSuNeeded:
            cmd = "{} > '{}'".format(self.ComposeCmd("cat '" + filePath + "'"),
                                     outputPath)
        else:
            cmd = "-s " + self.device + " pull " + filePath + " \"" + outputPath + "\""
        self.globalVariables.ExecuteCommand(cmd)

    def GetAllTables(self, dbPath):
        tables = []
        con = sqlite3.connect(dbPath)
        cursor = con.cursor()
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
        for table_name in cursor.fetchall():
            tables.append(table_name[0])
        return tables

    def GetTableData(self, dbPath, tableName):
        rows = []
        con = sqlite3.connect(dbPath)
        cursor = con.cursor()
        cursor.execute("SELECT * FROM " + tableName)

        colnames = cursor.description
        row = ''
        for colname in colnames:
            row += colname[0] + " | "
        rows.append(row)

        for row in cursor.fetchall():
            rows.append(row)
        return rows

    def HideDefaultApplication(self):
        if mainWin.chkHideDefaultApp.isChecked():
            self.ListApplication(True)
        else:
            self.ListApplication(False)

    def ListApplication(self, isHide=False):
        self.device = self.mainWin.cmbDevice.currentText()
        appList = self.GetApplicationList()
        self.mainWin.cmbApp.clear()
        for app in appList:
            if isHide:
                if app.find("com.android") == 0 or app.find("com.google") == 0:
                    continue
                else:
                    self.mainWin.cmbApp.addItem(app)
            else:
                self.mainWin.cmbApp.addItem(app)

    def ListApplicationContent(self):
        appName = self.mainWin.cmbApp.currentText()
        appContents = self.GetApplicationContent(appName)
        self.mainWin.lstAppDirs.clear()
        for appContent in appContents:
            self.mainWin.lstAppDirs.addItem(QListWidgetItem(appContent))

    def ListFileFromDir(self):
        if len(self.mainWin.lstAppDirs.selectedItems()) == 1:
            appName = self.mainWin.cmbApp.currentText()
            appDirName = str(self.mainWin.lstAppDirs.selectedItems()[0].text())

            appDirFiles = self.BuildFileStructure(appName, appDirName)
            self.mainWin.lstAppDirFiles.clear()
            for file in appDirFiles:
                self.mainWin.lstAppDirFiles.addItem(QListWidgetItem(file))
        else:
            print("Multiple Item Selected")

    def DisplayFileContent(self):
        mainWin.chkLogcat.setChecked(False)
        if len(self.mainWin.lstAppDirFiles.selectedItems()) == 1:
            filePath = (self.mainWin.lstAppDirFiles.selectedItems()[0].text())
            fileContent = self.GetFileContent(filePath).strip()
            if fileContent.find("SQLite format 3") == 0:
                if not os.path.exists("dbs"):
                    os.makedirs("dbs")
                fileName = filePath[filePath.rfind('/') + 1:]
                dbPath = "./dbs/" + fileName
                self.DownloadDBFile(filePath, dbPath)
                tableList = self.GetAllTables(dbPath)
                self.mainWin.txtFileContent.setText("SQLiteDB : " + dbPath)
                for table in tableList:
                    self.mainWin.txtFileContent.append(
                        "\n\n\nTable => " + table.format(type(str), repr(str)))
                    rows = self.GetTableData(dbPath, table)
                    isFirstRow = True
                    for columns in rows:
                        rowData = ""
                        for column in columns:
                            try:
                                rowData += column.format(type(str), repr(str))
                                if not isFirstRow:
                                    rowData += " | "
                            except:
                                rowData += str(column)
                                if not isFirstRow:
                                    rowData += " | "
                        isFirstRow = False
                        dataLen = len(rowData)
                        if dataLen > 174:
                            dataLen = 174
                        self.mainWin.txtFileContent.append("-" * dataLen)
                        self.mainWin.txtFileContent.append(rowData)
                        self.mainWin.txtFileContent.append("-" * dataLen)
            elif fileContent.find("ELF") == 1:
                if not os.path.exists("lib"):
                    os.makedirs("lib")
                fileName = filePath[filePath.rfind('/') + 1:]
                libPath = "./lib/" + fileName
                self.DownloadDBFile(filePath, libPath)
                self.mainWin.txtFileContent.setText(
                    "Performed \"strings\" command on : ELF lib :" + libPath +
                    "\n\n")
                self.mainWin.txtFileContent.append(
                    self.globalVariables.ExecuteCommand(
                        "strings " + libPath, False))
            else:
                self.mainWin.txtFileContent.setText(fileContent)

        else:
            print("Multiple Item Selected")
        if mainWin.chkHtmlDecode.isChecked():
            text = html.unescape(self.mainWin.txtFileContent.toPlainText())
            self.mainWin.txtFileContent.setText(text)

        if mainWin.chkURLDecode.isChecked():
            text = self.mainWin.txtFileContent.toPlainText()
            text = text.encode('ascii', 'ignore')
            self.mainWin.txtFileContent.setText(text)

    def DisplayLogcat(self):
        if mainWin.chkLogcat.isChecked():
            mainWin.chkURLDecode.setVisible(False)
            mainWin.chkHtmlDecode.setVisible(False)
            mainWin.txtFileContent.setVisible(False)
            mainWin.txtLogcat.setVisible(True)
        else:
            mainWin.chkHtmlDecode.setVisible(True)
            mainWin.chkURLDecode.setVisible(True)
            mainWin.txtFileContent.setVisible(True)
            mainWin.txtLogcat.setVisible(False)

    def DecodeHTMLEntity(self):
        text = self.mainWin.txtFileContent.toPlainText()
        if mainWin.chkHtmlDecode.isChecked():
            text = html.unescape(text)
            self.mainWin.txtFileContent.setText(text)
        else:
            self.DisplayFileContent()

    def DecodeURL(self):
        text = self.mainWin.txtFileContent.toPlainText()
        if mainWin.chkURLDecode.isChecked():
            text = text.encode('ascii', 'ignore')
            self.mainWin.txtFileContent.setText(text)
        else:
            self.DisplayFileContent()

    def FetchAPK(self):
        apkName = self.mainWin.cmbApp.currentText()
        cmd = "{} | {} {}".format(
            self.ComposeCmd("ls '/data/app/'"),
            self.globalVariables.isWindowsOS and "findstr" or "grep", apkName)
        appDir = self.globalVariables.ExecuteCommand(cmd).strip()
        if self.isSuNeeded:
            self.globalVariables.ExecuteCommand("{} > {}/{}.apk".format(
                self.ComposeCmd("cat /data/app/{}/base.apk".format(appDir)),
                self.globalVariables.outputDir, apkName))
        else:
            self.globalVariables.ExecuteCommand(
                "-s {} pull /data/app/{}/base.apk {}/{}.apk".format(
                    self.device, appDir, self.globalVariables.outputDir,
                    apkName))
        return apkName

    def RunAPKTool(self):
        apkName = self.FetchAPK()
        self.globalVariables.ExecuteCommand(
            "java -jar {} d {}/{}.apk -f -o {}/{}".format(
                self.globalVariables.apktoolPath,
                self.globalVariables.outputDir, apkName,
                self.globalVariables.outputDir, apkName), False)

    def RunJDGUITool(self):
        apkName = self.FetchAPK()
        dex2jarPath = self.globalVariables.isWindowsOS and self.globalVariables.dex2jarPathWin or self.globalVariables.dex2jarPath
        self.globalVariables.ExecuteCommand(
            "{} {}/{}.apk -o {}/{}.jar --force".format(
                dex2jarPath, self.globalVariables.outputDir, apkName,
                self.globalVariables.outputDir, apkName), False)
        self.globalVariables.ExecuteCommand(
            "java -jar {} {}/{}.jar".format(self.globalVariables.jdGUIPath,
                                            self.globalVariables.outputDir,
                                            apkName), False, False)

    def RunMobSFTool(self):
        isSuccess = self.globalVariables.InitializeMobSFVariables()
        if isSuccess:
            apkName = self.FetchAPK()
            self.globalVariables.ExecuteCommand(
                "curl -F 'file=@./apps/{}.apk' {}/api/v1/upload -H \"Authorization:{}\""
                .format(apkName, self.globalVariables.mobSFURL,
                        self.globalVariables.mobSFAPIKey), False, False)
            webbrowser.open_new_tab("{}/recent_scans/".format(
                self.globalVariables.mobSFURL))

    def RunReinstallAPK(self):
        apkName = self.mainWin.cmbApp.currentText()
        self.globalVariables.ExecuteCommand(
            "java -jar {} b {}/{}/".format(self.globalVariables.apktoolPath,
                                           self.globalVariables.outputDir,
                                           apkName), False)
        self.globalVariables.ExecuteCommand(
            "java -jar {} {}/{}/dist/{}.apk".format(
                self.globalVariables.signJar, self.globalVariables.outputDir,
                apkName, apkName), False)
        self.globalVariables.ExecuteCommand("-s {} uninstall {}".format(
            self.device, apkName))
        self.globalVariables.ExecuteCommand(
            "-s {} install {}/{}/dist/{}.s.apk".format(
                self.device, self.globalVariables.outputDir, apkName, apkName))

    def RunSnapshot(self):
        apkName = self.mainWin.cmbApp.currentText()
        outputDir = "{}/{}_{}".format(
            self.globalVariables.snapshotDir, apkName,
            str(datetime.now()).replace(" ", "_").replace(":", "_"))
        if not os.path.exists(outputDir):
            os.mkdir(outputDir)
        cmd = "{} | {} {}".format(
            self.ComposeCmd("ls '/data/app/'"),
            self.globalVariables.isWindowsOS and "findstr" or "grep", apkName)
        appDir = self.globalVariables.ExecuteCommand(cmd).strip()
        self.globalVariables.ExecuteCommand(
            "-s {} pull /data/data/{}/ {}/data_data".format(
                self.device, apkName, outputDir))
        self.globalVariables.ExecuteCommand(
            "-s {} pull /data/app/{}/ {}/data_app".format(
                self.device, appDir, outputDir))

    def StartFridaServer(self):
        cmd = "{} | {} {}".format(
            self.ComposeCmd("ps"),
            self.globalVariables.isWindowsOS and "findstr" or "grep",
            self.globalVariables.fridaServer)
        output = self.globalVariables.ExecuteCommand(cmd)
        if output.find(self.globalVariables.fridaServer) < 0:
            self.globalVariables.ExecuteCommand("-s {} push {} {}".format(
                self.device, self.globalVariables.fridaServerFileName,
                self.globalVariables.androidtmpdir))
            self.globalVariables.ExecuteCommand(
                self.ComposeCmd("\"cd {} && chmod 755 {}\"".format(
                    self.globalVariables.androidtmpdir,
                    self.globalVariables.fridaServer)))
            self.globalVariables.ExecuteCommand(
                self.ComposeCmd("\"cd {} && ./{} &\"".format(
                    self.globalVariables.androidtmpdir,
                    self.globalVariables.fridaServer)), True, False)

    def RunFridump(self):
        self.StartFridaServer()
        try:
            self.globalVariables.ExecuteCommand(
                "python {} -U -s {}".format(self.globalVariables.fridumpPath,
                                            self.mainWin.cmbApp.currentText()),
                False)

            mainWin.chkLogcat.setChecked(False)
            output = ''
            with open(self.globalVariables.fridumpOutput) as f:
                for line in f:
                    output += line
            self.mainWin.txtFileContent.setText(output)
        except:
            print("Please check the application is running!!")

    def RunUniversalFridaSSLUnPinning(self):
        self.StartFridaServer()
        self.globalVariables.ExecuteCommand("-s {} push {} {}{}".format(
            self.device, self.globalVariables.burpCertPath,
            self.globalVariables.androidtmpdir,
            self.globalVariables.burpCertName))
        self.globalVariables.ExecuteCommand(
            "frida -U -f {} -l {} --no-pause".format(
                self.mainWin.cmbApp.currentText(),
                self.globalVariables.fridasslunpinscript1), False, False)

    def ReloadApplications(self):
        self.HideDefaultApplication()