安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试

 

哔哩哔哩视频:https://www.bilibili.com/video/BV1UE411A7rW?p=54

IDA Pro调试so,附加完毕,跳到目标so基址,但是内容都是DCB伪指令?:https://bbs.pediy.com/thread-222646.htm

Android 中 adb shell ps 查看手机中进程信息:https://blog.csdn.net/qq_15212357/article/details/81063622

 

根据视频中步骤搭建调试环境

 

 

1. 创建虚拟机

 

通过 Android Studio 的 AVD Manager 新建一个虚拟机

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第1张图片

点击 AVD Manager 新建一个虚拟机

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第2张图片

 

 

2. 设置 IDA Pro 的远程调试

 

将 IDA Pro 中 android_server 这个文件传到 虚拟机中

使用IDA 进行远程调试( 原理 ):https://blog.csdn.net/eqera/article/details/8239622

IDA pro远程调试折腾记:https://mybeibei.net/archives/799

ARM Linux下搭建IDA Pro远程调试环境https://bbs.pediy.com/thread-224337.htm

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第3张图片

传文件到虚拟机,并添加 可执行 权限

adb push 源文件 目的地址

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第4张图片

这里是导入 源文件 到  /data/local/tmp 目录下。

然后加上可执行权限 chmod a+x andriod_server (或者 chmod 777 andriod_server )

 

 

3. 启动 android_server  执行 端口转发

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第5张图片

在打开一个 cmd 窗口,执行 端口转发:adb forward tcp:23946 tcp:23946

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第6张图片

 

adb forward

adb forward 的功能是建立一个转发。

adb forward tcp:11111 tcp:22222,将 PC端 的 11111端口 收到的数据,转发给到 手机中22222 端口。

但是光执行这个命令还不能转发数据,还需要完成两个步骤才能传数据。这两个步骤是:

  • (a)在手机端,建立一个端口为 22222 的 server,并打开 server 到监听状态。
  • (b)在PC端,建立一个 socket client 端,连接到端口为 11111 的 server 上。

这两个步骤有先后顺序,步骤(a)要先执行。adb forward tcp:11111 tcp:22222 可以在步骤 (a) 之前执行。

 

adb forward 的一些基本操作

配好 adb 的环境,连上手机,执行 adb forward tcp:11111 tcp:22222,如果执行成功的话,没有任何输出。

此时,通过运行 adb forward --list 查看刚才的执行结果:

$ adb forward --list
4391b53a tcp:11111 tcp:22222

可以通过 adb forward --remove tcp:11111 删除建立的转发。

adb forward --remove tcp:11111

adb forward 命令的一些帮助信息,可以直接执行 adb 看到。

 

PC端,端口为 11111 的 server

执行 adb forward tcp:11111 tcp:22222 之后,通过 netstat -a 可以看到下面的信息:

TCP    127.0.0.1:11111        LAPTOP-B0112F9S:0      LISTENING

在PC端,adb forward 创建了一个监听本机11111端口的server。通过adb 转发的数据,需要先发到11111端口(在本例中如此)。这个11111端口是约定好的,你也可以改成其他端口。

PC端的应用通过socket连接到11111端口,以准备发送数据。但是连接到11111端口之前,还需要在手机端启动端口为22222的server。

 

手机端,端口为 22222 的 server

在PC端的应用开始连接之前,手机端要启动端口为 22222 的 server(socket server)。

手机中 adb 的 daemon 进程将连接到 22222 端口,这样 PC 端应用就可以连接PC端的11111端口了,连接上之后就可以从PC端的应用发送数据给手机端的应用,手机端的应用也可以发送数据给PC端的应用。

 

 

4. IDA Pro 的 Debugger 设置

 

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第7张图片

点击完 OK 后,Debugger ---> Process options ,设置 IP 地址 和 端口号

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第8张图片

设置 ip 和 端口号

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第9张图片

点击 OK  之后,Debugger 会变成如图所示:

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第10张图片

点击 Remote ARM Linux/ Android debugger 

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第11张图片

就会连接到 虚拟机,如果连接成功,会弹出一个窗口,上面显示了 虚拟机中运行的进程,可以选择进程进行附加

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第12张图片

 

 

5. 动态调试 的 调试步骤

 

https://www.bilibili.com/video/BV1UE411A7rW?p=55

am 这个指令是 activity manager的缩写。这个命令可以启动 Activity、打开 或 关闭 进程、发送广播等操作。

am命令格式:adb shell am

根据 Intent 启动 Activity

options 参数如下:( -D  开启 debug 模式 )

-D:  开启debug模式
-W:  等待启动完成
--start-profiler:  将profiler中的结果输出到指定文件中
-P:  和 --start-profiler 一样,区别在于,在app进入idle状态时profiler结束
-R :  重复启动Activity,但每次重复启动都会关闭掉最上面的Activity
-S:  关闭Activity所属的App进程后再启动Activity
--opengl-trace:  开启OpenGL tracing
--user :  使用指定的用户来启动activity,如果不输入,则使用当前用户执行

 

步骤:


##################################################################################
普通调试模式 ( 界面出现后,可以手动操作界面 )
1. 将IDA Pro中dbgsrv目录下的android_server文件导入到手机端
    adb push D:\Software\IDA_Pro_v7.2\dbgsrv\android_server /data/local/tmp

2. 查看是否导入成功,并添加可执行权限,然后运行
    adb devices        # 列出设备
    adb shell          # 连接手机,进入 shell 
    su                 # 切换 root
    cd /data/local/tmp   # 切换到导入的目录
    ls -al               # 列出所有文件
    chmod a+x android_server  # 添加可执行权限
	./android_server     # 执行程序,(端口号默认是:23946)

3. 执行 端口转发
    adb forward tcp:23946 tcp:23946
	
##################################################################################
debug 调试模式 
( 如果一些执行比较早的函数,也就是在界面出现之前,就只有使用 debug 调试模式 )
0. 首先 启动 ddms 或者 monitor,
1. 同 普通调试模式 第1步
2. 同 普通调试模式 第2步
3. 同 普通调试模式 第3步
4. 打开 ddms 或者 monitor,观察程序的端口号
5. 获取要调试的app的 包名 和 入口页面。
    (可以使用 AndroidKiller 找到 AndroidManifest.xml)
	package="com.example.calc"
	
            
                
                
            
    
6. 挂起程序:
    adb shell am start -D -n 包名/类名
    例子:adb shell am start -D -n com.example.javandk1/.MainActivity
          adb shell am start -D -n com.yaotong.crackme/.MainActivity
    执行完 adb shell am start -D -n 包名/类名 后,
	真机或者模拟器上会显示 Waiting For Debuger
	补充:此时观察 DDMS,被调试的程序前面有一个红色的虫子;
7. IDA里面勾选三项 和 挂起程序
    1)打开ida, 选择 debugger -第二项-Remote ARMlinux(第四项)
    2)添加hostname和portt:
        hostname:主机号(默认127.0.0.1)
        port:端口号(之前android_server运行时的端口号或者端口转发的端口号)
    3)出来进程列表:选择要调试的程序(可以ctrl+f,搜索包名)
    4)进来后,勾选三项:
        Suspend on process entry point   程序入口点 断下
        Suspend on thread start/exit     线程的退出或启动 断下
        Suspend on library load/unload   库的加载和卸载 断下
    补充:可以直接在这里F9(左上角有一个三角形)运行程序,然后放手;
         也可以,直接执行第8步,然后IDA运行程序
8. 挂载、(主动连接调试)
    jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=端口号
	端口号是在 ddms 或者 monitor 里面看到的
    补充:此时观察 DDMS,被调试的程序前面有一个绿色的虫子;
9.  点击 IDA 上面的 绿色三角,运行程序 ( 恢复程序运行 )
10.  然后就可以在 JNI_Onload 下断点了。

远程调试分为主动连接调试,和被动连接调试

  • 主动连接调试:服务端配置监控端口,本地IDE连接远程监听端口进行调试,一般调试问题用这种方式。
  • 被动连接调试:本地IDE监听某端口,等待远程连接本地端口。一般用于远程服务启动不了,启动时连接到本地调试分析。

 

动态调试步骤:

ida动态调试:https://www.cnblogs.com/LuLuLuHao/p/12866289.html

1. 创建模拟器(有真机可以忽略这个) 要记得打开ddms(要不然后面会报错)
2. 在IDA里面找到android_server (在 dbgsrv 目录)
3. 把android_server文件放到手机/data/local/tmp
    adb push 文件名 /data/local/tmp/as
4. 打开一个cmd窗口:运行android_server
        1) adb shell 连接手机
        2)给一个最高权限:su
        3)来到 /data/local/tmp 目录,cd /data/local/tmp
        4) 给 androi_server 最高的权限:chomd 777 android_server
        5) 查看 android_server 是否拥有权限:ls -l
        6) 运行 andorid_server。命令: ./android_server(端口号默认是:23946)
        补充:运行 andorid_server 并且修改端口号: ./android_server -p 端口号
5. 端口转发:
        adb forward tcp:端口号 tcp:端口号(之前转发的端口号是什么,这里就是什么)
        adb forward tcp:23946 tcp:23946
        adb forward tcp:12345 tcp:12345
6. 打开 DDMS:观察程序的端口号
7. 挂起程序:
    adb shell am start -D -n 包名/类名
    例子:adb shell am start -D -n com.example.javandk1/.MainActivity
          adb shell am start -D -n com.yaotong.crackme/.MainActivity
    补充:此时观察 DDMS,被调试的程序前面有一个红色的虫子;
8. IDA里面勾选三项
    1)打开ida,选择debugger -第二项-Remote ARMlinux(第四项)
    2)添加hostname和portt:
        hostname:主机号(默认127.0.0.1)
        port:端口号(之前android_server运行时的端口号或者端口转发的端口号)
    3)出来进程列表:选择要调试的程序(可以ctrl+f,搜索包名)
    4)进来后,勾选三项:
        Suspend on process entry point程序入口点 断下
        Suspend on thread start/exit线程的退出或启动 断下
        Suspend on library load/unload库的加载和卸载 断下
    补充:可以直接在这里F9(左上角有一个三角形)运行程序,然后放手;
         也可以,直接执行第九步,然后IDA运行程序
9. 挂载、释放(放手)
    jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=端口号
    补充:此时观察DDMS,被调试的程序前面有一个绿色的虫子;
	

 

程序挂起后, Debugger ---> Debugger option ,勾选 3 个复选框

安卓逆向_17 --- 动态调试 手机环境的搭建 和 so库的调试_第13张图片

然后执行 jdb  命令,即可开始进行 so 库 的 调试

使用JDB进行调试:https://www.jianshu.com/p/5a64ed722b91

 

 

6. 调试模式 的 调试步骤

 

https://www.bilibili.com/video/BV1UE411A7rW?p=56

 

动态调试 JNI_load 分析( ARM 汇编 和 寄存器 分析 ):

https://www.bilibili.com/video/BV1UE411A7rW?p=57

 

Java_  开头 的 方法 的 调试

https://www.bilibili.com/video/BV1UE411A7rW?p=58

 

动态 内存数据修改

https://www.bilibili.com/video/BV1UE411A7rW?p=59

 

 

 

 

 

你可能感兴趣的:(Android,逆向)