Repository: DrizzleRisk/BUnpacker Branch: master Commit: 8e92b42b0e02 Files: 5 Total size: 3.4 KB Directory structure: gitextract_dki6nbo1/ ├── README.md ├── bunpacker.py └── ext-tools/ ├── AXMLPrinter2.jar ├── armeabi/ │ └── bulib └── x86/ └── bulib ================================================ FILE CONTENTS ================================================ ================================================ FILE: README.md ================================================ BUnpacker === 简介 === *BUnpacker*是一款Android脱壳工具 *TUnpacker* is an Android unpack tool. 使用方法 === python bunpacker.py jiagu.apk 工具截图 === ![image](https://github.com/DrizzleRisk/BUnpacker/blob/master/screenshot.png) 必读事项 === 1.本代码仅适用于特定的加固方式 (BB) 2.本代码仅供安全研究及授权测试使用,如用于非法用途,后果自负 3.运行本代码前需要确保连接Android测试设备或虚拟机,并确保Android系统已root 4.如Dump等待时间过长或Dump失败,请多试几次! 工具集(分别适用于不同加固) === drizzleDumper TUnpacker BUnpacker ================================================ FILE: bunpacker.py ================================================ #coding=utf-8 import sys,shutil reload(sys) sys.setdefaultencoding('utf-8') import os,time,zipfile from xml.dom import minidom PACKAGE_NAME = '' START_ACTIVITY = '' APK_PATH = '' def Title(): print '[>>>] BUnpacker [<<<]' print '[>>>] code by Drizzle [<<<]' print '[>>>] 2016.10 [<<<]' def CheckEnv(): Title() print '[*] Init env' global APK_PATH global PACKAGE_NAME global START_ACTIVITY #初始化环境 if not os.path.exists('result'): os.mkdir('result') if not os.path.exists('tmp'): os.mkdir('tmp') CPU = 'x86' os.popen('adb root') result = os.popen('adb shell cat /proc/cpuinfo').read() if result.find('ARM') != -1: CPU = 'armeabi' print '[*] Target: '+CPU print '[---------------------------------------]' os.popen('adb push ext-tools/' + CPU + '/bulib /data/local/tmp') os.popen('adb install ' + APK_PATH) print '[---------------------------------------]' #获取包信息备用 print '[*] Get package info' nxml = open('tmp/nxml.xml','w') zf = zipfile.ZipFile(APK_PATH, 'r') content = zf.read('AndroidManifest.xml') nxml.write(content) nxml.close() content = os.popen('java -jar ext-tools/AXMLPrinter2.jar tmp/nxml.xml').read() mfest = minidom.parseString(content) manifest = mfest.getElementsByTagName('manifest') activities = mfest.getElementsByTagName("activity") for node in manifest: PACKAGE_NAME = node.getAttribute("package") for activity in activities: for sitem in activity.getElementsByTagName("action"): val = sitem.getAttribute("android:name") if val == "android.intent.action.MAIN" : START_ACTIVITY = activity.getAttribute("android:name") def Dump(): print '[*] Dump dex' global PACKAGE_NAME global START_ACTIVITY os.popen('adb shell am force-stop ' + PACKAGE_NAME) time.sleep(1) os.popen('adb shell am start -n ' + PACKAGE_NAME + '/' + START_ACTIVITY) content = os.popen('adb shell ./data/local/tmp/bulib ' + PACKAGE_NAME).read() print '[---------------------------------------]' os.popen('adb pull ' + content + ' result/' + PACKAGE_NAME + '.dex') print '[---------------------------------------]' if os.path.exists('result/' + PACKAGE_NAME + '.dex'): print '[*] Success >> ' + 'result/' + PACKAGE_NAME + '.dex' #清理环境 if os.path.exists('tmp'): shutil.rmtree('tmp') def Useage(): Title() print '[*] Useage: bunpacker.py jiagu.apk' print '[*] 1.Before Running ,make sure a rooted Android system has been connected to your PC' print '[*] 2.Only for testing,Do not be evil !' if __name__ == '__main__': if len(sys.argv) < 2: Useage() else: APK_PATH = sys.argv[1] CheckEnv() Dump()