✨
AndroidSummary
  • Introduction
  • 漫品客户端技术总结
    • 小说模块介绍
      • Android不规则布局的实现(万能公式)
      • Android So动态加载原理分析与优雅实现
  • Android总结
  • Android基础
    • Android Activity启动模式
    • Android 之 ThreadLocal简析
    • Android之JNI开发总结
    • 堆和栈的区别
    • java中==,equals,hashcode
    • Java基础数据类型和引用类型的区别
    • Java内部类详解
    • Android 8.0之后Service使用问题
    • 初探RxJava以及结合Retrofit的使用
    • 深入理解--Android Loader
    • 异步线程大师Handler(源码+图+demo+常见问题)
  • [Android AIDL跨进程通信]
    • service的隐式启动和显示启动
    • 如何绕过 Android 8.0 startService 限制
  • Android内存管理
    • Android内存管理(官方概览)
    • Android内存管理(操作系统基础)
    • Android内存管理(内存管理基础)
    • Android内存管理(linux内存管理机制)
    • Android内存管理(Android的内存管理机制简析)
    • Android内存管理(Android对Linux系统的内存管理机制进行的优化)
    • Android内存管理(垃圾回收算法相关)
    • Android内存管理(JVM 、DVM(dalvik) 、ART联系与区别)
    • 命令行提取hprof文件
  • Android安全
    • Android签名攻与防
    • Smalidea+IntelliJ IDEA/Android Studio无源码调试
    • keystore CSR CER PKCS7之间的区别与联系
    • 公钥、私钥、数字签名(签名)、数字证书(证书) 的关系(图文)
    • KeyStore 和 TrustStore区别与联系
    • Android 安全分析和漏洞挖掘|工具集
  • JAVA基础
    • Java 流(Stream)、文件(File)和IO
    • [线程共享和协作]
      • 线程基础、线程之间的共享和协作
      • [synchronized local volatile Threadlocal如何实现线程共享]
        • Synchronized实现原理
        • CAS原理分析
        • Java并发编程:Callable、Future和FutureTask
    • [深入理解Java泛型]
      • 泛型的作用与定义
      • 通配符与嵌套
      • Java泛型擦除及其相关内容
    • [注解深入浅出]
      • 注解是什么,如何理解
      • 自定义注解与元注解
      • 注解的使用场景
    • [并发编程]
      • 线程共享和协作
Powered by GitBook
On this page
  • 前言
  • 动态调试Android App
  • 准备工作
  • 开始debug:

Was this helpful?

  1. Android安全

Smalidea+IntelliJ IDEA/Android Studio无源码调试

PreviousAndroid签名攻与防Nextkeystore CSR CER PKCS7之间的区别与联系

Last updated 5 years ago

Was this helpful?

smalidea是一个IntelliJ IDEA/Android Studio smali语言插件,可实现动态调试smali代码。 github地址:

前言

在开发过程中,debug版本我们可以跟踪调试,查看bug等信息,但是在release版本中只能去打log进行代码进行猜测,还有就是dump堆栈等无法与代码直接交互的方法。无源码调试指的是在没有源代码的情况下可以对app进行代码调试,逆向smali代码,然后查看其运行逻辑。在发现release版本问题的过程中可以让我们更块的定位错误。

动态调试Android App

smalidea支持14.1或以上版本的IDEA。android Studio如果是基于14.1或以上版本的IDEA也是支持的,我这里用的是2.3.3版本的Android Studio,IDEA的操作也差不多。 从上面的下载地址中下载以下三个应用

backsmali:可将apk转为smali代码,也可将odex转为smali代码,当然在odex转为smali过程的中需要/system/framework目录下的内容

smail:可将smail文件转为dex文件

下载结束后,开始安装插件: Android Studio -> Preferences -> Plugins -> Install plugin from disk -> 选择 smalidea插件 ->重启 -> 插件就安装好了。

准备工作

  1. 第一步当然是要拿到你想debug的apk,这里随机使用一个app

  2. 第二步就是要把apk里面的编译后的代码转成smali。 这里可以使用上述过程中的baksmali进行反编译,也可以使用apktool进行反编译 baksmail:

    java -jar baksmali-2.2.1.jar  d myapp.apk -o ~/projects/myapp/src

    apktool:

    java -jar apktool.jar d myapp.apk -o ~/projects/myapp/src
  3. 这一步很关键,就是让运行在设备中的程序支持debug。方法有几种:

  4. 把设备root掉

  5. 修改测试机的 /default.prop 文件的ro.debuggable=1,目测这一步也可能需要root。

  6. 使用模拟器

  7. 修改apk的Manifest application 属性 android:debuggable="true",可以用apktool 解出 Manifest 然后修改,接着重新打包回去。

  8. 终极办法,自己编译一个debug版 的rom,这个稍微麻烦一点,自己编一个,想怎么玩就怎么玩。

开始debug:

假设你已经把apk安装到设备里了。

接下来用Android Studio import一个 Project , 工程的目录定位到刚刚apk反编译后的的文件夹

使用“Create project from existing sources”一路next到底

完成之后 点击项目邮件 Mark Directory As->Sources Root

工程配好了,配置debug的端口: EditConfigurations...

接下来需要准备的就是如何连上设备debug了! 过程也很简单,启动DDMS Tools->Android->Android Device Monitor选择你要调试的apk的包名

最后,开始debug Run->Debug Smali

针对DDMS端口转发,也可以手动的制定端口信息,操作如下(smalidea的作者推荐的是ddms的方式): 1. 拿到apk的包名和启动的Activity 把应用启动起来然后等待debug: adb shell am start -D -S -W packageName(packageName的获取可以反编译AndroidManifest.xml里面有包含)

正常的话,你会看到设备里的应用已经跑起来了,并且有个 Waiting For Debugger 的提示,别关掉它。

  1. 拿到程序运行的pid: adb shell ps | grep packageName

  2. 端口映射: adb forward tcp:8800 jdwp:5413 这里的8800 是上一步在配置工程中自定义的端口。

官方步骤如图所示:

以上就是基于smalidea无源码调试的整个过程,有问题的可留言,我们一起交流学习。

PS:Android端 TCP直连,有资料的童鞋请不吝赐教。谢谢

如图所示使用baksmali-2.2.1.jar反编译出的目录

设置Project 的 jdk[File->Project Structure]

添加一个remote调试

修改调试的端口 这里我用8700端口,这里我们需要启动ddms去设置端口号映射,然后apply->ok。

好了,project方面就准备好了!Nice!

https://github.com/JesusFreke/smali/wiki/smalidea