一,NativeActivity的原理
NativeActivity 是 Android 框架中的一个类,它允许开发者用原生代码(如 C 或 C++)来编写 Android 应用程序的主要部分。这个类提供了一个简化的方法来创建和管理一个不包含任何 Android UI 组件的原生活动。NativeActivity 主要用于游戏和需要高性能图形处理的应用程序,因为原生代码可以直接访问硬件,从而提供更好的性能。
以下是 NativeActivity 的一些基本原理和关键概念:
1,生命周期管理:NativeActivity 的生命周期与标准的 Android Activity 类似。当 NativeActivity 被创建、暂停、恢复或销毁时,会调用相应的原生方法(如 onCreate, onPause, onResume, onDestroy 等)。这些方法在原生代码中实现,允许开发者控制原生应用程序的生命周期。
2,窗口管理:NativeActivity 创建一个 Android 窗口,并在其中呈现原生内容。这个窗口由 Android 系统管理,但内容是由原生代码渲染的。NativeActivity 提供了一个 ANativeWindow 实例,开发者可以用它来渲染图形内容。
3,输入处理:NativeActivity 还负责处理来自用户的输入事件(如按键、触摸和传感器数据)。这些事件通过 AInputEvent 结构体传递给原生代码,允许开发者以最适合其应用程序的方式处理它们。
4,线程管理:NativeActivity 在其内部维护了一个渲染线程,用于在窗口上呈现内容。开发者需要在原生代码中管理这个线程,确保它以适当的频率和效率渲染内容。
5,资源访问:尽管 NativeActivity 主要用于原生开发,但它仍然可以访问 Android 的资源系统。这意味着开发者可以在原生代码中加载和使用 Android 资源(如字符串、图像和音频文件)。
所以,我们可以用Java开发app,或者结合使用Java和C|C++开发app,NativeActivity则为单独使用C|C++开发app提供支持。从开发者的角度看,我们是在单独用C++开发app,但从底层看还是离不开Java。
在android源码中,已经使用java开发好了一个中间类,这个中间类就是NativeActivity类。我们使用C++开发的Native库之所以能运行,就是因为被这个中间类使用JNI的方式调用了。
所以,当我们逆向分析一个NativeActivity开发的app时,发现Native库里导出了android_main函数,表明这是使用android_native_app_glue.h开发的。基本就可以确定android_main就是Native库的主函数,从这里入手分析即可。(如CTF题目 easy-dex)
如果在Native库里没有找到android_main函数,就表明这个NativeActivity是使用native_activity.h开发的,这时就会看到导出了ANativeActivityCallbacks结构里的诸多回调函数,这些回调函数对应app运行过程中的不同事件,我们就需要在这些回调函数中找逆向分析的入手点。
二,NativeActivity开发的实现过程分析
我们使用C++开发app的两种方式:
1, native_activity.h
2,android_native_app_glue.h
第一种:native_activity.h其中定义了一个ANativeActivity类,这个类中又包含一个ANativeActivityCallbacks结构的指针:
typedef struct ANativeActivity {
struct ANativeActivityCallbacks* callbacks;
... ...
}
这个ANativeActivityCallbacks结构里面就是Native库需要导出的所有函数:
typedef struct ANativeActivityCallbacks {
void (*onStart)(ANativeActivity* activity);
void (*onResume)(ANativeActivity* activity);
void* (*onSaveInstanceState)(ANativeActivity* activity, size_t* outSize);
void (*onPause)(ANativeActivity* activity);
void (*onStop)(ANativeActivity* activity);
void (*onDestroy)(ANativeActivity* activity);
void (*onWindowFocusChanged)(ANativeActivity* activity, int hasFocus);
void (*onNativeWindowCreated)(ANativeActivity* activity, ANativeWindow* window);
void (*onNativeWindowResized)(ANativeActivity* activity