-
-
[原创][分享]Radare2静态分析so
-
发表于: 2020-11-30 20:28 4578
-
在Radare2静态分析apk(1) 对Radare静态分析apk进行了简单的介绍。 补充一下: 通过r2 apk://URI可以直接对apk中的dex进行分析。
在前面的文章中,对so文件进行了基本的介绍。Android的so有点不一样。
Android平台pic(位置无关代码)编译的原因,所有全局变量的引用都是通过got(全局偏移表)完成的,加载器会根据加载基址来修正,并向got填入正确的全局变量的地址。如某重定位数据a=S,app运行时的基址是A,pBuf的地址是B,则重定位a的值为S-A+B,这样便相当于从pBuf处加载so。
通过readelf -d来获取数据重定位的信息。后面会对android的so文件进行专门的分析。
开机的时候。
参考链接: 2b6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4F1k6s2u0G2K9h3c8^5M7X3g2X3i4K6u0W2j5$3!0E0i4K6u0r3z5g2)9J5k6e0m8Q4x3X3f1H3i4K6g2X3M7U0y4Q4x3V1k6^5M7X3g2X3i4K6u0r3L8r3W2T1L8X3q4@1K9i4k6W2K9r3g2D9M7r3g2J5i4K6u0r3K9h3&6U0L8s2g2V1k6g2)9#2k6X3A6F1K9g2)9J5c8X3A6F1K9g2)9J5k6h3S2Q4c8e0g2Q4z5e0u0Q4z5p5y4Z5N6s2c8H3M7#2)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4F1k6s2u0G2K9h3c8G2M7#2)9J5k6h3&6W2N6q4)9J5k6h3y4F1i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5c8U0p5H3i4K6u0W2x3q4)9J5k6e0m8Q4y4h3k6J5y4W2)9J5c8Y4S2J5k6h3k6Q4x3V1k6D9K9h3u0F1j5i4c8A6N6X3g2Z5k6h3I4H3k6i4u0Q4x3V1k6A6L8X3y4D9N6h3c8W2i4K6g2X3K9X3&6A6i4K6u0r3K9X3&6A6i4K6u0W2K9l9`.`.
•如果用C++编译器,那么JNIEnv就是_JNIEnv•如果用C编译器,那么JNIEnv就是JNINativeInterface
那_JNIEnv又是什么? 通过下面的代码可知*最终还是还是JNINativeInterface**。
JNINativeInterface又是什么?通过下面的代码可知定义了一系列的函数指针。
参考链接: 95eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2S2L8X3c8J5L8$3W2V1L8%4y4Q4x3X3g2F1k6i4c8Q4x3X3g2U0L8W2)9J5c8X3q4F1k6s2u0G2K9h3c8Q4x3V1j5I4x3q4)9J5k6e0m8Q4x3X3f1H3i4K6g2X3M7U0k6Q4x3V1k6^5M7X3g2X3i4K6u0r3k6Y4u0S2L8h3g2%4L8%4u0C8M7#2)9J5c8X3u0S2M7$3g2Q4x3V1k6U0L8h3c8K6i4K6u0r3j5i4m8H3i4K6g2X3M7s2u0G2j5$3g2K6M7#2)9J5c8X3q4H3M7q4)9#2k6X3#2S2K9h3&6Q4x3X3g2U0M7s2l9`.
Zygote进程是在Init进程启动的时候创建的。至于Init进程是怎么来的,可参考Android启动流程。
如果zygote是true,则说明当前运行在Zygote进程。走runtime.start("com.android.internal.os.ZygoteInit", args, zygote),start方法的实现如下:
在上文的注释002处,进入ygoteInit的main方法。Zygote便进入了Java框架层,也就是说Zygote开创了Java框架层。
在注释001处,调用startVM启动Java虚拟机。
参考链接: 6a8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2S2L8X3c8J5L8$3W2V1L8%4y4Q4x3X3g2F1k6i4c8Q4x3X3g2U0L8W2)9J5c8X3q4F1k6s2u0G2K9h3c8Q4x3V1j5I4x3q4)9J5k6e0m8Q4x3X3f1H3i4K6g2X3M7U0k6Q4x3V1k6^5M7X3g2X3i4K6u0r3L8r3W2T1L8X3q4@1K9i4k6W2K9r3g2D9M7r3g2J5i4K6u0r3d9X3&6A6d9h3&6$3L8$3y4S2N6r3W2G2L8W2)9J5k6h3y4H3M7l9`.`.
NIEnv是在Zygote初始化的时候调用libart.so中的"JNI_CreateJavaVM"方法创建的。JNIEnv来的竟然如此复杂!
1.线程相关 : JNIEnv 是线程相关的, 即 在 每个线程中 都有一个 JNIEnv 指针, 每个JNIEnv 都是线程专有的, 其它线程不能使用本线程中的 JNIEnv, 线程 A 不能调用 线程 B 的 JNIEnv。JNIEnv 不能跨线程 :
•当前线程有效 : JNIEnv 只在当前线程有效, JNIEnv 不能在 线程之间进行传递, 在同一个线程中, 多次调用 JNI层方法, 传入的 JNIEnv 是相同的;•本地方法匹配多JNIEnv : 在 Java 层定义的本地方法, 可以在不同的线程调用, 因此 可以接受不同的 JNIEnv;
1. 所有的JNI调用都使用了JNIEnv*类型的指针,习惯上在CPP文件中将这个变量定义为evn,它是任意一个本地方法的第一个参数。env指针指向一个函数指针表,在VC中可以直接用"->"操作符访问其中的函数。2.jobject 指向在此 Java 代码中实例化的 Java 对象 LocalFunction的一个句柄,相当于this指针。后续的参数就是本地调用中有Java程序传进的参数。以下是我们经常会用到的字符串类型处理的函数:
•const char* GetStringUTFChars (jstring string,jboolean* isCopy) 返回指向字符串UTF编码的指针,如果不能创建这个字符数组,返回null。这个指针在调用ReleaseStringUTFChar()函数之前一直有效。 参数: string Java字符串对象 isCopy 如果进行拷贝,指向以JNI_TRUE填充的jboolean,否则指向以JNI_FALSE填充的jboolean。•void ReleaseStringUTFChars(jstring str, const char* chars) 通知虚拟机本地代码不再需要通过chars访问Java字符串。 参数: string Java字符串对象 chars 由GetStringChars返回的指针
•jstring NewStringUTF(const char *utf) 返回一个新的Java字符串并将utf内容拷贝入新串,如果不能创建字符串对象,返回null。通常在反值类型为string型时用到。 参数: utf UTF编码的字符串指针,对于数值型参数,在C/C++中可直接使用
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]验证码和滑块破解 1827
- [分享][原创]Unidbg模拟执行so 15470
- [原创][分享]APP调试和UI定位 3662
- [分享]Frida之Stalker简介 13308
- [分享][原创]Radare2+Frida实现破解 7173