so加载流程

| 函数名 | 描述 |
|---|---|
android_dlopen_ext() 、dlopen()、do_dlopen() | 这三个函数主要用于加载库文件。android_dlopen_ext 是系统的一个函数,用于在运行时动态加载共享库。与标准的 dlopen() 函数相比,android_dlopen_ext 提供了更多的参数选项和扩展功能,例如支持命名空间、符号版本等特性。 |
find_library() | find_library() 函数用于查找库,基本的用途是给定一个库的名字,然后查找并返回这个库的路径。 |
call_constructors() | call_constructors() 是用于调用动态加载库中的构造函数的函数。 |
init | 库的构造函数,用于初始化库中的静态变量或执行其他需要在库被加载时完成的任务。如果没有定义init函数,系统将不会执行任何动作。需要注意的是,init函数不应该有任何参数,并且也没有返回值。 |
init_array | init_array是ELF(Executable and Linkable Format,可执行和可链接格式)二进制格式中的一个特殊段(section),这个段包含了一些函数的指针,这些函数将在main()函数执行前被调用,用于初始化静态局部变量和全局变量。 |
jni_onload | 这是Android JNI(Java Native Interface)中的一个函数。当一个native库被系统加载时,该函数会被自动调用。JNI_OnLoad可以做一些初始化工作,例如注册你的native方法或者初始化一些数据结构。如果你的native库没有定义这个函数,那么JNI会使用默认的行为。JNI_OnLoad的返回值应该是需要的JNI版本,一般返回JNI_VERSION_1_6。 |
下断点时机:
应用级别的:java_com_XXX;
外壳级别的:JNI_Onload,.init,.init_array(反调试);
系统级别的:fopen,fget,dvmdexfileopen(脱壳);
动态调试
前置操作
- 在IDA目录下的dbgsrv,选择跟手机架构一致的server
- adb push 对应的server文件 /data/local/tmp/
- 进入手机端命令:adb shell
- 切换获取手机的root权限:su
- 跳到对应路径:cd /data/local/tmp/
- 提权:chmod 777 as
- XappDebug hook
调试操作
- 修改IDAdebug2.bat文件内的包名和类名(
adb shell dumpsys package 包名来获取类名) - 运行IDAdebug1.bat文件
- IDA选择Debugger–Search Debugger–ARM
- Debugger–Process options–IP输入127.0.0.1–端口没在IDAdebug1.bat种修改就默认即可
- Debugger–Attach to Process–选择对应的包名
- 点击运行–比对so文件–调试开始
操作视频:吾爱破解安卓逆向入门教程《安卓逆向这档事》十二、大佬帮我分析一下_哔哩哔哩_bilibili
快捷键
| 快捷键 | 功能 |
|---|---|
F2 | 在所在行下断点 |
F5 | 可以将ARM指令转化为可读的C代码,同时可以使用Y键,对JNIEnv指针做一个类型转换,从而对JNI里经常使用的JNIEnv方法能够识别 |
F7 | 单步进入调试 |
F8 | 按照顺序一行一行,单步调试 |
F9 | 直接跳到下一个断点处 |
Shift + F12 | 快速查看so文件中的字符串信息,分析过程中通过一些关键字符串能够迅速定位到关键函数 |
Ctrl + s | 有两个用途,在IDA View页面中可以查看文件so文件的所有段信息,在调试页面可以查看程序中所有so文件映射到内存的基地址。tips:在进行so调试过程中,很有用的一个小技巧就是IDA双开,一个用于进行静态分析;一个用于动态调试。比如说调试过程中要找到一个函数的加载到内存中的位置 |
Esc | 回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口) |
g | 直接跳到某个地址 |
y | 更改变量的类型 |
x | 对着某个函数、变量按该快捷键,可以查看它的交叉引用 |
n | 更改变量的名称 |
p | 创建函数 |
感谢:【新提醒】《安卓逆向这档事》十二、大佬帮我分析一下 – 『移动安全区』 – 吾爱破解 – LCG – LSG |安卓破解|病毒分析|www.52pojie.cn