diff options
Diffstat (limited to 'python/ins_stats.py')
-rw-r--r-- | python/ins_stats.py | 62 |
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)) |