安卓脱壳加固相关的暂时先过去了,最近在学习安卓NDK相关的东西
NDK是什么?NDK与.so关系?JNI是什么?直接具体看这篇文章
https://juejin.cn/post/6844903981383172110
如果更有时间可以看看这篇文章,可以了解到ABI相关的知识
https://www.imooc.com/article/72564
JNI用途?
-
Java程序中的函数调用Native程序中的函数。Native一般指使用C/C++编写的函数。
-
Native程序中的函数调用Java程序中的函数。
相关看这份文档,里面详细说明了。JAVA|JNI|Native相关的说明
https://www.cnblogs.com/naray/p/15185558.html
创建第一个Native
在android studio中选中,直接选中“Native C++”,剩下一路默认
然后进行开发,还是将原来的SDK进行修改到30,不然还是会报错。这里贴下我的配置文件
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion '30.0.0'
defaultConfig {
applicationId "包名"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
// implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
// implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.1'
}
进去以后会发现主文件是一个Native函数
切换到project进行查看StringFromJNI的函数构造
对相关源码进行注释解析:// 指定使用C链接方式,防止C++编译器对函数名进行名称重整
extern "C" JNIEXPORT jstring JNICALL
// 定义一个JNI函数,Java_com_XXX_myapplication6_MainActivity_stringFromJNI
// 这个函数名由包名、类名和方法名组合而成
Java_com_XXX_myapplication6_MainActivity_stringFromJNI(
// JNIEnv是JNI的接口指针,通过它可以访问JNI提供的所有功能
JNIEnv* env,
// jobject是调用这个本地方法的Java对象引用
jobject /* this */) {
// 定义一个C++标准字符串,并赋值为 "Hello from C++ by myself"
std::string hello = "Hello from C++ by myself";
// 使用JNIEnv指针的NewStringUTF方法将C++字符串转换为JNI的jstring类型并返回
// hello.c_str() 返回一个C字符串(以null结尾的字符数组)的指针
return env->NewStringUTF(hello.c_str());
}
体验frida hook字符串
hook libart
刚才的文章已经介绍过libart.so相关的知识点了,开始使用一些工具进行Hook打印查看JNI的堆栈信息,在安卓机中frida-server启动。因为是hook的就是字符串就是在入口函数里面,所以直接只能是先hook这个,等待APP启动,查看内容。
这次我用的是python3.8.12,frida14.2.8,frida-server同理。
https://github.com/lasting-yang/frida_hook_libart
如果想使用这个工具通过打印堆栈调用得到字符串信息,就可以详细看看这篇文章:
https://kevinspider.github.io/frida/frida-hook-so/
jnitrace,直接把字符串打印出来了。
补充知识:
https://blog.csdn.net/freeking101/article/details/129645787
ps:如果想一块讨论渗透&代码审计&APP逆向可以添加下面的微信号相互交流
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
欢迎关注公众号“呼啦啦安全”,原创技术文章第一时间推送
原文始发于微信公众号(呼啦啦安全):安卓逆向十一
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论