Simple Android APK Unpack Script


Included: dex2jar (dex file to jar), axmlprinter (export encrypted xml) and unzip jar
Usage: move all apps (*.apk) to script/Apps/Apk and double click the action.py until get completed message

1
2
3
4
5
6
7
8
9
Folder Structure:
- script/
- action.py
- Apps/
- Apk/, Jar/, Unjar/
- Tools/
- AXMLPrinter2.jar
- dex2jar/
- unar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Author : Zeuxis Lo
Date : 2011/01/02 14:57 PM
Name : Android APK Unpack Script
Version: 0.1.0 Beta
"""

import os, shutil, fnmatch

DEBUG = True

class BaseController(object):
def __init__(self):
self.current_folder = os.getcwd()
self.apps_folder = self.current_folder + "/Apps"
self.tools_folder = self.current_folder + "/Tools"

self.apps_apk_folder = self.apps_folder + "/Apk"
self.apps_jar_folder = self.apps_folder + "/Jar"
self.apps_unjar_folder = self.apps_folder + "/UnJar"

def log(self, message):
if DEBUG: print(message)

class FolderContoller(BaseController):
def get_file_list_from_apps_folder(self, folder_name):
folder_path = self.apps_folder + "/" + folder_name
return [os.path.join(folder_path, filename) for filename in os.listdir(folder_path)]

def move_apk_jar_to_jar_folder(self):
src_path = self.apps_apk_folder
dest_path = self.apps_jar_folder

for filename in fnmatch.filter(os.listdir(src_path), "*.jar"):
src = os.path.join(src_path, filename)
dest = os.path.join(dest_path, filename)

shutil.move(src, dest)

def get_xml_file_dict_from_unjar_folder(self):
folder_list = [self.apps_unjar_folder]
file_dict = {}

while(len(folder_list) > 0):
folder = folder_list.pop()
for name in os.listdir(folder):
item_path = os.path.join(folder, name)
filename, extension = os.path.splitext(os.path.basename(item_path))

if os.path.isfile(item_path) and extension.lower() == ".xml":
file_dict[item_path] = os.path.join(os.path.dirname(item_path), "d-%s.xml" % filename)
elif os.path.isdir(item_path):
folder_list.append(item_path)

return file_dict

class ToolsController(BaseController):
def __init__(self):
BaseController.__init__(self)

self.dex2jar_script = self.tools_folder + "/dex2jar/dex2jar.sh"
self.axmlprinter_script = self.tools_folder + "/AXMLPrinter2.jar"
self.unar_script = self.tools_folder + "/unar"

def dex_to_jar(self, apk_file_path):
command = "%s %s" % (self.dex2jar_script, apk_file_path)
self.log(command)
return command

def decrypt_xml(self, from_xml_path, to_xml_path):
command = "java -jar %s %s > %s" % (self.axmlprinter_script, from_xml_path, to_xml_path)
self.log(command)
return command

def unjar(self, apk_file_path):
#command = "unzip %s -d %s" % (apk_file_path, os.path.join(self.apps_unjar_folder, os.path.basename(apk_file_path)[:10]))
command = "%s %s %s" % (self.unar_script, apk_file_path, os.path.join(self.apps_unjar_folder, os.path.basename(apk_file_path)[:10]))
self.log(command)
return command

class Action:
def __init__(self):
self.folder_controller = FolderContoller()
self.tools_controller = ToolsController()

def convert_to_jar(self, apk_file_list):
for apk_file in apk_file_list:
os.system(self.tools_controller.dex_to_jar(apk_file))

def unjar(self, jar_file_list):
for jar_file in jar_file_list:
os.system(self.tools_controller.unjar(jar_file))

def decrypt_xml(self, xml_file_dict):
for from_xml, to_xml in xml_file_dict.iteritems():
os.system(self.tools_controller.decrypt_xml(from_xml, to_xml))

def run(self):
self.convert_to_jar(self.folder_controller.get_file_list_from_apps_folder("Apk"))
self.folder_controller.move_apk_jar_to_jar_folder()
self.unjar(self.folder_controller.get_file_list_from_apps_folder("Apk"))
self.decrypt_xml(self.folder_controller.get_xml_file_dict_from_unjar_folder())

print("\n...… Completed\n")

if __name__ == "__main__":
Action().run()