Skip to content

Commit

Permalink
add resources window
Browse files Browse the repository at this point in the history
  • Loading branch information
adesnos committed Jun 3, 2016
1 parent aa2ea50 commit 85b19ba
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 1 deletion.
32 changes: 32 additions & 0 deletions androguard/core/bytecodes/apk.py
Expand Up @@ -2000,6 +2000,38 @@ def get_resolved_res_configs(self, rid, config=None):
resolver = ARSCParser.ResourceResolver(self, config)
return resolver.resolve(rid)

def get_resolved_strings(self):
self._analyse()

r = {}
for package_name in self.get_packages_names():
r[package_name] = {}
k = {}

for locale in self.values[package_name]:
v_locale = locale
if v_locale == '\x00\x00':
v_locale = 'DEFAULT'

r[package_name][v_locale] = {}

try:
for i in self.values[package_name][locale]["public"]:
if i[0] == 'string':
r[package_name][v_locale][i[2]] = None
k[i[1]] = i[2]
except KeyError:
pass

try:
for i in self.values[package_name][locale]["string"]:
if i[0] in k:
r[package_name][v_locale][k[i[0]]] = i[1]
except KeyError:
pass

return r

def get_res_configs(self, rid, config=None):
self._analyse()

Expand Down
9 changes: 9 additions & 0 deletions androguard/gui/mainwindow.py
Expand Up @@ -7,6 +7,7 @@
from androguard.gui.sourcewindow import SourceWindow
from androguard.gui.stringswindow import StringsWindow
from androguard.gui.methodswindow import MethodsWindow
from androguard.gui.resourceswindow import ResourcesWindow
from androguard.gui.apiwindow import APIWindow
from androguard.gui.binwindow import binWidget
from androguard.gui.DataModel import *
Expand Down Expand Up @@ -268,6 +269,7 @@ def setupViewMenu(self):
viewMenu.addAction("&Methods...", self.openMethodsWindow)
viewMenu.addAction("&API...", self.openAPIWindow)
viewMenu.addAction("&APK...", self.openApkWindow)
viewMenu.addAction("&Resources...", self.openResourcesWindow)

def setupPluginsMenu(self):
pluginsMenu = QtWidgets.QMenu("&Plugins", self)
Expand Down Expand Up @@ -304,6 +306,13 @@ def openMethodsWindow(self):
methodswin.title)
self.central.setCurrentWidget(methodswin)

def openResourcesWindow(self):
resourceswin = ResourcesWindow(win=self, session=self.session)
self.central.addTab(resourceswin, resourceswin.title)
self.central.setTabToolTip(self.central.indexOf(resourceswin),
resourceswin.title)
self.central.setCurrentWidget(resourceswin)

def openAPIWindow(self):
apiwin = APIWindow(win=self, session=self.session)
self.central.addTab(apiwin, apiwin.title)
Expand Down
87 changes: 87 additions & 0 deletions androguard/gui/resourceswindow.py
@@ -0,0 +1,87 @@
from PyQt5 import QtCore, QtGui, QtWidgets
from androguard.gui.xrefwindow import XrefDialogMethod


class ResourcesWindow(QtWidgets.QWidget):

def __init__(self, parent=None, win=None, session=None):
super(ResourcesWindow, self).__init__(parent)
self.mainwin = win
self.session = session
self.title = "Resources"

self.filterPatternLineEdit = QtWidgets.QLineEdit()
self.filterPatternLabel = QtWidgets.QLabel("&Filter resources name pattern:")
self.filterPatternLabel.setBuddy(self.filterPatternLineEdit)
self.filterPatternLineEdit.textChanged.connect(self.filterRegExpChanged)

self.resourceswindow = ResourcesValueWindow(self, win, session)

sourceLayout = QtWidgets.QVBoxLayout()
sourceLayout.addWidget(self.resourceswindow)
sourceLayout.addWidget(self.filterPatternLabel)
sourceLayout.addWidget(self.filterPatternLineEdit)

self.setLayout(sourceLayout)

def filterRegExpChanged(self, value):
regExp = QtCore.QRegExp(value)
self.resourceswindow.proxyModel.setFilterRegExp(regExp)


class ResourcesValueWindow(QtWidgets.QTreeView):

def __init__(self, parent=None, win=None, session=None):
super(ResourcesValueWindow, self).__init__(parent)
self.mainwin = win
self.session = session
self.title = "Resources"


self.proxyModel = QtCore.QSortFilterProxyModel()
self.proxyModel.setDynamicSortFilter(True)

string_resources = None
for digest, apk in self.session.get_all_apks():
a = apk[0]
resources = a.get_android_resources()

string_resources = resources.get_resolved_strings()
nb = 0
for p in string_resources:
for l in string_resources[p]:
nb += len(string_resources[p][l])

self.model = QtGui.QStandardItemModel(nb, 4,
self)

self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Package name")
self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Locale")
self.model.setHeaderData(2, QtCore.Qt.Horizontal, "ID")
self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Value")

row = 0
for p_name in string_resources:
for locale in string_resources[p_name]:
for id_value in string_resources[p_name][locale]:
self.model.setData(self.model.index(
row, 0, QtCore.QModelIndex()), p_name)
self.model.setData(self.model.index(
row, 1, QtCore.QModelIndex()), str(locale))
self.model.setData(self.model.index(
row, 2, QtCore.QModelIndex()), str(id_value))
self.model.setData(self.model.index(
row, 3, QtCore.QModelIndex()), string_resources[p_name][locale][id_value])
row += 1




self.proxyModel.setSourceModel(self.model)
self.proxyModel.setFilterKeyColumn(2)

self.setRootIsDecorated(False)
self.setAlternatingRowColors(True)
self.setModel(self.proxyModel)
self.setSortingEnabled(True)
self.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
4 changes: 4 additions & 0 deletions androguard/session.py
Expand Up @@ -177,6 +177,10 @@ def get_nb_strings(self):
nb += len(dx.get_strings_analysis())
return nb

def get_all_apks(self):
for digest in self.analyzed_apk:
yield digest, self.analyzed_apk[digest]

def get_objects_apk(self, filename):
digest = self.analyzed_files.get(filename)
if digest:
Expand Down
2 changes: 1 addition & 1 deletion tests/test_session.py
Expand Up @@ -36,7 +36,7 @@ def testSessionSave(self):
"r") as fd:
s.add("examples/android/TestsAndroguard/bin/TestActivity.apk",
fd.read())
s.save("test_session")
session.Save(s, "test_session")


if __name__ == '__main__':
Expand Down

0 comments on commit 85b19ba

Please sign in to comment.