《逆向专题》java层/smali 动态调试

《逆向专题》java层/smali 动态调试_lin___的博客-CSDN博客_java 动态调试

更新2020.10.10

关于java 层动态调试,也就是smali代码的调试。网上有一些帖子会介绍一些方法,需要反编译再回编译,其实那不是必须的。不过作为学习,方法我们都需要理解。

之前介绍过一些做逆向的工具,其中不乏一些反编译和回编译的工具。这篇文章的主题,进行smali 的动态调试,其中关键的一点,就是获得apk的smali代码。当然,这里先排除加壳等情况。默认是可以通过反编译的,获取smali代码确实是必要的,但是回编译就不是必须了。

如果不知道反编译和回编译,可以自行补课。这里不展开了

apk 的反编译和回编译.note

回到smali的动态调试,主流的有2种调试工具:

1、使用JEB 

2、使用android studio + smalidea 插件进行

关于这2种工具的调试其实都大同小异。但是其实个人来说更偏向使用android studio。具体的差异后面会提到。

在开始调试之前,其实是有工作需要做的。

一、准备调试机

我们可以使用真机也可以使用模拟器来进行smali代码的调试。不过模拟器相对会比较不稳定,出现一些奇怪的问题。为了避免影响到后续的调试工作,最好是使用真机。

使用真机进行调试工作,最好需要root 的。有一台root后的真机,几乎是逆向分析者必备的。

另外,root 之后的真机,在开始工作的时候,别忘了开启usb调试。

二、获取到apk 的调试权限

获取权限的方法有很多,这里介绍主流的几个:

1、在  AndroidManifest.xml 的 application 节点 加上  android:debuggable="true" 如:

给apk的清单文件加上  android:debuggable="true" 就意味着这个apk是可以被调试的。但是修改清单文件的前提是,需要成功反编译apk的资源文件,然后再回编译,最后还需要重新签名。签名之后apk是否能正常运行,运行之后是否有签名校验需要绕过等。这都是需要我们解决的问题。

毫无疑问,这个反编译和回编译的工作量是比较大的。早期的apk没什么防护问题,回编译也方便,但是现在这个方法越来越不好用了。而且这个方法获得的权限只是当前的apk 可调式权限,对于不同apk来说这一套签名验证的方法依旧无法绕过,无法做到通用。

2、有一个通用的获得调试权限的方法,那就是修改default.prop中的ro.debuggable的值为1。

这里有两种做法:

(a)改文件

(b)改内存

像这种系统文件,一般改文件都是只读的。首先是没有权限,另外即使改了这个文件的值,内存中的值也没改,需要重启。但是一旦重启,可能这个被修改的文件又恢复了,还是不行。(这个不同的机子可能会有所不同,简单测试下就知道了),当然,如果有人说我刷机改这个文件。那当我没说(不过刷机是有风险的,能接受变砖那就无所谓了)。。

然后另一个方法就是改内存了。

当我们拿到一个手机的时候,一般的 ro.debuggalbe 的值都是0。 这代表不使用调试.

init进程会解析这个default.prop文件,然后把这些属性信息解析到内存中,给所有app进行访问使用,所以在init进程的内存块中是存在这些属性值的,那么这时候我们可以利用进程注入技术,我们可以使用ptrace注入到init进程,然后修改内存中的这些属性值,只要init进程不重启的话,那么这些属性值就会起效。

解决方法:

我们可以通过 mprop 这个网上大神给出的工具对着值进行修改。

第一步:拷贝mprop 到/data/目录下(注意mprop 跟你的手机是否适配,比如armeabi-v7a,X86)

第二步:./mprop ro.debuggable 1  (当然前提赋予mprop 可执行权限)

或者使用 setprop ro.debuggable 1 也可以修改

第三步:getprop ro.debuggable(查看此时ro.debuggable在内存中的值是否修改成功)

第四步:stop  start(重启adbd进程,adb 其实包括3部分,adb server ,adb client 和 adbd 进程。注意如果这里手机重启的话这边改动的值是会变回来的)

成功修改  ro.debuggable =1 之后,这里我们使用 getprop可以查看ro.debuggable 值得状态, 现在手机中的所有应用都支持debug了。

​到这里,我们就有了能获取apk 调试权限的通用解决方案。

接下来我们先来了解下调试过程中会使用到的工具以及几个常用端口。这对于理解调试过程是很必要的。

1、5037

这是adb 工具(server端)的默认端口。

当您启动某个 adb 客户端时,客户端会先检查是否有 adb 服务器进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令 - 所有 adb 客户端均通过端口 5037 与 adb 服务器通信。

然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护进程 (adbd),便会与相应的端口建立连接。请注意,每个模拟器都使用一对按顺序排列的端口 - 用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如:

模拟器 1,控制台:5554

模拟器 1,adb:5555

模拟器 2,控制台:5556

模拟器 2,adb:5557

依此类推

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值