summaryrefslogtreecommitdiff
path: root/python/ins_stats.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/ins_stats.py')
-rw-r--r--python/ins_stats.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/python/ins_stats.py b/python/ins_stats.py
new file mode 100644
index 0000000..d9b5602
--- /dev/null
+++ b/python/ins_stats.py
@@ -0,0 +1,62 @@
+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+
+import sys
+import pychrysalide
+from pychrysalide.analysis.contents import FileContent
+from pychrysalide.format.dex import DexFormat
+from pychrysalide.analysis import LoadedBinary
+from threading import Event
+
+
+if len(sys.argv) != 2:
+ print('Usage: %s <dex classes>' % sys.argv[0])
+ sys.exit(1)
+
+
+# Load the provided binary
+
+cnt = FileContent(sys.argv[1])
+
+fmt = DexFormat(cnt)
+
+binary = LoadedBinary(fmt)
+
+binary.analyze_and_wait()
+
+
+# Compute some stats
+
+raw = [ "dn", "db", "dw", "dd", "dq" ]
+
+collected = { }
+
+max_len = 0
+ins_count = 0
+
+for ins in binary.processor.instrs:
+
+ if ins.keyword in raw:
+ continue
+
+ if len(ins.keyword) > max_len:
+ max_len = len(ins.keyword)
+
+ ins_count += 1
+
+ if ins.keyword in collected.keys():
+ collected[ins.keyword] += 1
+ else:
+ collected[ins.keyword] = 1
+
+
+# Display the results
+
+stats = [ (k, v) for k, v in collected.items() ]
+
+stats = sorted(stats, key = lambda s: s[1], reverse = True)
+
+print('=== Collected %d instructions ===' % ins_count)
+
+for s in stats:
+ print(' %s %d (%d%%)' % (s[0].ljust(max_len + 2, '.'), s[1], (s[1] * 100) / ins_count))