安卓逆向_5 --- jeb 和 AndroidStudio 动态调试 smali

Jeb 工具的使用

动态调试 smali 有两种方法:

  • Jeb 调试
  • AndroidStudio + smalidea 插件动态调试。

1、Jeb 动态调试 smali

​JEB是一个功能强大为安全专业人士设计的安卓应用程序反编译工具,用于逆向工程或者审计apk文件,可以提高效率减少许多工程师的分析时间。

jeb 动态调试分两种:

  • 普通调试 模式
  • debug 调试 模式

Jeb 常用功能、简单使用

  • 1. 反编译 apk、dex
  • 2. 包名 树状图
  • 3. 查看指定类的 smali 代码
  • 4. 转换成 java 语言
  • 5. java 代码中双击函数 进入函数方法的定义 ,查看方法的调用
  • 6. 查看 AndroidManifest.xml

打开 jeb 方法的 2 种方法:

  • 方法 1:直接打开 jeb.exe 软件
  • 方法 2:执行 jeb_wincon.bat,当需要定制 jeb 的参数时,可以直接修改 jeb_wincon.bat 再执行。

简单使用

  • 把 apk 拖拉到 JEB 中即可反编译 apk 双击 Bytecode 打开 smali 代码
  • 双击 包名 下的 类名 即可查看 smali 代码
  • 选中 smali 代码,然后按 tab 键 可转成 java 代码。或者 "右键 ---> 解析" 也可以转成 java 代码
  • 双击方法,可跳转到方法的定义
  • 点击方法,按 x 键可以查看方法的调用
  • 双击 Manifest 即可查看 AndroidManifest.xml
  • 搜索功能 可以搜索函数 字符串等。
  • 点击string查看dex中的字符串,ctrl+f就可以进行搜索。搜索到需要的字符串后双击就可以来到smali代码处,如果看不懂smali,按下tab就可以看到java代码

说明:对于Android逆向来说JEB是不可或缺的一款软件 本篇介绍了JEB的一些常用功能  更多详细功能还需自行百度。

Jeb 动态调试 ( 调试 zhuceji.apk )

jeb 调试 zhuceji.apk 找到注册码

普通调试 模式

1. 真机 (或者模拟器,例如:雷电模拟器、逍遥模拟器) 安装 zhuceji.apk。界面很简单。

2. Jeb 打开 apk,找到要调试的方法对应的 smali 代码,然后在 smali 代码中打上断代点。

鼠标点击要下断点的行:control+b 打断点

3. 下面开始对程序进行调试

debug ---> 开始 ---> 找到相关进程双击进行调试:

4. 首先在要调试的位置打上断点,然后在 app 中输入任意 16 位注册码进行调试 ( 通过查看 checkSN 源码,可以看到对 sn 长度进行检查,必须16位 ):

5. 通过调试 smali 代码,或者直接查看 Java 源码,可以找到 checkSN 方法是解决问题的关键。

 在 checkSN 方法上,按 tab 键,或者 "右键 ---> 解析" 即可查看 checkSN 对应的 Java 代码,

通过分析可以发现,把 userName 做了一个 md5,然后取出16位和 sn 相比 ( 注意:从第一位开始,间隔一位取一位)。

userName:李青

md5:4d85f1a100030c9ddb76e546152c1dfe

注册码:48fa0009d7e4121f

断点走到  access$2 时,单步进入函数。

在 access$2 函数中调用 checkSN 函数的。查看 参数值

进入 checkSN 函数继续 单步调试

 进入 checkSN 函数,并在 equalsIgnoreCase 打上断点,执行到断点处。

可以看到 v6 寄存器的值就是注册码,

userName:李青

注册码:48fa0009d7e4121f

输入正确的名字、注册码,即可验证通过

debug 调试 模式

debug 模式 和 普通模式的区别在于 启动过程

  • 普通模式:无法调试界面的 创建,即 onCreate 函数
  • debug 模式:可以调试 界面的 onCreate 函数,即刚开始创建界面是就开始调试

步骤:

1. 查看 application 节点 是否 为 可调式 。

如果是 False,则不能调试,需要改成 True 然后重新打包 apk,安装 可调试的 apk,然后执行命令:adb shell am start -D -n 应用程序包名/应用程序入口界面

除了在入口处添加Debug.waitForDebugger外,还可以使用下面的命令启动app,也能使app在入口处断下来:adb shell am start -D -S -n com.xy.testcrack/com.xy.testcrack.MainActivity

这里可以看到 apk 已经 可调试。

2. cmd ---> adb shell am start -D -n 应用程序包名/应用程序入口界面:

adb shell am start -D -n com.qianyu.zhuceji/.MainActivity

执行完后,真机 ( 或者 模拟器 ) 显示如图:

这时候,不需要点击弹窗。

3. 使用 jeb 开始调试

  • 首先 在 onCreate 方法打一个断点,设置断点的方法和普通模式相同。
  • 然后 点击菜单栏 “Debugger ---> Start” 开始调试 ( 和 普通模式 步骤一样 )。

点击 附上 之后,弹窗 自动消失,然后就会自动停在 onCreate 方法中设置的断点。

2、AndroidStudio + Smalidea 动态调试 smali 代码

下载、安装 Android Studio

安装 Android Studio 时,会自动弹出 Android sdk 的下载安装界面。Android Studio 自带有 java jdk,如果不想使用自带的 Java JDK 可以自己下载

Android studio 配置

 Android Studio手动配置Gradle的方法:[Android Studio系列(五)] Android Studio手动配置Gradle的方法_androidstudio gradle_u010142437的博客-CSDN博客

(1) android sutdio第一次打开一个工程巨慢怎么办? 
(2) 手动配置Gradle Home为什么总是无效? 
(3) 明明已经下载了Gradle,配置了gradle home,为什么打开工程还是去自动下载Gradle?

Gradle 构建配置详解:Gradle 构建配置详解 | 程序员笔记

史上最全 Android build.gradle 配置详解:史上最全Android build.gradle配置详解 - 简书

在开发过程中,

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

安装 smalidea 插件

从 github 下载 smalidea.zip,然后在 Android 中依次选择:

  • File ---> setting -> Plugins -> 齿轮 -> Install Plugin from Disk…-> 找到smalidea-0.06.zip

在弹出选择对话框中,找到下载好的 smalidea 压缩包,选择ok即可

方法 1:导入 APK 调试 smali

Android Studio 2022 可以直接导入apk 包就可以进行动态调试

File ---> Profile or Debug APK ,会自动生成smali进行查看

设置 Project 的 sdk:

如果是通过 "新建项目" 导入的 smali ,则不需要设置 sdk,因为 新建工程 时已经有默认的 sdk

如果是通过 " 导入已经存在的 " 方式导入 smali ,则需要设置 sdk :

选择 sdk ,这里选择 sdk  1.8

调试

连接上手机,进行debug

方法 2:反编译 apk 为 smali 进行调试

常用的反编译工具有 Apktool、AndroidKiller、jadx、jeb 等

 第一步:拿到想要 debug 的 apk。

第二步:反编译 apk 得到 smali 代码。这里使用 AndroidKiller ( AK 实际是调用 apktool 进行反编译)。

让 apk 可调式

在 Android 真机上调试程序有一个前提,就是这个apk包必须有 debuggable=true 的属性才行。

让运行在设备中的程序支持 debug。方法有几种:

  • 把设备 root 掉,修改 /default.prop 文件的 ro.debuggable=1
  • 使用 模拟器
  • 修改 apk 的 Manifest application 属性 android:debuggable="true",可以用 apktool 解出 Manifest 然后修改,接着重新打包回去。
  • 打开系统调试总开关,使用 am 命令,以调试模式启动应用。
  • Magisk 模块可以实现 app 的 debug。xposed 也有对应模块。直接搜索 "debug" 找到对应模块安装即可。 ( 推荐 )
  • 终极办法,自己编译一个 debug 版的 rom,这个稍微麻烦一点,自己编一个,想怎么玩就怎么玩。

下面只说明两种方法,

  • 一种是 修改 " AndroidManifest.xml " 实现可调试 ,
  • 另一种是 "打开系统调试总开关"

修改 " AndroidManifest.xml " 实现可调试 

修改 " AndroidManifest.xml " 实现可调试。使用 AndroidKiller 进行反编译,然后在反编译出的 AndroidManifest.xml 添加 debug 属性

如果没有这个属性的话,需要自己添加 android:debuggable="true" 然后编译安装修改后的 apk 即可。。。

修改 AndroidManifest.xml 之后,只要以调试状态启动 app 即可

命令:adb shell am start -D -n com.wizardev.testjar/.MainActivity

转发 8700 端口 到安卓 对应进程 [app_pid]。命令:adb forward tcp:8700 jdwp:446

记住这时候需要将 DDMS 关掉,不然会出现错误

方法 2:

找到启动 apk 的启动界面,然后在启动界面的 onCreate 方法的第一行添加 invoke-static {}, Landroid/os/Debug;->waitForDebugger()V 这句代码。

怎么知道程序的启动界面呢? 其实可以通过以下几种方式:

方法 1: 观察 “AndroidManifest.xml” 文件中的代码,看下图

如果图中 “1” 处的代码,那么程序启动界面的 smail 文件就是 “2” 处的名称。如上图启动界面的 smali 文件就是“MainActivity.smali”。然后在 “MainActivity.smali” 文件中的 onCreate 方法中添加等待调试的代码即可。用 am 命令,使目标程序以调试模式运行。

方法 2:通过 adb 命令来发现 apk 的启动界面,命令:adb shell dumpsys activity top

运行命令后会出现以下界面

图中用红框标记的就是启动界面的 smali 文件名。注:这种方式找到的启动界面可能不准确,因为有的 app 会有欢迎页,因此推荐用第一种方法来找 app 的启动界面。

主 Activity 中加入  invoke-static {},Landroid/os/Debug;->waitForDebugger()V

回编译 apk 并签名安装到手机,如果启动 app 出现以下界面,则说明以启动模式运行app成功。

(这步如果重新打包失败,可以安装原始包,把手机 root 配置/default.prop 的 ro.debuggable=1 开启全局调试。

然后用命令启动 Activiry : adb shell am start -D -n package属性的值/android:name属性的值  )

打开系统调试总开关

这种方法不用修改 “AndroidManifest.xml”,而且当你打开这个开关后手机中的所有 App 都是可以调试的了。但是这种方法操作起来比较复杂,而且手机必须是已经 root 过的,下面会详细描述怎么打开系统调试的总开关。

这里会介绍两种方法,第一种方法是大家普遍采用的,但是我使用采用第一种方法没有成功,于是查找资料找到了第二种方法,如果你使用第一种方法不成功,那么可以试下第二种方法。

第一种方法

  • 下载 mprop 文件 ( https://github.com/wpvsyou/mprop )
  • 依次运行一下命令设置 “ro.debuggable”
    adb push “下载mprop文件所在的位置”\mprop /data/local/tmp/
    adb shell su
    chmod 755 /data/local/tmp/mprop
    data/local/tmp/mprop
    setprop ro.debuggable 1
    /data/local/tmp/mprop -r
  • 运行 getprop ro.debuggable 命令可以查看 debuggable 的状态,显示为 1,表示更改成功。

注:这种方法在开机后设置的“debuggable”将会失效,需要重新设置

第二种方法

这种方法其实说复杂也不复杂,说不复杂呢!还是有一点复杂的。具体操作方法如下:

  • 需要手机刷入“Magisk”,下载:Releases · topjohnwu/Magisk · GitHub。Magisk是什么:简单的说就是集成了root的框架,它强大的是root权限还可以设置对其他软件隐藏。
    Magisk的强大远不止这点,想了解Magisk具有哪些功能可以自行搜索。
  • 通过Magisk安装“MagiskHide Props Config”模块,安装的方法可以看下面的动图。

安装完成之后需要重启,才能生效。

打开终端,输入以下命令

adb shell
props

会出现这个界面

然后,输入3,回车,会出现这个界面

然后,输入1,回车,出现这个界面

可以看到图中显示当前的 “ro.debuggable” 的值为0,如果要修改为1的话输入“y”,回车即可修改完成。接着终端会弹出是否重启,这时继续输入“y”重启,重启后修改的“ro.debuggable”才会生效。

经过以上5步,就可以打开系统调试的总开关,这时我们打开“Monitor”工具就可以看见当前运行的所有的所有进程了。

注:通过这种方式修改的 “ro.debuggable” 值,重启手机后不会还原,就是设置过后,手机重启后不需要再次设置。

打开系统调试的总开关后,这时通过 am 命令以调试模式启动应用,即可让目标应用处于可调式状态。

adb shell am start -D -n xxx

这里的 “xxx” 为我们要调试应用的启动界面,如我们要调试应用的启动界面为 com.wizardev.testjar/.MainActivity 则输入以下命令

adb shell am start -D -n com.wizardev.testjar/.MainActivity

这是目标应用就会以调试模式运行,处于等待调试的状态。

反编译的 smali  导入到 Android Studio 

把 project 文件夹单独复制一份,然后导入 Android Studio 中。

导入步骤:菜单栏 ---> File ---> New ---> import Project... ---> 选择Create project from existing sources,之后一直选择 next 即可

导入完成后,切换到 project 视图 ( 不是 Android 视图 )。然后选择smali目录作为资源目录

不新建项目也行,但需要新建一个 module。
将项目切换到 project 视图,将新建的项目下 app 中 src 目录下的代码删除或将新建的 module 下 src 目录下的代码删除。
将我们反编译的 smali 文件夹放入 src 目录下。
这样,就将反编译的 smali 文件导入到 AndroidStudio 目中了。

配置远程调试的选项

设置调试器:run --> edit configurations ---> + --> Remote JVM Debug,端口选择:8700

 

Project Structure(Ctrl+Shift+ALT+S),Project SDK设置为 Android API 10 Platform

远程调试配置,Run -> Edit Configuration进入Run/Dubug Configurations;Add New Configuration(+符号) -> Remote,将 5005 端口,修改为 8700 端口

smali 打断点

安装设置 debug=true 的 APK,通过 adb shell dumpsys activity top | grep --color=always ACTIVITY 在终端获取包名和页面信息。也可以通过 配置文件查看包名

在 smali 中需要断点的地方打好断点,

通过以下命令行启动进程调试等待模式:

调试模式打开 app ( 命令: adb shell am start -D -n )

adb shell am start -D -n com.qianyu.zhuceji/.MainActivity

对 apk 进行动态调试,这条命令运行后手机屏幕将会进入到调试界面,千万别点手机上弹出来的对话框(不要点Force Close),它是在等待 debug 接入

  

进入等待调试

查看 Monitor 并记住下面红框里的两个值。

新版本的 AndroidStudio 已经淘汰了 Android Device Monitor 功能,可以使用 monitor 代替 ( D:\Android\Sdk\tools 下打开 monitor.bat )

  

然后把 Android Device Monitor关掉(这里一定要关掉,因为它会占用8700端口 导致后面转发端口失败)

开启转发

C:\>netstat -aon |findstr 8700
  TCP    127.0.0.1:8700         0.0.0.0:0              LISTENING       10708
    看看有没有哪个进程占用端口,没有就直接开启端口转发: 
C:\>taskkill /PID 10708 /F
    成功: 已终止 PID 为 10708 的进程。

开启转发(这里jdwp是自己Android Device Monitor中要调试app的Online值,tcp为debug值)
C:\>adb forward tcp:8700 jdwp:3669
8700

C:C:\>

获取运行 apk 的进程(pid):adb shell ps | grep 包名

  • 示例:adb shell ps | findstr "zhuceji" ,如下图所示,可以看到 pid 是 3170

端口映射: adb forward tcp:8701 jdwp:<pid>

  • 执行:adb forward tcp:8701 jdwp:3170    建立端口转发,即把端口 8701 上面的信息通过 jdwp 转发到 pid 是 3170 上面

开始等待调试

在 Android Studio 附加、动态 调试 smali

图二

此时,已经 Attach 到进程中,可以快乐的调试了。通过断点可以查看内存的信息。

打好断点之后。然后 Run --> Debug 'zhuceji_smail' 进行调试。

android studio 已经进入debug模式了  按F8执行下一步,F9运行程序 

以上方法经常会出现端口转发问题,现象就是 android studio debug 的TCP端口  与 设备应用的端口无法绑定,导致启动debug 无法启动。

解决方法:直接 attach 一个进程

步骤: 菜单栏 ---> run ---> attach Process

猜你喜欢

转载自blog.csdn.net/freeking101/article/details/105910877