type
status
date
slug
summary
tags
category
icon
password
so函数调试
普通的so层函数的调试步骤如下:
step1:运行android_server并设置端口转发。
step2:用ida attach上应用进程


关键是接下来会弹出same的弹窗,如果没弹就说明对应的/data/app/*****/lib目录下没有相应的so文件,这个时候需要手动复制进去并修改权限(我在这里卡了很久🥺🥺🥺)

step3:接下来会停在
libc.so
文件里面,这个时候F9重新运行一下,app就可以正常的输入,然后就可以愉快的调试了。
init_array函数调试
调试init_array函数比较复杂,因为需要在模块初始化的过程中来断下。我们先需要了解一下so函数的加载流程,这里直接查看AOSP里面的源代码。
首先在
bionic/linker/linker.cpp
文件里面的do_dlopen函数看到调用了call_constructors
函数。
接着在
bionic/linker/linker_soinfo.cpp
文件里面找到soinfo::call_constructors
,这个函数里面调用了call_array
,这个函数通过递归调用cal_function
来实现对so的初始化的函数的调用。
我们可以根据上面的字符串特征来在linker64里面找到call_function函数。嗯……接下来的操作就是将在你需要调试的so的初始化函数里面下断点,然后执行以下步骤(android_server和端口转发已经做好):
adb shell am start -D -n com.fei3ei.babyandroid/.MainActivity
-> IDA
attach(这个时候需要记下进程的PID,后面需要使用到) -> adb forward tcp:8700 jdwp:29729(pid)
-> jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
,如果你的机器不是使用的共享内存更换命令 jdb -attach localhost:8700
,之后就F9断在初始化函数里面了。- 作者:fei3ei
- 链接:https://www.fei3ei.xyz/p/android-debug
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。