**
详情见我的博客小生博客
**
正常流程
1.推送文件
adb push android_server
注意模拟器选x86系列, 真机的话要选android_server
不要选armlinux
!!!
2.进入shell
adb shell
真机要用su
切换到root
用户,模拟器不用
su
进入tmp
目录
cd /data/local/tmp
修改权限
chmod 777 android_server
运行
./android_server
端口转发
adb forward tcp:23946 tcp:23946
3.ida
出现这个界面就成了
选择要调试的app
,然后ctrl+s
选择要调试的so
文件,
可能有多个,选择有执行权限的第一个
按键盘G键, 输入要跳转的绝对地址,
绝对地址 = so
文件基地址 + 静态调试so
文件偏移量
2.有反调试
ida
调试原理:IDA
调试原理 是利用Linux系统 ptrace
来实现
当应用被调试时,应用内存里的TracerPid
字段就不为0
查看进程号
ps | grep 包名
我用这个不太好使
top也可以
//打印该APP里内存状态信息
cat /proc/pid(进程ID)/status
TracerPid
为 0 代表 没有被调试,不为0代表在被调试。
so
文件反调试的手段就是新建一个线程不断检测TracerPid
是否为0
解决办法
动态调试,找到检测TracerPid
的代码,不执行此代码
此检查代码一般在.init_arra
和 JNI_OnLoad
两处
在JNI_OnLoad
函数出打断点调试,找到检测TracerPid
的代码,不执行此代码
普通打断点的方式是进不去的,要让app
处于调试模式
如何在JNI_OnLoad
函数打断点
so
文件在加载阶段会执行JNI_ONLoad
,此后不再执行,要在so
文件加载阶段才能给JNI_OnLoad
打断点
- 修改
APP AndroidMenifest.xml
文件, APP加上可调试权限,android:debuggable="true",
- 检查
flags
中是否有应许debug
项
adb shell dumpsys package com.yxxxx.xxx
至于怎么加,文档放这:https://developer.android.google.cn/guide/topics/manifest/application-element?hl=zh-cn
步骤
以调试模式启动app
adb shell am start -D -n 包名/.类名
adb shell am start -D -n com.yaotong.crackme/.MainActivity
打开ida
查看进程id
adb shell 先进入
top 或者 ps | grep 包名
看pid
使用jdb
命令让app
恢复运行
adb forward tcp:8700 jdwp:29268
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
如果报这个错误,那么打开ddms
查看ddms
里面的端口,发现是8600
出现这个就成功了
这时ida
会断住