上次我们讲到了fart脱壳机,这次我们针对脱壳点进行下简单介绍。从看文档中找到了两个脱壳点。这次先讲一个DexFile脱壳点
脱壳:
对内存中的解密状态中的dex进行dump
如何脱壳?
1.dex 起始地址大小
2.正确时机脱壳
从文档中找到了2个脱壳点。这个是安卓8以后的脱壳点InMemoryDexClassLoader
跟踪InMemoryDexClassLoader,查看InMemoryDexClassLoader做了什么东西
可以从这个网站上进行一步步查看代码
http://androidxref.com/8.1.0_r33/
InMemoryDexClassLoader.java查看
可以看到InMemoryDexClassLoader.java什么也没有做,只是继承了
BaseDexClassLoader的两个构造函数,构造函数的参数都是buffer
那么寻找
BaseDexClassLoader中的buffer就好了,可以查看到new 了一个
DexPathList
查看下这个BaseDexClassLoader构造函数的目的
这个是加载dex文件的
继续跟踪DexPathList,寻找dexFiles,可以看到这个构造函数
关心的dexFiles是在makeInMemoryDexElements中出现,查找makeInMemoryDexElements
可以看到在dexFiles的地方出现了一个new DexFile(buf),要看到这个是啥作用
接在在DexFile中查看buf,因为构造函数参数时buf
可以看到buf传到了->openInMemoryDexFile
openInMemoryDexFile中如果为真则是createCookieWithDirectBuffer
如果为假则是createCookieWithArray
但是这个两个都找不到,问了一下GPT才知道是native函数化了。下面贴下回答
安卓里面native函数是什么意思?
ChatGPT
在安卓开发中,"native函数"指的是使用原生编程语言编写的函数。具体来说,通常指用C或C++编写的代码。通过Android的JNI(Java Native Interface),这些原生函数可以与Java代码进行交互。
以下是一些关键点:
JNI(Java Native Interface):JNI是Java语言的一个编程框架,允许Java代码与其他编程语言(如C或C++)编写的代码进行交互。通过JNI,Java代码可以调用本地(native)函数,反之亦然。
性能优化:使用native函数的一个主要原因是性能优化。某些情况下,C或C++编写的代码比Java代码执行速度更快,特别是需要大量计算或低级系统操作的场景。
平台特定功能:有时候,开发者需要访问Java无法直接使用的平台特定功能或硬件资源。这时候,native函数可以通过JNI实现这些功能。
NDK(Native Development Kit):Android提供了NDK,帮助开发者使用C和C++编写Android应用程序。NDK包含了一些工具和库,用于构建和集成native代码。
示例
以下是一个简单的示例,展示了如何在Android应用中使用native函数:
Java代码:
public class NativeLib {
// 加载本地库
static {
System.loadLibrary("native-lib");
}
// 声明一个native方法
public native String stringFromJNI();
}
C/C++代码:
c
复制代码
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_NativeLib_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
在这个例子中,Java类NativeLib中声明了一个native方法stringFromJNI,并通过JNI调用了C++函数Java_com_example_myapplication_NativeLib_stringFromJNI。这个C++函数返回一个字符串“Hello from C++”。
希望这能帮你理解什么是安卓中的native函数以及它们的用途。如果你有更多问题或需要进一步的帮助,请告诉我!
可以知道这些都是c或者c++的原生代码,如果是c或者c++在AOSP源码中查找,那么需要时文件名_方法名
进入到这个进行查看->CreateSingleDexFileCookie
可以看到这个是处理dex文件
跟踪到CreateSingleDexFileCookie发现了里面存在
CreateDexFile
查看CreateDexFile
可以看到这个是尝试打开dex文件,文件是DexFile->open的地方
再DexFile中没有直接找到open函数,说明Open函数是被native化了。再继续找open
可以看到一个字段是”open dex file from RAM”说明我们要找的地址就快到了,返回了一个openCommon。查看openCommon函数
回到我们开头那个图片,Over
端午假期忙着调休出去玩了,所以没更新。但是这周还有个好消息,这周只用上四天班。抛去今天,还有三天。奥力给
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
欢迎关注公众号“呼啦啦安全”,原创技术文章第一时间推送。
原文始发于微信公众号(呼啦啦安全):安卓逆向系列(六)