安卓逆向十一

安卓脱壳加固相关的暂时先过去了,最近在学习安卓NDK相关的东西

NDK是什么?NDK与.so关系?JNI是什么?直接具体看这篇文章

https://juejin.cn/post/6844903981383172110

如果更有时间可以看看这篇文章,可以了解到ABI相关的知识

安卓so文件是什么,又是如何开发出来的呢?_慕课手记

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的函数构造

对相关代码解释,要注意下JAVAENV,这个后面有补充。


对相关源码进行注释解析:// 指定使用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启动,查看内容。

这次我用的是frida14.2.8,frida-server同理。

GitHub - lasting-yang/frida_hook_libart: Frida hook some jni functions

如果想使用这个工具通过打印堆栈调用得到字符串信息,就可以详细看看这篇文章:

分类: frida | 凡墙总是门

jnitrace,直接把字符串打印出来了。

GitHub - chame1eon/jnitrace: A Frida based tool that traces usage of the JNI API in Android apps.

补充知识:

jnitrace、frida-trace、Stalker、sktrace、Frida Native Trace、r0tracer、strace、IDA trace、Unidbg Trace-CSDN博客

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

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

图片

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值