Android逆向中adb常用命令总结及问题

查看 92|回复 9
作者:菜鸟也是鸟   
adb 其实就是 Android Debug Bridge, Android 调试桥的缩写,adb 是一个 C/S 架构的命令行工具,主要由 3 部分组成:
  • 运行在 PC 端的 Client : 可以通过它对 Android 应用进行安装、卸载及调试
    Eclipse中的 ADT、SDK Tools 目录下的 DDMS、Monitor 等工具,都是同样地用到了 adb 的功能来与 Android 设备进行交互。
    PC 端的手机助手,诸如 360 手机助手、豌豆荚、应用宝等,其除了安装第三方应用方便,其他的功能,基本上都可以通过 adb 命令去完成,这里建议测试人员尽量不要在电脑上安装这类手机助手,因为其自带的 adb 程序可能会与 Android SDK 下的 adb 程序产生冲突,5037 端口被占用,导致使用 adb 命令时无法连接到设备

  • 运行在PC端的Service : 其管理客户端到 Android 设备上 adb 后台进程的连接
    adb 服务启动后,Windows 可以在任务管理器中找到 adb.exe 这个进程

  • 运行在 Android 设备上的adb后台进程
    执行 adb shell ps | grep adbd ,可以找到该后台进程,windows 请使用 findstr 替代 grep

    [xuxu:~]$ adb shell ps | grep adbd
    root 23227 1 6672 832 ffffffff 00019bb4 S /sbin/adbd

    adb连接手机进行调试有两种方式,一种使用USB线,一种使用无线WiFi。
    第一种  使用USB线连接
    1. 在手机上启用USB调试
    2. CMD窗口输入adb devices,此时可以看到自己的设备。
    【注】:无法看到自己设备时,查看手机USB调试是否打开;PC端是否安装手机驱动。
    1. 硬件状态正常。
    包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好。
    2. Android 设备的开发者选项和 USB 调试模式已开启。
    可以到「设置」-「开发者选项」-「Android 调试」查看。
    如果在设置里找不到开发者选项,那需要通过一个彩蛋来让它显示出来:在「设置」-「关于手机」连续点击「版本号」7 次。
    3. 设备驱动状态正常。
    这一点在 Linux 和 Mac OS X 下基本不用操心,在 Windows 下有可能遇到需要安装驱动的情况,确认这一点可以右键「计算机」-「属性」,到「设备管理器」里查看相关设备上是否有黄色感叹号或问号,如果没有就说明驱动状态已经好了。否则可以下载一个手机助手类程序来安装驱动先。
    第二种  使用无线WiFi连接
    首先先了解一点底层的知识:
        Android系统底层运行着一个服务(adbd),用于响应和管理大家在电脑端的adb命令连接,这个服务在启动时会根据手机的配置监听USB连接或网络其中之一。配置的属性为:service.adb.tcp.port,也就是监听的网络端口
    * 以上属性的值 > 0:adbd将监听网络对应的端口(一般为5555)
    * 以上属性的值
    【注】:
    1、 将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
    2、将设备与电脑通过 USB 线连接,可通过命令 adb devices 查看是否连接成功
    3、 让设备在 5555 端口监听 TCP/IP 连接:
    adb tcpip 5555
    4、断开 USB 连接。
    5、找到设备的 IP 地址。
    一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到,也可以使用命令查看;
    adb shell ifconfig | grep Mask
    或者
    adb shell ifconfig wlan0
    【注】:如果一开始没有USB连接线,Android设备中没有开启adbd服务怎么办?
    1、在 Android 设备上安装一个终端模拟器。
    已经安装过的设备可以跳过此步。终端模拟器下载地址是:
    Terminal Emulator for Android Downloads
    2、 将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
    3、 打开 Android 设备上的终端模拟器,在里面依次运行命令:
    su
    setprop service.adb.tcp.port 5555
    4、在电脑上通过adb和Android设备的IP地址连接Android设备。
    adb connect IP地址:端口号
    【注】:有的设备,需要在第四步执行之前,需要重启adbd服务,可以执行下面命令:
    restart adbd
    #如果该命令无效,尝试以下命令:
    adbd stop
    adbd start---------------------------------------------------------------------------------------------------
    常用命令总结:
      (1)adb设置全局代{过}{滤}理
    // 设置代{过}{滤}理
    adb shell settings put global http_proxy IP地址:端口号
    // 移除代{过}{滤}理
    adb shell settings delete global http_proxy
    adb shell settings delete global global_http_proxy_host
    adb shell settings delete global global_http_proxy_port
    (2)查看是否可以找到设备
    adb devices
    【注】:查看设备连接状态   adb devices -l
    (3)将apk安装到手机中,或者将apk卸载(前提:手机连接上电脑)
    adb install  xxx.apk;
    adb uninstall xxx.apk;
    【注】:adb uninstall +apk的包名,报错:
    Failure [DELETE_FAILED_INTERNAL_ERROR]
    首先,安装后进入到shell中,pm path 包名,找到该包的位置,
    然后,去掉“.apk”这个文件后缀,还需要去掉“-1”,因为“-1”它不是包名的一部分,而多次重复安装时Android系统自动加上的,然后执行命令:adb uninstall  包名,就可以成功了。
    安装/卸载设备中的应用:(前提:adb shell先进入到设备中)
    pm  install /sdcard/xxx.apk
    pm uninstall [packagename]
    清空指定包名应用的数据:
    pm clear [packagename]  
    (4)指定adb server的网络端口
    adb -P  start-server
    【注】:ADB的默认端口为 5037;
    (5)将某内容写入到文件中
    adb shell echo "1233" >> /data/local/tmp/xxx.config
    (6)查看Android设备的CPU架构信息
    adb shell  cat /proc/cpuinfo
    (3)对程序进行调试
    adb shell am start -D -n [包名]/[包名].[活动activity名称]
    【注】:-D 的意思是用Debug方式启动应用;
    (3)启动一个应用/服务/发送一个广播
    adb shell am start -n [包名]/[包名].[活动activity名称]
    adb shell am startservice -n [包(package)名]/[包名].[服务(service)名]
    adb shell am broadcast -a [广播动作]
    例:adb shell am broadcast -a com.android.captureCamera.CaptureCameraService  //启动nubia手机的抓拍功能
    (4)查看是否能连接手机,进入到shell窗口
    adb shell(注: 为了进入手机或模拟器的shell内核)
    获取用root权限:su
    如果root用户切换到普通用户:su shell
    查看当前目录下的所有文件,包含隐藏文件:ls -al
    创建目录/删除目录:mkdir xxx / rmdir xxx
    新建文件/删除文件:
    (4)adb logcat
    打印指定Tag的日志信息:
    adb logcat -s tag
    【注】:“-s”选项 : 设置默认的过滤器,
    例如:想要输出 “System.out” 标签的信息, 就可以使用如下命令
    adb logcat -s System.out
    打印当前某个应用的日志信息
    adb logcat |findstr pname/pid/keyword
    【补充】:在运行adb shell后,也可以:logcat |grep 某个应用的名;
    打印日志重定向到某个文件中
    adb shell logcat >D:/123/logcat.log
    adb shell logcat  //持续输出日志,直到Ctrl+C
    adb shell logcat -d    //一次性输出日志缓存,不会阻塞
    adb shell logcat -c    //清空日志缓存
    (5)adb push E:/burpnew.cer /sdcard/Download
    (6)如果有多个设备,连接到某个设备/模拟器:
    adb -s xxx(设备的名称) shell
    adb -s emulator-5554 shell
    (7)adb pull/adb push
    注:当我们执行默认adb命令时(adb pull或adb push等),都是以shell身份在执行,而非root身份,此时对于命令中的目录权限就要特别注意,当访问的目录需要root权限,或只有程序自身才有访问权限的目录时(典型的如/data/data下的目录),虽然目录和文件都在,但命令仍然是无法访问的,提示remote object does not exist或permission denied。
    1、将电脑上的文件上传到手机中
    adb push E:/123/xx.txt  /data/local/tmp;
    如果在执行命令时报错,需要查看一下/data/local/tmp文件夹的读写权限定义;
    可以看到该目录的拥有者和所属组有的属于shell,有的属于root,shell和root具有读写执行的权限,但第三个权限位为--x,即意味着除root和shell用户外,其它用户一律没有读写的权限。但我们在运行该app时,默认的用户却是该进程本身,并非root或shell,所以此时是没有办法写入任何文件到/data/local/tmp的。要想这样做必须先通过代码动态改变当前用户模式到root模式,才能继续往下操作。
    解决办法:改变/data/local/tmp/的权限,例如设置:chmod 777 /data/local/tmp/*
    2、将手机中的文件下拉到电脑中
    使用场景:测试app本地敏感数据时,一般把/data/data/中的文件,从手机中下拉到电脑上进行查看;
    adb pull /data/data/包名/xxx  E:/123/
    【注】:目录/data/data/包名/是程序自身目录,不能直接下拉到电脑中,可以进入到shell后,修改/data/data/包名/xx/的权限,例如:chmod 777 xxx,然后将相应的目录复制到/data/local/tmp目录中,cp -r /data/data/包名/xxx/.  /data/local/tmp;然后,退出shell,以root用户进行adb,adb root,然后再执行下拉命令。
    (8)检查adb的版本
    注:安卓在4.x上的版本都要求adb版本必须在1.0.31版本及以上
    adb version
    查看adb的端口是什么?(注:一般adb端口是5037)
    adb nodaemon server
    判断端口
    netstat -ano|findstr "5037"
    关闭/重启adb
    adb kill-server
    adb start-server
    (8)获取设备列表及设备的状态
    adb devices
    (8)截屏操作
    adb shell screencap -p 截图文件路径
    例:adb shell screencap  -p /sdcard/tmp.png
    (8)输入文本内容
    adb shell input text 【需要输入文本框内容】
    (8)设备的端口转发
    【用法】:adb forward[(远程端)协议:端口号][(设备端)协议:端口号]
    例如:
    adb forward tcp:23946  tcp:23946
    adb forward tcp:8700 jdwp:1786
    【注】: JDWP(Java Debug Wire Protocol)是一个为 Java 调试而设计的一个通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。在JPDA(Java Platform Debugger Architecture)中,它定义了调试器(debugger)和被调试的 Java 虚拟机(target vm)之间的通信协议。
    (8)查看设备中可以被调试的应用的进程号
    adb jdwp
    (8)非root设备中查看指定debug模式的包名应用沙盒数据
    run-as [package name]
    (8)查看设备的ip地址(查看设备的网络连接情况)
    adb shell netcfg
    (8)查看设备的端口号信息
    adb shell netstat
    (8)查看当前应用的CPU消耗信息
    top
    (8)操作apk命令
    查看aapt中的信息以及编辑apk程序包
    【用法】:aapt dump xmltree [apk包][需要查看的资源文件xml]
    例如: aapt dump xmltree demo.apk AndroidManifest.xml
    【注】:也可以重定向把输出信息保存到文件中
    aapt dump xmltree demo.apk AndroidManifest.xml>D:/123/456.txt
    用dexdump查看dex文件的详细信息
    【用法】:dexdump [dex文件路径]
    (8)进程命令
    查看当前进程的内存加载情况
    ps -ef|grep 应用名         //查看某个应用的运行情况
    cat /proc/[pid]/maps | grep 应用名   //查看当前进程的内存映射信息,比如加载了哪些so文件、dex文件等
    查看进程的状态信息
    cat /proc/[pid]/status
    (9)adb shell dumpsys命令
    adb shell dumpsys,默认打印出当前系统所有service信息,在后面可加上具体的服务名
    查看当前运行应用、进程的包名与Activity名,可运行:
    adb shell dumpsys window | findstr mCurrentFocus
    -------------------------------------------------------------------------------------------
    【adb常见问题】:
    (1) 在adb install /push等命令时,报错 to '/data/local/tmp/': Is a directory,如何解决?
    方案1:将要install或者push的文件,放到非中文目录中进行尝试。
    方案2:先执行adb root,然后再执行相应的命令;
    方案3:如果adb install无法安装,但是能够adb push;可以先adb push将相应的文件放置到收集的某个目录中;然后,通过pm install   xxx将该文件安装上。
    (2)手机快捷键截屏后,放在目录:
    /sdcard/Pictures/Screenshots
    (3)Android:cannot open transport registration socketpair:Invalid argument


    image.png (28.71 KB, 下载次数: 1)
    下载附件
    2021-3-23 15:33 上传

    解决:
    1、有可能是防火墙的问题,在电脑进行更新时,防火墙会自己启动;需要把防火墙关掉,然后再试一下
    adb 是否可以使用;
    2、可以将adb服务关掉,再重启
    adb kill-server
    adb start-server
    3、如果报错can't connect debugger port(localhost:8700)时,需要查看端口是否被占用;
    netstat -ano| findstr "8700"
    如果端口被占用的话,可以使用命令杀死
    taskkill /pid 进程号 -f
    4、如果adb start-server时,5037端口起不来,同样使用该方法进行解决;
    (4)Android修改ro.debuggable,真机adb调试所有进程
    前置条件:
    1、已解锁、ROOT
    2、安装Magisk
    输入以下命令:
    adb shell #adb进入命令行模式
    su #切换至超级用户
    magisk resetprop ro.debuggable 1
    stop;start; #一定要通过该方式重启
    此方法为临时修改,重启后会失效;不过一般使用足够了,永久修改过程略繁琐。
    (5)adb --cannot connect to xxxx:5555"由于目标计算机积极拒绝,无法连接"


    image.png (52.74 KB, 下载次数: 1)
    下载附件
    2021-3-23 15:34 上传

    原因安卓系统未打开adb网络调试功能;通过USB方式连接到安卓系统设置即可;
    解决
    先通过USB线连接
    adb devices 能看到所连接的设备情况下
    adb root 权限提权
    adb shell 进入到安卓系统的shell
  • setprop service.adb.tcp.port 5555 设置adb服务端口为5555, 打开adb网络调试功能
  • exit 退出shell

    adb tcpip 5555
    拔掉USB线
    adb connect x.x.x.x:x连接即可

    微软, 设备

  • lovehfs   

    Android的应用越来越多,这类文章值得了解和学习一下
    kof8855   

    请问怎么单独打开和关闭ipv6????
    飘动的云   

    新人学习了。感谢楼主分享
    川爷   

    对于安卓开发者来说有所帮助
    小夏爱破解   

    666 有用
    tan567421   

    嘿哈.嘿哈.我来了,感谢分享
    水瓶未   

    新人学习了。感谢楼主分享
    huaqiliang   

    好活!!感谢分享
    zx110   

    新手学习,感谢分享
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部