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