安卓逆向系列(六)

上次我们讲到了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复制代码#include <jni.h>#include <string>
extern "C" JNIEXPORT jstring JNICALLJava_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

安卓逆向系列(六)

端午假期忙着调休出去玩了,所以没更新。但是这周还有个好消息,这周只用上四天班。抛去今天,还有三天。奥力给

安卓逆向系列(六)

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任



欢迎关注公众号“呼啦啦安全”,原创技术文章第一时间推送。




原文始发于微信公众号(呼啦啦安全):安卓逆向系列(六)

版权声明:admin 发表于 2024年6月11日 下午8:26。
转载请注明:安卓逆向系列(六) | CTF导航

相关文章