一. 开始调试
smali调试从最先的重打包用各类JAVA IDE进行调试, 到后来的能够不用重打包用xposed插件, 在到最后的修改系统源码刷机或者修改boot.img刷机一劳永逸
apk可调试能够为下面几个点知足一个几个,
1.
invoke
-
static
{
}
,
Landroid
/
os
/
Debug
;
->
waitForDebugger
(
)
V
2. AndroidManifest.xml中Application注明android:debuggable为true
3. 修改系统
/system/build.prop或者
default.prop让
ro.debuggable=1便可调试全部进程,然而
直接修改会出现问题
linux系统下能够用
getprop和setprop命令来读写, Android系统下只能读取,
Android下能够经过
System.getProperty("
ro.debuggable
");来获取指定的属性
system/build.prop和default.prop,都是init进程来进行解析的,
这些ro开头的属性信息只能init进程进行修改
因此对于
ro.debuggable属性咱们能够
①.
修改系统源码, 编译android源码,而后刷入到设备中
这个过程我已经作成功过了,参考以前的文章<<编译android源码绕过反调试>>
②. 直接导出手机里面boot.img, 而后修改里面的ro,debuggable, 而后刷机回去(对于第三方没有源码的手机这样作是有意义的)
我没有作过, 看雪上有人作过了
<<修改Nexus5的boot.img - 打开系统调试>>
③. 第三用一些别人写的第三方工具
好比mprop, 这个的原理是注入到init进程进行修改
固然须要root权限, 开启selinux以后, 可能须要忽略安全策略选项
可能不兼容全部的android设备, 固然确定是须要root权限的
或者使用xposed的插件, tx应急安全响应中心有一个dbopener也能够实现类型的效果
以前网上流行的smalidea无源码调试android程序估计也是相似的方法, XInstaller插件
总结一下就是:
方法3不用重打包, 方法1, 2都须要重打包
咱们熟悉了解调试的流程, 咱们就能够在流程上作手脚, 来进行反调试, 固然如何进行反调试又是另一个话题了
重打包的话, 能够看我以前写的一个脚本程序, 能够一键重打包, 固然脚本写的还不够完美
<<一键调试脚本的使用>>
启动并等待调试器
安装完apk以后, 咱们能够经过adb shell命令调试的方式启动apk
adb shell am start -D -n 包名/主Activity
二. 映射原理
adb shell ps | grep
antivirus
u0_a36 5766 154 907116 29496 ffffffff b7544d11 S com.qihoo.antivirus
adb forward tcp:8700 jdwp:5766
这里说明下为何要这样作, 该命令的格式以下:
adb forward [协议名]:[本地端口号] [协议名]:[远程端口号]
这样就完成了一个映射关系, 发到远程端口的数据都会映射到本地指定的端口上,实质上就是客户端和服务端的关系
8700端口号能够随便给, 好比你须要用Android Studio来连接调试器, 就在配置远程调试器界面加上
刚刚那里映射为8700 AndroidStudio里面就填多少
固然也可使用DDMS, ddms会默认从8600开始映射列表起第一个app
不过ddms和手动adb forward会有冲突, 开启ddms以后就会出问题
固然建议用第一种方法, 这样能够写成脚本完成自动化, 固然这样就须要注意使用logcat了
小贴士:
当咱们adb forward了不少次以后, 咱们可使用以下命令来管理
adb forward --list 查看当前全部映射关系
adb forward --remove--all 移除全部映射管理
adb forword --remove tcp:8700 移除本地指定映射关系
以后就能够开始调试了