mirror of
https://github.com/bkerler/sboot_dump.git
synced 2024-11-14 11:24:56 -05:00
S7 working properly
This commit is contained in:
parent
8c65412192
commit
f881b2e0a6
4 changed files with 846 additions and 156 deletions
662
Drivers/50-android.rules
Executable file
662
Drivers/50-android.rules
Executable file
|
@ -0,0 +1,662 @@
|
|||
--------------------------------------------------------------------------------
|
||||
# These rules refer: https://developer.android.com/studio/run/device.html
|
||||
# and include many suggestions from Arch Linux, GitHub and other Communities.
|
||||
# Latest version can be found at: https://github.com/M0Rf30/android-udev-rules
|
||||
|
||||
# Skip this section below if this device is not connected by USB
|
||||
SUBSYSTEM!="usb", GOTO="android_usb_rules_end"
|
||||
|
||||
LABEL="android_universal_rule"
|
||||
ENV{ID_USB_INTERFACES}!="*:ff420?:*", GOTO="android_usb_rules_begin"
|
||||
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:ff420?:*", MODE="0660", GROUP="adbusers", SYMLINK+="android/$env{ID_SERIAL_SHORT}"
|
||||
|
||||
LABEL="android_usb_rules_begin"
|
||||
# Devices listed here in android_usb_rules_{begin...end} are connected by USB
|
||||
# Acer
|
||||
ATTR{idVendor}!="0502", GOTO="not_Acer"
|
||||
ENV{adb_user}="yes"
|
||||
# Iconia Tab A1-830
|
||||
ATTR{idProduct}=="3604", ENV{adb_adbfast}="yes"
|
||||
# Iconia Tab A500
|
||||
ATTR{idProduct}=="3325", ENV{adb_adbfast}="yes"
|
||||
# Liquid (3202=normal,3203=debug)
|
||||
ATTR{idProduct}=="3203", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Acer"
|
||||
|
||||
# Actions Semiconductor Co., Ltd
|
||||
ATTR{idVendor}=="10d6", ENV{adb_user}="yes"
|
||||
# Denver TAD 70111
|
||||
ATTR{idProduct}=="0c02", SYMLINK+="android_adb"
|
||||
|
||||
# ADVANCE
|
||||
ATTR{idVendor}=="0a5c", ENV{adb_user}="yes"
|
||||
# S5
|
||||
ATTR{idProduct}=="e681", SYMLINK+="android_adb"
|
||||
|
||||
# Amazon Lab126
|
||||
ATTR{idVendor}=="1949", ENV{adb_user}="yes"
|
||||
# Amazon Kindle Fire
|
||||
ATTR{idProduct}=="0006", ENV{adb_adbfast}="yes"
|
||||
|
||||
# Archos
|
||||
ATTR{idVendor}!="0e79", GOTO="not_Archos"
|
||||
ENV{adb_user}="yes"
|
||||
# 43
|
||||
ATTR{idProduct}=="1417", ENV{adb_adbfast}="yes"
|
||||
# 101
|
||||
ATTR{idProduct}=="1411", ENV{adb_adbfast}="yes"
|
||||
# 101 xs
|
||||
ATTR{idProduct}=="1549", ENV{adb_adbfast}="yes"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Archos"
|
||||
|
||||
# ASUSTeK
|
||||
ATTR{idVendor}!="0b05", GOTO="not_Asus"
|
||||
# False positive - accessory
|
||||
ATTR{idProduct}=="1???", GOTO="android_usb_rules_end"
|
||||
ENV{adb_user}="yes"
|
||||
# Zenphone 2 (ZE500CL) (7770=adb 7773=mtp,adb 7777=ptp,adb 7775=rndis,adb,mass_storage 5F03=mtp,adb,pclink,mass_storage 5F07=ptp,adb,pclink 5F05=rndis,adb,pclink,mass_storage
|
||||
ATTR{idProduct}=="7770", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="7773", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="7777", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="7775", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="5F03", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="5F07", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="5F05", SYMLINK+="android_adb"
|
||||
# Zenphone 4 (581f=mtp,adb 583f=rndis,adb)
|
||||
ATTR{idProduct}=="581f", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="583f", SYMLINK+="android_adb"
|
||||
# Zenphone 5 (4c90=normal,4c91=debug,4daf=Fastboot)
|
||||
ATTR{idProduct}=="4c91", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="4daf", SYMLINK+="android_fastboot"
|
||||
# Tegra APX
|
||||
ATTR{idProduct}=="7030"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Asus"
|
||||
|
||||
# Azpen Onda
|
||||
ATTR{idVendor}=="1f3a", ENV{adb_user}="yes"
|
||||
|
||||
# BQ
|
||||
ATTR{idVendor}!="2a47", GOTO="not_BQ"
|
||||
ENV{adb_user}="yes"
|
||||
# Aquaris 4.5
|
||||
ATTR{idProduct}=="0c02", ENV{adb_adbfast}="yes"
|
||||
ATTR{idProduct}=="2008", ENV{adb_adbfast}="yes"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_BQ"
|
||||
|
||||
# Dell
|
||||
ATTR{idVendor}=="413c", ENV{adb_user}="yes"
|
||||
|
||||
# Essential
|
||||
ATTR{idVendor}!="2e17", GOTO="not_Essential"
|
||||
ENV{adb_user}="yes"
|
||||
# Essential PH-1
|
||||
ATTR{idProduct}=="c009", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="c030", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Essential"
|
||||
|
||||
# Fairphone 2
|
||||
ATTR{idVendor}=="2ae5", ENV{adb_user}="yes"
|
||||
|
||||
# Foxconn
|
||||
ATTR{idVendor}=="0489", ENV{adb_user}="yes"
|
||||
# Commtiva Z71, Geeksphone One
|
||||
ATTR{idVendor}=="0489", ATTR{idProduct}=="c001", SYMLINK+="android_adb"
|
||||
|
||||
# Fujitsu/Fujitsu Toshiba
|
||||
ATTR{idVendor}=="04c5", ENV{adb_user}="yes"
|
||||
|
||||
# Fuzhou Rockchip Electronics
|
||||
ATTR{idVendor}=="2207", ENV{adb_user}="yes"
|
||||
# Mediacom Smartpad 715i
|
||||
ATTR{idVendor}=="2207", ATTR{idProduct}=="0000", SYMLINK+="android_adb"
|
||||
# Ubislate 7Ci
|
||||
ATTR{idVendor}=="2207", ATTR{idProduct}=="0010", SYMLINK+="android_adb"
|
||||
|
||||
# Garmin-Asus
|
||||
ATTR{idVendor}=="091e", ENV{adb_user}="yes"
|
||||
|
||||
# Google
|
||||
ATTR{idVendor}!="18d1", GOTO="not_Google"
|
||||
ENV{adb_user}="yes"
|
||||
# Nexus, Pixel, Pixel XL, Pixel 2, Pixel 2XL (4ee2=mtp,adb 4ee4=rndis,adb 4ee6=ptp,adb 4ee7=adb 4ee9=midi,adb 2d01=accessory,adb 2d03=audio_source,adb 2d05=accessory,audio_source,adb)
|
||||
# See https://android.googlesource.com/device/google/wahoo/+/master/init.hardware.usb.rc
|
||||
ATTR{idProduct}=="4ee2", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="4ee4", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="4ee6", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="4ee7", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="4ee9", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="2d01", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="2d03", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="2d05", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="4ee0", SYMLINK+="android_fastboot"
|
||||
# Nexus 7
|
||||
ATTR{idProduct}=="4e42", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="4e40", SYMLINK+="android_fastboot"
|
||||
# Nexus 5, Nexus 10
|
||||
ATTR{idProduct}=="4ee1", ENV{adb_adbfast}="yes"
|
||||
# Nexus S (4e22=mass_storage,adb 4e24=rndis,adb)
|
||||
# See https://android.googlesource.com/device/samsung/crespo/+/android-4.1.2_r2.1/init.herring.usb.rc
|
||||
ATTR{idProduct}=="4e22", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="4e24", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="4e20", SYMLINK+="android_fastboot"
|
||||
# Galaxy Nexus
|
||||
ATTR{idProduct}=="4e30", ENV{adb_adbfast}="yes"
|
||||
# Nexus One (4e11=normal,4e12=debug,0fff=debug)
|
||||
ATTR{idProduct}=="4e12", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="0fff", SYMLINK+="android_fastboot"
|
||||
# Generic and unspecified debug interface
|
||||
ATTR{idProduct}=="d00d", SYMLINK+="android_fastboot"
|
||||
# Pico i.MX7 Dual Development Board
|
||||
ATTR{idProduct}=="4ee7", SYMLINK+="android_adb"
|
||||
# Include: Samsung Galaxy Nexus (GSM)
|
||||
ATTR{idProduct}=="4e30", SYMLINK+="android_fastboot"
|
||||
# Recovery adb entry for Nexus Family (orig d001, OP3 has 18d1:d002)
|
||||
ATTR{idProduct}=="d00?", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Google"
|
||||
|
||||
# Haier
|
||||
ATTR{idVendor}=="201e", ENV{adb_user}="yes"
|
||||
|
||||
# Hisense
|
||||
ATTR{idVendor}=="109b", ENV{adb_user}="yes"
|
||||
|
||||
# Honeywell/Foxconn
|
||||
ATTR{idVendor}!="0c2e", GOTO="not_Honeywell"
|
||||
ENV{adb_user}="yes"
|
||||
# D70e
|
||||
ATTR{idProduct}=="0ba3", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Honeywell"
|
||||
|
||||
# HTC
|
||||
ATTR{idVendor}!="0bb4", GOTO="not_HTC"
|
||||
ENV{adb_user}="yes"
|
||||
# fastboot mode enabled
|
||||
ATTR{idProduct}=="0fff", ENV{adb_adbfast}="yes", GOTO="android_usb_rule_match"
|
||||
# ChaCha
|
||||
ATTR{idProduct}=="0cb2", ENV{adb_adbfast}="yes"
|
||||
# Desire (Bravo)
|
||||
ATTR{idProduct}=="0c87", SYMLINK+="android_adb"
|
||||
# Desire HD
|
||||
ATTR{idProduct}=="0ca2", SYMLINK+="android_adb"
|
||||
# Desire S (Saga)
|
||||
ATTR{idProduct}=="0cab", SYMLINK+="android_adb"
|
||||
# Desire Z
|
||||
ATTR{idProduct}=="0c91", ENV{adb_adbfast}="yes"
|
||||
# Evo Shift
|
||||
ATTR{idProduct}=="0ca5", SYMLINK+="android_adb"
|
||||
# G1
|
||||
ATTR{idProduct}=="0c01", ENV{adb_adbfast}="yes"
|
||||
# HD2
|
||||
ATTR{idProduct}=="0c02", ENV{adb_adbfast}="yes"
|
||||
# Hero H2000
|
||||
ATTR{idProduct}=="0001", ENV{adb_adbfast}="yes"
|
||||
# Hero (GSM), Desire
|
||||
ATTR{idProduct}=="0c99", SYMLINK+="android_adb"
|
||||
# Hero (CDMA)
|
||||
ATTR{idProduct}=="0c9a", SYMLINK+="android_adb"
|
||||
# Incredible
|
||||
ATTR{idProduct}=="0c9e", SYMLINK+="android_adb"
|
||||
# Incredible rev 0002
|
||||
ATTR{idProduct}=="0c8d", SYMLINK+="android_adb"
|
||||
# MyTouch 4G
|
||||
ATTR{idProduct}=="0c96", SYMLINK+="android_adb"
|
||||
# One (m7) && One (m8)
|
||||
ATTR{idProduct}=="0c93"
|
||||
# Sensation
|
||||
ATTR{idProduct}=="0f87", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="0ff0", SYMLINK+="android_fastboot"
|
||||
# One V
|
||||
ATTR{idProduct}=="0ce5", SYMLINK+="android_adb"
|
||||
# One X
|
||||
ATTR{idProduct}=="0cd6", SYMLINK+="android_adb"
|
||||
# Slide
|
||||
ATTR{idProduct}=="0e03", SYMLINK+="android_adb"
|
||||
# Tatoo, Dream, ADP1, G1, Magic
|
||||
ATTR{idProduct}=="0c01"
|
||||
ATTR{idProduct}=="0c02", ENV{adb_adbfast}="yes"
|
||||
# Vision
|
||||
ATTR{idProduct}=="0c91", SYMLINK+="android_adb"
|
||||
# Wildfire
|
||||
ATTR{idProduct}=="0c8b", ENV{adb_adbfast}="yes"
|
||||
# Wildfire S
|
||||
ATTR{idProduct}=="0c86", ENV{adb_adbfast}="yes"
|
||||
# Zopo ZP900, Fairphone
|
||||
ATTR{idProduct}=="0c03", ENV{adb_adbfast}="yes"
|
||||
# Zopo C2
|
||||
ATTR{idProduct}=="2008", SYMLINK+="libmtp-%k", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_HTC"
|
||||
|
||||
# Huawei
|
||||
ATTR{idVendor}!="12d1", GOTO="not_Huawei"
|
||||
ENV{adb_user}="yes"
|
||||
# IDEOS
|
||||
ATTR{idProduct}=="1038", ENV{adb_adbfast}="yes"
|
||||
# U8850 Vision
|
||||
ATTR{idProduct}=="1021", ENV{adb_adbfast}="yes"
|
||||
# HiKey adb
|
||||
ATTR{idProduct}=="1057", SYMLINK+="android_adb"
|
||||
# HiKey usbnet
|
||||
ATTR{idProduct}=="1050", SYMLINK+="android_adb"
|
||||
# Honor 6
|
||||
ATTR{idProduct}=="103a", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="1051", SYMLINK+="libmtp-%k", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
|
||||
# MediaPad M2-A01L
|
||||
ATTR{idProduct}=="1052", SYMLINK+="android_adb"
|
||||
# Huawei Watch
|
||||
ATTR{idProduct}=="1c2c", SYMLINK+="android_adb"
|
||||
# Mate 9
|
||||
ATTR{idProduct}=="107e", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Huawei"
|
||||
|
||||
# Intel
|
||||
# Geeksphone Revolution
|
||||
ATTR{idVendor}=="8087", ATTR{idProduct}=="0a16", SYMLINK+="android_adb", ENV{adb_user}="yes"
|
||||
# Chuwi Hi 10 Pro (HQ64)
|
||||
ATTR{idVendor}=="8087", ATTR{idProduct}=="2a65", SYMLINK+="android_adb", ENV{adb_user}="yes"
|
||||
ATTR{idVendor}=="8087", ATTR{idProduct}=="07ef", SYMLINK+="android_adb", ENV{adb_user}="yes"
|
||||
# Reference Boards using kernelflinger
|
||||
# See https://github.com/intel/kernelflinger/blob/master/libefiusb/usb.c#L56
|
||||
ATTR{idProduct}=="09ef", ENV{adb_adbfast}="yes"
|
||||
|
||||
# IUNI
|
||||
ATTR{idVendor}!="271d", GOTO="not_IUNI"
|
||||
ENV{adb_user}="yes"
|
||||
# U3
|
||||
ATTR{idProduct}=="bf39", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_IUNI"
|
||||
|
||||
# K-Touch
|
||||
ATTR{idVendor}=="24e3", ENV{adb_user}="yes"
|
||||
|
||||
# KT Tech
|
||||
ATTR{idVendor}=="2116", ENV{adb_user}="yes"
|
||||
|
||||
# Kyocera
|
||||
#ATTR{idVendor}=="0482", ENV{adb_user}="yes"
|
||||
|
||||
# Lenovo
|
||||
ATTR{idVendor}=="17ef", ENV{adb_user}="yes"
|
||||
|
||||
# LeTv
|
||||
ATTR{idVendor}!="2b0e", GOTO="not_letv"
|
||||
ENV{adb_user}="yes"
|
||||
# LEX720 LeEco Pro3 6GB (610c=normal,610d=debug, 610b=camera)
|
||||
ATTR{idProduct}=="610d", ENV{adb_fastboot}="yes"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_letv"
|
||||
|
||||
# LG
|
||||
ATTR{idVendor}!="1004", GOTO="not_LG"
|
||||
ENV{adb_user}="yes"
|
||||
# Ally, Vortex, P500, P500h
|
||||
ATTR{idProduct}=="618f"
|
||||
ATTR{idProduct}=="618e", SYMLINK+="android_adb"
|
||||
# G2 D802
|
||||
ATTR{idProduct}=="61f1", SYMLINK+="android_adb"
|
||||
# G2 D803
|
||||
ATTR{idProduct}=="618c", SYMLINK+="android_adb"
|
||||
# G2 D803 rogers
|
||||
ATTR{idProduct}=="631f", SYMLINK+="android_adb"
|
||||
# G2 mini D620r (PTP)
|
||||
ATTR{idProduct}=="631d", SYMLINK+="android_adb"
|
||||
# G3 D855
|
||||
ATTR{idProduct}=="633e", SYMLINK+="android_adb"
|
||||
# Optimus LTE
|
||||
ATTR{idProduct}=="6315", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="61f9", SYMLINK+="libmtp-%k", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
|
||||
# Optimus One
|
||||
ATTR{idProduct}=="61c5", SYMLINK+="android_adb"
|
||||
# Swift GT540
|
||||
ATTR{idProduct}=="61b4", SYMLINK+="android_adb"
|
||||
# P500 CM10
|
||||
ATTR{idProduct}=="61a6", SYMLINK+="android_adb"
|
||||
# 4X HD P880
|
||||
ATTR{idProduct}=="61f9", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_LG"
|
||||
|
||||
# Meizu
|
||||
ATTR{idVendor}!="2a45", GOTO="not_Meizu"
|
||||
ENV{adb_user}="yes"
|
||||
# MX6
|
||||
ATTR{idProduct}=="0c02", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Meizu"
|
||||
|
||||
# Micromax
|
||||
ATTR{idVendor}!="2a96", GOTO="not_Micromax"
|
||||
ENV{adb_user}="yes"
|
||||
# P702
|
||||
ATTR{idProduct}=="201d", SYMLINK+="android_adb", SYMLINK+="android_fastboot"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Micromax"
|
||||
|
||||
# Motorola
|
||||
ATTR{idVendor}!="22b8", GOTO="not_Motorola"
|
||||
ENV{adb_user}="yes"
|
||||
# CLIQ XT/Quench
|
||||
ATTR{idProduct}=="2d66"
|
||||
# Defy/MB525
|
||||
ATTR{idProduct}=="428c"
|
||||
# Droid
|
||||
ATTR{idProduct}=="41db"
|
||||
# Xoom ID 1
|
||||
ATTR{idProduct}=="70a8", ENV{adb_adbfast}="yes"
|
||||
# Xoom ID 2
|
||||
ATTR{idProduct}=="70a9", ENV{adb_adbfast}="yes"
|
||||
# Razr XT912
|
||||
ATTR{idProduct}=="4362", ENV{adb_adbfast}="yes"
|
||||
# Moto XT1052
|
||||
ATTR{idProduct}=="2e83", ENV{adb_adbfast}="yes"
|
||||
# Moto E/G
|
||||
ATTR{idProduct}=="2e76", ENV{adb_adbfast}="yes"
|
||||
# Moto E/G (Dual SIM)
|
||||
ATTR{idProduct}=="2e80", ENV{adb_adbfast}="yes"
|
||||
# Moto E/G (Global GSM)
|
||||
ATTR{idProduct}=="2e82", ENV{adb_adbfast}="yes"
|
||||
# Moto x4
|
||||
ATTR{idProduct}=="2e81", ENV{adb_adbfast}="yes"
|
||||
# Droid Turbo 2
|
||||
ATTR{idProduct}=="2ea4", ENV{adb_adbfast}="yes", SYMLINK+="android%n"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Motorola"
|
||||
|
||||
# MTK
|
||||
ATTR{idVendor}=="0e8d", ENV{adb_user}="yes"
|
||||
|
||||
# NEC
|
||||
ATTR{idVendor}=="0409", ENV{adb_user}="yes"
|
||||
|
||||
# Nextbit
|
||||
ATTR{idVendor}=="2c3f", ENV{adb_user}="yes"
|
||||
|
||||
# Nokia X
|
||||
ATTR{idVendor}=="0421", ENV{adb_user}="yes"
|
||||
|
||||
# Nokia 3
|
||||
ATTR{idVendor}=="2e04", ENV{adb_user}="yes"
|
||||
|
||||
# Nook
|
||||
ATTR{idVendor}=="2080", ENV{adb_user}="yes"
|
||||
|
||||
# Nvidia
|
||||
ATTR{idVendor}=="0955", ENV{adb_user}="yes"
|
||||
# Audi SDIS Rear Seat Entertainment Tablet
|
||||
ATTR{idProduct}=="7000", SYMLINK+="android_fastboot"
|
||||
|
||||
# OnePlus(Oreo)
|
||||
ATTR{idVendor}!="2a70", GOTO="not_OnePlus"
|
||||
ENV{adb_user}="yes"
|
||||
# Charging mode
|
||||
ATTR{idProduct}=="4ee7", SYMLINK+="android_adb"
|
||||
# MTP mode
|
||||
ATTR{idProduct}=="9011", SYMLINK+="android_adb"
|
||||
# PTP mode
|
||||
ATTR{idProduct}=="904e", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_OnePlus"
|
||||
|
||||
# Oppo
|
||||
ATTR{idVendor}=="22d9", ENV{adb_user}="yes"
|
||||
# Find 5
|
||||
ATTR{idProduct}=="2767", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="2764", SYMLINK+="libmtp-%k", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
|
||||
|
||||
# OTGV
|
||||
ATTR{idVendor}=="2257", ENV{adb_user}="yes"
|
||||
|
||||
# Pantech
|
||||
ATTR{idVendor}=="10a9", ENV{adb_user}="yes"
|
||||
|
||||
# Pegatron
|
||||
ATTR{idVendor}=="1d4d", ENV{adb_user}="yes"
|
||||
|
||||
# Philips
|
||||
ATTR{idVendor}=="0471", ENV{adb_user}="yes"
|
||||
|
||||
# PMC-Sierra
|
||||
ATTR{idVendor}=="04da", ENV{adb_user}="yes"
|
||||
|
||||
# Qualcomm
|
||||
ATTR{idVendor}!="05c6", GOTO="not_Qualcomm"
|
||||
ENV{adb_user}="yes"
|
||||
# Geeksphone Zero
|
||||
ATTR{idProduct}=="9025", SYMLINK+="android_adb"
|
||||
# OnePlus One
|
||||
ATTR{idProduct}=="676?", SYMLINK+="android_adb"
|
||||
# OnePlus Two
|
||||
ATTR{idProduct}=="9011", SYMLINK+="android_adb"
|
||||
# OnePlus 3
|
||||
ATTR{idProduct}=="900e", SYMLINK+="android_adb"
|
||||
# OnePlus 3T
|
||||
ATTR{idProduct}=="676c", SYMLINK+="android_adb"
|
||||
# OnePlus 3T w/ Oreo MIDI mode
|
||||
ATTR{idProduct}=="90bb", SYMLINK+="android_adb"
|
||||
# OnePlus 5
|
||||
ATTR{idProduct}=="9011", SYMLINK+="android_adb"
|
||||
# Xiaomi A1 (90bb=midi+adb)
|
||||
ATTR{idProduct}=="90bb", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Qualcomm"
|
||||
|
||||
# Research In Motion, Ltd.
|
||||
ATTR{idVendor}!="0fca", GOTO="not_RIM"
|
||||
ENV{adb_user}="yes"
|
||||
# BlackBerry DTEK60
|
||||
ATTR{idProduct}=="8042", ENV{adb_fastboot}="yes"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_RIM"
|
||||
|
||||
# SK Telesys
|
||||
ATTR{idVendor}=="1f53", ENV{adb_user}="yes"
|
||||
|
||||
# Samsung
|
||||
ATTR{idVendor}!="04e8", GOTO="not_Samsung"
|
||||
# False positive printer
|
||||
ATTR{idProduct}=="3???", GOTO="android_usb_rules_end"
|
||||
ENV{adb_user}="yes"
|
||||
# Galaxy i5700
|
||||
ATTR{idProduct}=="681c", ENV{adb_adbfast}="yes"
|
||||
# Galaxy i5800 (681c=debug,6601=fastboot,68a0=mediaplayer)
|
||||
ATTR{idProduct}=="681c", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="6601", SYMLINK+="android_fastboot"
|
||||
ATTR{idProduct}=="68a9", SYMLINK+="libmtp-%k", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
|
||||
# Galaxy i7500
|
||||
ATTR{idProduct}=="6640", ENV{adb_adbfast}="yes"
|
||||
# Galaxy i9000 S, i9300 S3
|
||||
ATTR{idProduct}=="6601", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="685d", MODE="0660"
|
||||
ATTR{idProduct}=="68c3", MODE="0660"
|
||||
# Galaxy Ace (S5830) "Cooper"
|
||||
ATTR{idProduct}=="689e", ENV{adb_adbfast}="yes"
|
||||
# Galaxy Tab
|
||||
ATTR{idProduct}=="6877", ENV{adb_adbfast}="yes"
|
||||
# Galaxy Nexus (GSM) (6860=mtp,adb 6864=rndis,adb 6866=ptp,adb)
|
||||
ATTR{idProduct}=="6860", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="6864", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="6866", SYMLINK+="android_adb"
|
||||
# Galaxy Core, Tab 10.1, i9100 S2, i9300 S3, N5100 Note (8.0), Galaxy S3 SHW-M440S 3G (Korea only)
|
||||
ATTR{idProduct}=="6860", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="685e", ENV{adb_adbfast}="yes"
|
||||
# Galaxy i9300 S3
|
||||
ATTR{idProduct}=="6866", SYMLINK+="libmtp-%k", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
|
||||
# Galaxy S4 GT-I9500
|
||||
ATTR{idProduct}=="685d", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Samsung"
|
||||
|
||||
# Sharp
|
||||
ATTR{idVendor}=="04dd", ENV{adb_user}="yes"
|
||||
|
||||
# Sony
|
||||
ATTR{idVendor}=="054c", ENV{adb_user}="yes"
|
||||
|
||||
# Sony Ericsson
|
||||
ATTR{idVendor}!="0fce", GOTO="not_Sony_Ericsson"
|
||||
ENV{adb_user}="yes"
|
||||
# Xperia X10 mini
|
||||
ATTR{idProduct}=="3137"
|
||||
ATTR{idProduct}=="2137", SYMLINK+="android_adb"
|
||||
# Xperia X10 mini pro
|
||||
ATTR{idProduct}=="3138"
|
||||
ATTR{idProduct}=="2138", SYMLINK+="android_adb"
|
||||
# Xperia X8
|
||||
ATTR{idProduct}=="3149"
|
||||
ATTR{idProduct}=="2149", SYMLINK+="android_adb"
|
||||
# Xperia X12
|
||||
ATTR{idProduct}=="e14f"
|
||||
ATTR{idProduct}=="614f", SYMLINK+="android_adb"
|
||||
# Xperia Arc S
|
||||
ATTR{idProduct}=="414f", ENV{adb_adbfast}="yes"
|
||||
# Xperia Neo V (6156=debug,0dde=fastboot)
|
||||
ATTR{idProduct}=="6156", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="0dde", SYMLINK+="android_fastboot"
|
||||
# Xperia S
|
||||
ATTR{idProduct}=="5169", ENV{adb_adbfast}="yes"
|
||||
# Xperia SP
|
||||
ATTR{idProduct}=="6195", ENV{adb_adbfast}="yes"
|
||||
# Xperia L
|
||||
ATTR{idProduct}=="5192", ENV{adb_adbfast}="yes"
|
||||
# Xperia Mini Pro
|
||||
ATTR{idProduct}=="0166", ENV{adb_adbfast}="yes"
|
||||
# Xperia V
|
||||
ATTR{idProduct}=="0186", ENV{adb_adbfast}="yes"
|
||||
# Xperia Acro S
|
||||
ATTR{idProduct}=="5176", ENV{adb_adbfast}="yes"
|
||||
# Xperia Z1 Compact
|
||||
ATTR{idProduct}=="51a7", ENV{adb_adbfast}="yes"
|
||||
# Xperia Z2
|
||||
ATTR{idProduct}=="51ba", ENV{adb_adbfast}="yes"
|
||||
# Xperia Z3
|
||||
ATTR{idProduct}=="01af", ENV{adb_adbfast}="yes"
|
||||
# Xperia Z3 Compact
|
||||
ATTR{idProduct}=="01bb", ENV{adb_adbfast}="yes"
|
||||
# Xperia Z3+ Dual
|
||||
ATTR{idProduct}=="51c9", ENV{adb_adbfast}="yes"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Sony_Ericsson"
|
||||
|
||||
# Spreadtrum
|
||||
ATTR{idVendor}=="1782", ENV{adb_user}="yes"
|
||||
|
||||
# T & A Mobile Phones
|
||||
ATTR{idVendor}=="1bbb", ENV{adb_user}="yes"
|
||||
# Alcatel OT991D
|
||||
ATTR{idProduct}=="00f2", SYMLINK+="android_adb"
|
||||
# Alcatel OT6012A
|
||||
ATTR{idProduct}=="0167", SYMLINK+="android_adb"
|
||||
|
||||
# Teleepoch
|
||||
ATTR{idVendor}=="2340", ENV{adb_user}="yes"
|
||||
|
||||
# Texas Instruments UsbBoot
|
||||
ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", ENV{adb_user}="yes"
|
||||
ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", ENV{adb_user}="yes"
|
||||
|
||||
# Toshiba
|
||||
ATTR{idVendor}=="0930", ENV{adb_user}="yes"
|
||||
|
||||
# WEARNERS
|
||||
ATTR{idVendor}=="05c6", ENV{adb_user}="yes"
|
||||
|
||||
# XiaoMi
|
||||
ATTR{idVendor}!="2717", GOTO="not_XiaoMi"
|
||||
ENV{adb_user}="yes"
|
||||
# Mi2A
|
||||
ATTR{idProduct}=="904e", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="9039", SYMLINK+="android_adb"
|
||||
# Mi3
|
||||
ATTR{idProduct}=="0368", SYMLINK+="android_adb"
|
||||
# RedMi 1S WCDMA (MTP+Debug)
|
||||
ATTR{idProduct}=="1268", SYMLINK+="android_adb"
|
||||
# RedMi / RedMi Note WCDMA (MTP+Debug)
|
||||
ATTR{idProduct}=="1248", SYMLINK+="android_adb"
|
||||
# RedMi 1S / RedMi / RedMi Note WCDMA (PTP+Debug)
|
||||
ATTR{idProduct}=="1218", SYMLINK+="android_adb"
|
||||
# RedMi 1S /RedMi / RedMi Note WCDMA (Usb+Debug)
|
||||
ATTR{idProduct}=="1228", SYMLINK+="android_adb"
|
||||
# RedMi / RedMi Note 4G WCDMA (MTP+Debug)
|
||||
ATTR{idProduct}=="1368", SYMLINK+="android_adb"
|
||||
# RedMi / RedMi Note 4G WCDMA (PTP+Debug)
|
||||
ATTR{idProduct}=="1318", SYMLINK+="android_adb"
|
||||
# RedMi / RedMi Note 4G WCDMA (Usb+Debug)
|
||||
ATTR{idProduct}=="1328", SYMLINK+="android_adb"
|
||||
# Mi Mix / A1 (ff88=rndis+adb, ff18=ptp+adb, ff48=mtp+adb, ff28=storage+adb)
|
||||
ATTR{idProduct}=="ff88", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="ff18", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="ff48", SYMLINK+="android_adb"
|
||||
ATTR{idProduct}=="ff28", SYMLINK+="android_adb"
|
||||
# RedMi / RedMi Note 4G CDMA (Usb+Debug) / Mi4c / Mi5
|
||||
ATTR{idProduct}=="ff68", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_XiaoMi"
|
||||
|
||||
# Yota
|
||||
ATTR{idVendor}!="2916", GOTO="not_Yota"
|
||||
ENV{adb_user}="yes"
|
||||
# YotaPhone2 (f003=normal,9139=debug)
|
||||
ATTR{idProduct}=="9139", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Yota"
|
||||
|
||||
# Wileyfox
|
||||
ATTR{idVendor}=="2970", ENV{adb_user}="yes"
|
||||
|
||||
# YU
|
||||
ATTR{idVendor}=="1ebf", ENV{adb_user}="yes"
|
||||
|
||||
# Zebra
|
||||
ATTR{idVendor}!="05e0", GOTO="not_Zebra"
|
||||
ENV{adb_user}="yes"
|
||||
# TC55
|
||||
ATTR{idProduct}=="2101", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_Zebra"
|
||||
|
||||
# ZTE
|
||||
ATTR{idVendor}!="19d2", GOTO="not_ZTE"
|
||||
ENV{adb_user}="yes"
|
||||
# Blade (1353=normal,1351=debug)
|
||||
ATTR{idProduct}=="1351", SYMLINK+="android_adb"
|
||||
# Blade S (Crescent, Orange San Francisco 2) (1355=normal,1354=debug)
|
||||
ATTR{idProduct}=="1354", SYMLINK+="android_adb"
|
||||
GOTO="android_usb_rule_match"
|
||||
LABEL="not_ZTE"
|
||||
|
||||
# Wileyfox
|
||||
ATTR{idVendor}=="2970", ENV{adb_user}="yes"
|
||||
|
||||
# YU
|
||||
ATTR{idVendor}=="1ebf", ENV{adb_user}="yes"
|
||||
|
||||
# ZUK
|
||||
ATTR{idVendor}=="2b4c", ENV{adb_user}="yes"
|
||||
|
||||
# Skip other vendor tests
|
||||
LABEL="android_usb_rule_match"
|
||||
|
||||
# Symlink shortcuts to reduce code in tests above
|
||||
ENV{adb_adbfast}=="yes", ENV{adb_adb}="yes", ENV{adb_fast}="yes"
|
||||
ENV{adb_adb}=="yes", ENV{adb_user}="yes", SYMLINK+="android_adb"
|
||||
ENV{adb_fast}=="yes", ENV{adb_user}="yes", SYMLINK+="android_fastboot"
|
||||
|
||||
# Enable device as a user device if found (add an "android" SYMLINK)
|
||||
ENV{adb_user}=="yes", MODE="0660", GROUP="adbusers", TAG+="uaccess", SYMLINK+="android"
|
||||
|
||||
# Devices listed here {begin...end} are connected by USB
|
||||
LABEL="android_usb_rules_end"
|
||||
|
||||
#Suzy-Q
|
||||
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0660",
|
||||
GROUP="plugdev", SYMLINK+="android%n"
|
||||
|
40
README.md
40
README.md
|
@ -6,13 +6,18 @@ A tool to dump RAM using S-Boot Upload Mode (in python)
|
|||
Thx to Nitay Artenstein's code at https://github.com/nitayart/sboot_dump, ported
|
||||
to python and added full support based on reversing sboot
|
||||
|
||||
### Supported
|
||||
- Samsung QC
|
||||
- Samsung MTK
|
||||
- Samsung Unisoc not yet supported
|
||||
|
||||
### Install
|
||||
- Python 3.6 or higher
|
||||
``
|
||||
pip install pyusb pyserial
|
||||
``
|
||||
|
||||
### Run
|
||||
### Show partition table on the device
|
||||
``
|
||||
python3 scripts/samsungupload.py
|
||||
``
|
||||
|
@ -20,19 +25,46 @@ python3 scripts/samsungupload.py
|
|||
#### For dumping all memory areas:
|
||||
|
||||
``
|
||||
python3 scripts/samsungupload.py -all
|
||||
python3 scripts/samsungupload.py all
|
||||
``
|
||||
|
||||
#### For dumping a specfic memory range:
|
||||
|
||||
``
|
||||
python3 scripts/samsungupload.py range 0x0 0xffffffff
|
||||
``
|
||||
|
||||
#### For dumping a full memory range:
|
||||
|
||||
``
|
||||
python3 scripts/samsungupload.py full
|
||||
``
|
||||
|
||||
#### For dumping individual areas (Index 0):
|
||||
|
||||
``
|
||||
python3 scripts/samsungupload.py -a 0
|
||||
python3 scripts/samsungupload.py partition 0
|
||||
``
|
||||
|
||||
### Windows usage
|
||||
### Windows install
|
||||
- Install usbdk and make sure to remove old libusb dlls from windows/system32 folder.
|
||||
Get the usbdk installer (.msi) from [here](https://github.com/daynix/UsbDk/releases/) and install it
|
||||
- Install normal Samsung Serial Port driver (or use default Windows COM Port one, make sure no exclamation is seen)
|
||||
|
||||
### Linux install
|
||||
|
||||
```bash
|
||||
sudo apt purge ModemManager
|
||||
sudo usermod -aG plugdev $USER
|
||||
sudo usermod -aG dialout $USER
|
||||
sudo cp Drivers/*.rules /etc/udev/rules.d
|
||||
sudo udevadm control -R
|
||||
```
|
||||
|
||||
- Log in and out user
|
||||
|
||||
```bash
|
||||
sudo pip3 install -r requirements
|
||||
```
|
||||
|
||||
Enjoy !
|
||||
|
|
3
requirements.txt
Normal file
3
requirements.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
pyusb==1.2.1
|
||||
usb==0.0.83.dev0
|
||||
wheel==0.37.1
|
297
samupload.py
297
samupload.py
|
@ -1,15 +1,14 @@
|
|||
#!/usr/bin/env python3
|
||||
'''
|
||||
"""
|
||||
Licensed under MIT License, (c) B. Kerler
|
||||
'''
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import argparse
|
||||
import usb.core # pyusb
|
||||
import usb.util
|
||||
from binascii import hexlify
|
||||
from struct import unpack, pack, calcsize
|
||||
from struct import unpack, calcsize
|
||||
from io import BytesIO
|
||||
import logging
|
||||
import usb.backend.libusb0
|
||||
|
@ -40,11 +39,12 @@ USB_RECIP_RPIPE = 0x05
|
|||
|
||||
tag = 0
|
||||
|
||||
class usb_class():
|
||||
|
||||
def load_windows_dll(self):
|
||||
class usb_class:
|
||||
|
||||
@staticmethod
|
||||
def load_windows_dll():
|
||||
if os.name == 'nt':
|
||||
windows_dir = None
|
||||
try:
|
||||
# add pygame folder to Windows DLL search paths
|
||||
windows_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)))
|
||||
|
@ -189,17 +189,17 @@ class usb_class():
|
|||
if EP_OUT == -1:
|
||||
self.EP_OUT = usb.util.find_descriptor(itf,
|
||||
# match the first OUT endpoint
|
||||
custom_match=lambda e: \
|
||||
usb.util.endpoint_direction(e.bEndpointAddress) ==
|
||||
usb.util.ENDPOINT_OUT)
|
||||
custom_match=lambda em: \
|
||||
usb.util.endpoint_direction(em.bEndpointAddress) ==
|
||||
usb.util.ENDPOINT_OUT)
|
||||
else:
|
||||
self.EP_OUT = EP_OUT
|
||||
if EP_IN == -1:
|
||||
self.EP_IN = usb.util.find_descriptor(itf,
|
||||
# match the first OUT endpoint
|
||||
custom_match=lambda e: \
|
||||
usb.util.endpoint_direction(e.bEndpointAddress) ==
|
||||
usb.util.ENDPOINT_IN)
|
||||
custom_match=lambda em: \
|
||||
usb.util.endpoint_direction(em.bEndpointAddress) ==
|
||||
usb.util.ENDPOINT_IN)
|
||||
else:
|
||||
self.EP_IN = EP_IN
|
||||
|
||||
|
@ -216,7 +216,6 @@ class usb_class():
|
|||
if reset:
|
||||
self.device.reset()
|
||||
if not self.device.is_kernel_driver_active(self.interface):
|
||||
# self.device.attach_kernel_driver(self.interface) #Do NOT uncomment
|
||||
self.device.attach_kernel_driver(0)
|
||||
except Exception as err:
|
||||
self.debug(str(err))
|
||||
|
@ -237,7 +236,6 @@ class usb_class():
|
|||
except usb.core.USBError as err:
|
||||
error = str(err.strerror)
|
||||
if "timeout" in error:
|
||||
# time.sleep(0.01)
|
||||
try:
|
||||
self.EP_OUT.write(b'')
|
||||
except Exception as err:
|
||||
|
@ -254,34 +252,25 @@ class usb_class():
|
|||
pos += pktsize
|
||||
except Exception as err:
|
||||
self.debug(str(err))
|
||||
# print("Error while writing")
|
||||
# time.sleep(0.01)
|
||||
i += 1
|
||||
if i == 3:
|
||||
return False
|
||||
pass
|
||||
return True
|
||||
|
||||
def usbread(self, resplen = -1):
|
||||
def usbread(self, resplen=-1):
|
||||
res = bytearray()
|
||||
timeout = 0
|
||||
loglevel = self.loglevel
|
||||
epr = self.EP_IN.read
|
||||
wMaxPacketSize = self.EP_IN.wMaxPacketSize
|
||||
extend = res.extend
|
||||
cond = True
|
||||
if resplen == -1:
|
||||
rlen = 0xFFFFFFFF
|
||||
else:
|
||||
rlen = resplen
|
||||
|
||||
if resplen == -1:
|
||||
resplen = self.EP_IN.wMaxPacketSize
|
||||
|
||||
while len(res)<rlen:
|
||||
while len(res) < rlen:
|
||||
try:
|
||||
extend(epr(resplen))
|
||||
if len(res)%self.EP_IN.wMaxPacketSize!=0:
|
||||
extend(epr(self.EP_IN.wMaxPacketSize))
|
||||
if len(res) % self.EP_IN.wMaxPacketSize != 0:
|
||||
break
|
||||
except usb.core.USBError as e:
|
||||
error = str(e.strerror)
|
||||
|
@ -317,12 +306,10 @@ class usb_class():
|
|||
if pktsize is None:
|
||||
pktsize = len(data)
|
||||
res = self.write(data, pktsize)
|
||||
# port->flush()
|
||||
return res
|
||||
|
||||
def usbreadwrite(self, data, resplen):
|
||||
self.usbwrite(data) # size
|
||||
# port->flush()
|
||||
res = self.usbread(resplen)
|
||||
return res
|
||||
|
||||
|
@ -335,13 +322,13 @@ class usb_class():
|
|||
return data
|
||||
|
||||
def rword(self, count=1, little=False):
|
||||
rev = "<" if little else ">"
|
||||
rev = "little" if little else "big"
|
||||
data = []
|
||||
for _ in range(count):
|
||||
v = self.usbread(2)
|
||||
if len(v) == 0:
|
||||
return data
|
||||
data.append(unpack(rev + "H", v)[0])
|
||||
data.append(int.from_bytes(bytes=v,byteorder=rev))
|
||||
if count == 1:
|
||||
return data[0]
|
||||
return data
|
||||
|
@ -349,6 +336,19 @@ class usb_class():
|
|||
def rbyte(self, count=1):
|
||||
return self.usbread(count)
|
||||
|
||||
|
||||
def calcProcessTime(starttime, cur_iter, max_iter):
|
||||
telapsed = time.time() - starttime
|
||||
if telapsed > 0 and cur_iter > 0:
|
||||
testimated = (telapsed / cur_iter) * max_iter
|
||||
finishtime = starttime + testimated
|
||||
finishtime = dt.datetime.fromtimestamp(finishtime).strftime("%H:%M:%S") # in time
|
||||
lefttime = testimated - telapsed # in seconds
|
||||
return int(telapsed), int(lefttime), finishtime
|
||||
else:
|
||||
return 0, 0, ""
|
||||
|
||||
|
||||
class progress:
|
||||
def __init__(self, pagesize):
|
||||
self.progtime = 0
|
||||
|
@ -357,21 +357,10 @@ class progress:
|
|||
self.start = time.time()
|
||||
self.pagesize = pagesize
|
||||
|
||||
def calcProcessTime(self, starttime, cur_iter, max_iter):
|
||||
telapsed = time.time() - starttime
|
||||
if telapsed > 0 and cur_iter > 0:
|
||||
testimated = (telapsed / cur_iter) * (max_iter)
|
||||
finishtime = starttime + testimated
|
||||
finishtime = dt.datetime.fromtimestamp(finishtime).strftime("%H:%M:%S") # in time
|
||||
lefttime = testimated - telapsed # in seconds
|
||||
return int(telapsed), int(lefttime), finishtime
|
||||
else:
|
||||
return 0, 0, ""
|
||||
|
||||
def show_progress(self, prefix, pos, total, display=True):
|
||||
if total == 0:
|
||||
return
|
||||
prog = round(float(pos) / float(total) * float(100), 1)
|
||||
prog = round(pos / total * 100, 2)
|
||||
if prog == 0:
|
||||
self.prog = 0
|
||||
self.start = time.time()
|
||||
|
@ -379,9 +368,7 @@ class progress:
|
|||
self.progpos = pos
|
||||
print_progress(prog, 100, prefix='Done',
|
||||
suffix=prefix + ' (Sector 0x%X of 0x%X) %0.2f MB/s' %
|
||||
(pos // self.pagesize,
|
||||
total // self.pagesize,
|
||||
0), bar_length=50)
|
||||
(pos // self.pagesize, total // self.pagesize, 0), bar_length=50)
|
||||
|
||||
if prog > self.prog:
|
||||
if display:
|
||||
|
@ -389,43 +376,37 @@ class progress:
|
|||
tdiff = t0 - self.progtime
|
||||
datasize = (pos - self.progpos) / 1024 / 1024
|
||||
if datasize != 0 and tdiff != 0:
|
||||
try:
|
||||
throughput = datasize / tdiff
|
||||
except:
|
||||
throughput = 0
|
||||
throughput = datasize / tdiff
|
||||
else:
|
||||
throughput = 0
|
||||
telapsed, lefttime, finishtime = self.calcProcessTime(self.start, prog, 100)
|
||||
telapsed, lefttime, finishtime = calcProcessTime(self.start, prog, 100)
|
||||
hinfo = ""
|
||||
if lefttime > 0:
|
||||
sec = lefttime
|
||||
if sec > 60:
|
||||
min = sec // 60
|
||||
rmin = sec // 60
|
||||
sec = sec % 60
|
||||
if min > 60:
|
||||
h = min // 24
|
||||
min = min % 24
|
||||
hinfo = "%02dh:%02dm:%02ds left" % (h, min, sec)
|
||||
if rmin > 60:
|
||||
h = rmin // 24
|
||||
rmin = rmin % 24
|
||||
hinfo = "%02dh:%02dm:%02ds left" % (h, rmin, sec)
|
||||
else:
|
||||
hinfo = "%02dm:%02ds left" % (min, sec)
|
||||
hinfo = "%02dm:%02ds left" % (rmin, sec)
|
||||
else:
|
||||
hinfo = "%02ds left" % sec
|
||||
if hinfo != "":
|
||||
print_progress(prog, 100, prefix='Progress:',
|
||||
suffix=prefix + f' (Sector 0x%X of 0x%X, {hinfo}) %0.2f MB/s' %
|
||||
(pos // self.pagesize,
|
||||
total // self.pagesize,
|
||||
throughput), bar_length=50)
|
||||
(pos // self.pagesize, total // self.pagesize, throughput), bar_length=50)
|
||||
else:
|
||||
print_progress(prog, 100, prefix='Progress:',
|
||||
suffix=prefix + f' (Sector 0x%X of 0x%X) %0.2f MB/s' %
|
||||
(pos // self.pagesize,
|
||||
total // self.pagesize,
|
||||
throughput), bar_length=50)
|
||||
(pos // self.pagesize, total // self.pagesize, throughput), bar_length=50)
|
||||
self.prog = prog
|
||||
self.progpos = pos
|
||||
self.progtime = t0
|
||||
|
||||
|
||||
def print_progress(iteration, total, prefix='', suffix='', decimals=1, bar_length=100):
|
||||
"""
|
||||
Call in a loop to create terminal progress bar
|
||||
|
@ -442,7 +423,7 @@ def print_progress(iteration, total, prefix='', suffix='', decimals=1, bar_lengt
|
|||
str_format = "{0:." + str(decimals) + "f}"
|
||||
percents = str_format.format(100 * (iteration / float(total)))
|
||||
filled_length = int(round(bar_length * iteration / float(total)))
|
||||
bar = '█' * filled_length + '-' * (bar_length - filled_length)
|
||||
bar = '=' * filled_length + '-' * (bar_length - filled_length)
|
||||
|
||||
sys.stdout.write('\r%s |%s| %s%s %s' % (prefix, bar, percents, '%', suffix))
|
||||
|
||||
|
@ -500,7 +481,7 @@ class structhelper_io:
|
|||
self.data.seek(pos)
|
||||
|
||||
|
||||
class partitiontable():
|
||||
class partitiontable:
|
||||
ptype = None
|
||||
pname = None
|
||||
pstart = None
|
||||
|
@ -524,7 +505,48 @@ class partitiontable():
|
|||
return f"\"{self.pname}\" ({hex(self.pstart)},{hex(self.pend)})"
|
||||
|
||||
|
||||
class samsung_upload():
|
||||
def bytetostr(data):
|
||||
return data.rstrip(b"\x00").decode('utf-8')
|
||||
|
||||
|
||||
def get_probe_table(data):
|
||||
count = 0
|
||||
devicename = bytetostr(data[0:16])
|
||||
data = BytesIO(data)
|
||||
if devicename[0] != "+":
|
||||
mode = 32
|
||||
size = 0x1C
|
||||
else:
|
||||
mode = 64
|
||||
size = 0x28
|
||||
devicename = devicename[1:]
|
||||
|
||||
probetable = []
|
||||
data.seek(0x10)
|
||||
while data.tell() != data.getbuffer().nbytes:
|
||||
pt = partitiontable(data.read(size), mode)
|
||||
if pt.pstart == 0 and pt.pend == 0:
|
||||
break
|
||||
if pt.pstart < 20:
|
||||
break
|
||||
probetable.append(pt)
|
||||
count += 1
|
||||
return mode, devicename, probetable
|
||||
|
||||
|
||||
def print_probe(mode, devicename, probetable):
|
||||
print(f"\nProbed device:\n" +
|
||||
f"---------------\n" +
|
||||
f"{mode}-Bit, " +
|
||||
f"Devicename: \"{devicename}\"\n")
|
||||
print("Detected upload areas:\n---------------------")
|
||||
count = 0
|
||||
for pt in probetable:
|
||||
print(f"{count}: {pt}")
|
||||
count += 1
|
||||
|
||||
|
||||
class samsung_upload:
|
||||
|
||||
def __init__(self):
|
||||
self.cdc = None
|
||||
|
@ -534,7 +556,7 @@ class samsung_upload():
|
|||
VENDOR_SAMSUNG = 0x04e8
|
||||
PRODUCT_MODEM = 0x685d
|
||||
portconfig = [[VENDOR_SAMSUNG, PRODUCT_MODEM, -1]]
|
||||
self.cdc = usb_class(loglevel=logging.INFO,portconfig=portconfig,devclass=10)
|
||||
self.cdc = usb_class(loglevel=logging.INFO, portconfig=portconfig, devclass=10)
|
||||
self.cdc.connected = self.cdc.connect()
|
||||
if self.cdc.connected:
|
||||
self.cdc.write(b"PrEaMbLe\0")
|
||||
|
@ -546,64 +568,21 @@ class samsung_upload():
|
|||
return True
|
||||
return False
|
||||
|
||||
def bytetostr(self, data):
|
||||
return data.rstrip(b"\x00").decode('utf-8')
|
||||
|
||||
def probe(self):
|
||||
self.cdc.write(b"PrObE\0")
|
||||
if os.name == 'nt':
|
||||
data = self.cdc.usbread(6*self.cdc.EP_IN.wMaxPacketSize)
|
||||
else:
|
||||
data = self.cdc.usbread()
|
||||
#print(hexlify(data).decode('utf-8'))
|
||||
return self.get_probe_table(data)
|
||||
|
||||
def get_probe_table(self, data):
|
||||
count = 0
|
||||
devicename = self.bytetostr(data[0:16])
|
||||
data = BytesIO(data)
|
||||
if devicename[0] != "+":
|
||||
mode = 32
|
||||
size = 0x1C
|
||||
else:
|
||||
mode = 64
|
||||
size = 0x28
|
||||
devicename = devicename[1:]
|
||||
|
||||
probetable = []
|
||||
data.seek(0x10)
|
||||
while data.tell() != data.getbuffer().nbytes:
|
||||
pt = partitiontable(data.read(size), mode)
|
||||
if pt.pstart == 0 and pt.pend == 0:
|
||||
break
|
||||
if pt.pstart < 20:
|
||||
break
|
||||
probetable.append(pt)
|
||||
count += 1
|
||||
return mode, devicename, probetable
|
||||
|
||||
def print_probe(self, mode, devicename, probetable):
|
||||
print(f"\nProbed device:\n" +
|
||||
f"---------------\n" +
|
||||
f"{mode}-Bit, " +
|
||||
f"Devicename: \"{devicename}\"\n")
|
||||
print("Detected upload areas:\n---------------------")
|
||||
count = 0
|
||||
for pt in probetable:
|
||||
print(f"{count}: {pt}")
|
||||
count += 1
|
||||
|
||||
data = self.cdc.usbread(0x8000)
|
||||
return get_probe_table(data)
|
||||
|
||||
def command(self, command, ack=True):
|
||||
command += b"\0"
|
||||
self.cdc.write(command)
|
||||
if ack:
|
||||
tmp = self.cdc.usbread(self.cdc.EP_IN.wMaxPacketSize)
|
||||
if tmp not in [b"AcKnOwLeDgMeNt\x00",b"PoStAmBlE\x00"]:
|
||||
if tmp not in [b"AcKnOwLeDgMeNt\x00", b"PoStAmBlE\x00"]:
|
||||
return False
|
||||
return True
|
||||
|
||||
def download_area(self,wfilename,rstart:int, rend:int):
|
||||
def download_area(self, wfilename, rstart: int, rend: int):
|
||||
filename = os.path.basename(wfilename)
|
||||
self.progress.show_progress('File: \"%s\"' % filename, 0, rend - rstart + 1, True)
|
||||
with open(wfilename, "wb") as wf:
|
||||
|
@ -620,7 +599,7 @@ class samsung_upload():
|
|||
total = rend + 1 - rstart
|
||||
pos = 0
|
||||
while pos < total:
|
||||
self.progress.show_progress('File: \"%s\"' % filename, pos, rend - rstart+1, True)
|
||||
self.progress.show_progress('File: \"%s\"' % filename, pos, rend - rstart + 1, True)
|
||||
size = total - pos
|
||||
if size > 0x80000:
|
||||
size = 0x80000
|
||||
|
@ -629,19 +608,19 @@ class samsung_upload():
|
|||
self.command(b"AcKnOwLeDgMeNt", False)
|
||||
wf.write(data)
|
||||
pos += len(data)
|
||||
self.progress.show_progress('File: \"%s\"' % filename, rend - rstart+1, rend - rstart+1, True)
|
||||
self.progress.show_progress('File: \"%s\"' % filename, rend - rstart + 1, rend - rstart + 1, True)
|
||||
data = self.cdc.usbread(64)
|
||||
if data == b'PoStAmBlE\x00':
|
||||
return True
|
||||
return False
|
||||
|
||||
def download(self, area):
|
||||
if not "." in area.pname:
|
||||
if "." not in area.pname:
|
||||
filename = "%s_%x_%x.lst" % (area.pname, area.pstart, area.pend)
|
||||
else:
|
||||
filename = area.pname
|
||||
wfilename = os.path.join("memory", filename)
|
||||
if self.download_area(wfilename,area.pstart,area.pend):
|
||||
if self.download_area(wfilename, area.pstart, area.pend):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
@ -649,49 +628,70 @@ class samsung_upload():
|
|||
def main():
|
||||
parser = argparse.ArgumentParser(description='SUC - Samsung Upload Client (c) B.Kerler 2018-2022.')
|
||||
|
||||
print("\nSUC - Samsung Upload Client v1.2 (c) B. Kerler 2018-2022, Email: info @ revskills.de")
|
||||
subparser = parser.add_subparsers(dest="cmd",help="Valid commands are: \nprint, partition, all, range, full")
|
||||
|
||||
print_parser = subparser.add_parser("print", help="Print Memory information")
|
||||
print("\nSUC - Samsung Upload Client v1.3 (c) B. Kerler 2018-2022, Email: info @ revskills.de")
|
||||
subparser = parser.add_subparsers(dest="cmd", help="Valid commands are: \nprint, partition, all, range, full")
|
||||
|
||||
partition_parser = subparser.add_parser("partition", help="Download specific memory partition")
|
||||
partition_parser.add_argument('partition', help='Partition number to read')
|
||||
|
||||
all_parser = subparser.add_parser("all", help="Download all memory partitions")
|
||||
subparser.add_parser("all", help="Download all memory partitions")
|
||||
|
||||
range_parser = subparser.add_parser("range", help="Download specific range")
|
||||
range_parser.add_argument('start', help='Start offset in hex')
|
||||
range_parser.add_argument('end', help='Start offset in hex')
|
||||
|
||||
full_parser = subparser.add_parser("full", help="Download full memory 1-0xFFFFFFFFFFFFFFF")
|
||||
subparser.add_parser("full", help="Download full memory 1-0xFFFFFFFFFFFFFFF")
|
||||
|
||||
file_parser = subparser.add_parser("file", help="Print partition table from file")
|
||||
file_parser.add_argument('filename', help='Filename to read from')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
suc = samsung_upload()
|
||||
if suc.connect():
|
||||
mode, devicename, probetable = suc.probe()
|
||||
cmd = args.cmd
|
||||
if cmd == "print":
|
||||
suc.print_probe(mode,devicename,probetable)
|
||||
elif cmd == "all":
|
||||
cmd = args.cmd
|
||||
connected = False
|
||||
mode = ""
|
||||
devicename = ""
|
||||
probetable = None
|
||||
if cmd != "file":
|
||||
if suc.connect():
|
||||
mode, devicename, probetable = suc.probe()
|
||||
connected = True
|
||||
|
||||
if cmd is None:
|
||||
if connected:
|
||||
print_probe(mode, devicename, probetable)
|
||||
print("\nRun 'samupload.py all' to dump all areas")
|
||||
print("Run 'samupload.py partition [number]' to dump specific area")
|
||||
print("Run 'samupload.py range [start_hex] [end_hex]' to dump specific memarea")
|
||||
print("Run 'samupload.py full' to try to bruteforce dump memarea")
|
||||
print("Run 'samupload.py file [filename]' to print the partition table from file")
|
||||
elif cmd == "all":
|
||||
if connected:
|
||||
if os.path.exists("memory"):
|
||||
shutil.rmtree("memory")
|
||||
os.mkdir("memory")
|
||||
print("\nDownloading ....\n-----------------")
|
||||
for area in probetable:
|
||||
suc.download(area)
|
||||
suc.command(b"PoStAmBlE")
|
||||
elif cmd == "range":
|
||||
start = int(args.start,16)
|
||||
end = int(args.end,16)
|
||||
suc.command(b"PoStAmBlE", False)
|
||||
print("Done. Dumped memory has been written to memory directory.")
|
||||
elif cmd == "range":
|
||||
if connected:
|
||||
start = int(args.start, 16)
|
||||
end = int(args.end, 16)
|
||||
print("\nDownloading ....\n-----------------")
|
||||
suc.download_area("range.bin",start,end)
|
||||
elif cmd == "full":
|
||||
suc.download_area("range.bin", start, end)
|
||||
print("Done. Dumped memory was written to range.bin")
|
||||
elif cmd == "full":
|
||||
if connected:
|
||||
start = 1
|
||||
end = 0xFFFFFFFFFFFFFFF
|
||||
print("\nDownloading ....\n-----------------")
|
||||
suc.download_area("range.bin",start,end)
|
||||
elif cmd == "partition":
|
||||
suc.download_area("range.bin", start, end)
|
||||
print("Done. Dumped memory was written to range.bin")
|
||||
elif cmd == "partition":
|
||||
if connected:
|
||||
if args.partition is not None:
|
||||
print("\nDownloading ....\n-----------------")
|
||||
area = int(args.partition)
|
||||
|
@ -700,20 +700,13 @@ def main():
|
|||
exit(0)
|
||||
suc.download(probetable[area])
|
||||
suc.command(b"PoStAmBlE")
|
||||
else:
|
||||
print("\nRun 'samupload.py -all' to dump all areas")
|
||||
print("Run 'samupload.py -a [number]' to dump specific area")
|
||||
|
||||
print("Done. Dumped memory has been written to memory directory.")
|
||||
|
||||
|
||||
def test():
|
||||
with open("samsung_dump.bin", "rb") as rf:
|
||||
data = rf.read()
|
||||
suc = samsung_upload()
|
||||
probetable = suc.get_probe_table(data)
|
||||
print("Done. Dumped memory was written the memory directory")
|
||||
elif cmd == "file":
|
||||
with open(args.filename, "rb") as rf:
|
||||
data = rf.read()
|
||||
mode, devicename, probetable = get_probe_table(data)
|
||||
print_probe(mode, devicename, probetable)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
#test()
|
||||
|
|
Loading…
Reference in a new issue