首页 > 其他分享 >【APP逆向14】JNI开发简介之二

【APP逆向14】JNI开发简介之二

时间:2024-02-05 22:11:07浏览次数:27  
标签:return 14 int APP String env JNI public cls

  • 简介:上一篇我们讲到了java调用C,今天继续聊C调用java

  • 1.C调用java的静态方法

    • 1.1:入口,java调用C的代码
package com.nb.s4;

class EncryptUtils {
    static {
        System.loadLibrary("enc");
    }
    
    public static native String v8();
}
  • 1.2:C语言实现,调用java代码
#include <jni.h>
#include <string.h>
#include <syslog.h>
#include<stdlib.h>


JNIEXPORT jstring

JNICALL
Java_com_nb_s4luffy_EncryptUtils_v8(JNIEnv *env, jclass clazz) {

    // 找到类
    jclass cls = (*env)->FindClass(env, "com/nb/s4/SignQuery");

    // 找到方法
    jmethodID method1 = (*env)->GetStaticMethodID(env, cls, "getPart1", "()Ljava/lang/String;");
    jmethodID method2 = (*env)->GetStaticMethodID(env, cls, "getPart2", "(I)Ljava/lang/String;");
    jmethodID method3 = (*env)->GetStaticMethodID(env, cls, "getPart3","(Ljava/lang/String;)Ljava/lang/String;");
    jmethodID method4 = (*env)->GetStaticMethodID(env, cls, "getPart4", "(Ljava/lang/String;I)I");


    // 执行方法
    jstring res1 = (*env)->CallStaticObjectMethod(env, cls, method1);
    jstring res2 = (*env)->CallStaticObjectMethod(env, cls, method2, 100);
    jstring res3 = (*env)->CallStaticObjectMethod(env,cls,method3,(*env)->NewStringUTF(env, "hahahahh"));
    jint res4 = (*env)->CallStaticIntMethod(env,cls,method4,(*env)->NewStringUTF(env, "hahahahh"),18);

    char *p1 = (*env)->GetStringUTFChars(env, res1, 0);
    char *p2 = (*env)->GetStringUTFChars(env, res2, 0);
    char *p3 = (*env)->GetStringUTFChars(env, res3, 0);

    char *result = malloc(50);
    strcat(result,p1);
    strcat(result,p2);
    strcat(result,p3);

    return (*env)->NewStringUTF(env, result);
}
  • 1.3:被c调用的java代码
package com.nb.s4;

public class SignQuery {

    public static String getPart1() {
        return "xwliang";
    }

    public static String getPart2(int len) {
        return "root".substring(2);
    }

    public static String getPart3(String prev) {
        return "xxx";
    }

    public static int getPart4(String prev, int v1) {
        return 100;
    }
}
  • 2.C调用java的实例方法
    • 2.1:C语言入口,java调C
package com.nb.s4;

class EncryptUtils {
    static {
        System.loadLibrary("enc");
    }
    
    public static native String v9();
}
  • 2.2:C语言实现算法,其中部分代码调用java
#include <jni.h>
#include <string.h>
#include <syslog.h>
#include<stdlib.h>


JNIEXPORT jstring

JNICALL
Java_com_nb_s4luffy_EncryptUtils_v9(JNIEnv *env, jclass clazz) {

    // 找到类
    jclass cls = (*env)->FindClass(env, "com/nb/s4luffy/SignQuery2");

    // 找到构造方法
    jmethodID init = (*env)->GetMethodID(env, cls, "<init>", "(Ljava/lang/String;I)V");

    // 实例化对象 new SignQuery2(...)
    jobject cls_obj = (*env)->NewObject(env, cls, init, (*env)->NewStringUTF(env, "hahahahh"), 22);

    // 找到方法
    jmethodID method1 = (*env)->GetMethodID(env, cls, "getPart1", "()Ljava/lang/String;");
    jmethodID method2 = (*env)->GetMethodID(env, cls, "getPart2", "(I)Ljava/lang/String;");
    jmethodID method3 = (*env)->GetMethodID(env, cls, "getPart3","(Ljava/lang/String;)Ljava/lang/String;");
    jmethodID method4 = (*env)->GetMethodID(env, cls, "getPart4", "(Ljava/lang/String;I)I");


    // 执行方法
    jstring res1 = (*env)->CallObjectMethod(env, cls_obj, method1);
    jstring res2 = (*env)->CallObjectMethod(env, cls_obj, method2, 100);
    jstring res3 = (*env)->CallObjectMethod(env,cls_obj,method3,(*env)->NewStringUTF(env, "hahahahh"));
    jint res4 = (*env)->CallIntMethod(env,cls_obj,method4,(*env)->NewStringUTF(env, "hahahahh"),18);


    char *p1 = (*env)->GetStringUTFChars(env, res1, 0);

    return (*env)->NewStringUTF(env, p1);
}
  • 2.3:被调用的java
package com.nb.s4;

public class SignQuery {
    String name;
    String city;
    int count;

    public SignQuery(String city, int count) {
        this.name = "xwliang";
        this.city = city;
        this.count = count;
    }

    public String getPart1() {
        return this.name;
    }

    public String getPart2(int len) {
        return "root".substring(2);
    }

    public String getPart3(String prev) {
        return "xxx-";
    }

    public int getPart4(String prev, int v1) {
        return 100;
    }
}
  • 3.静态注册与动态注册
    • 3.1:上述编写的C语言的函数和Java的对应关系,在函数名上就可以体现,例如:
Java_com_nb_s2long_EncryptUtils_s2
Java_com_nb_s2long_EncryptUtils_s5

这种称为静态注册,如果是静态注册,那么在逆向时,是比较方便的,直接可以找到函数在C中的实现。

  • 3.2:动态注册
package com.nb.s3jni;

class DynamicUtils {

    static {
        System.loadLibrary("dynamic");
    }

    public static native int add(int v1, int v2);
}

#include <jni.h>


jint plus(JNIEnv *env, jobject obj, jint v1, jint v2) {
    return v1 + v2;
}


static JNINativeMethod gMethods[] = {
        {"add", "(II)I", (void *) plus},
};


JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {

    JNIEnv *env = NULL;

    // 在java虚拟机中获取env
    if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
        return JNI_ERR;
    }

    // 找到Java中的类
    jclass clazz = (*env)->FindClass(env, "com/nb/s3jni/DynamicUtils");

    // 将类中的方法注册到JNI中 (RegisterNatives)
    int res = (*env)->RegisterNatives(env, clazz, gMethods, 1);  //第三个参数,与C中的方法对应;第4个参数,代表对应关系的个数
    if (res < 0) {
        return JNI_ERR;
    }

    return JNI_VERSION_1_6;
}

  • 3.3:这种情况下,在逆向时,就不能直接找对应关系了,就需要去找jni_onload
JNI_Onload方法中
	int res = (*env)->RegisterNatives(env, clazz, gMethods, 2);

然后根据gMethods找到java与C的对应关系。

标签:return,14,int,APP,String,env,JNI,public,cls
From: https://www.cnblogs.com/xwltest/p/18008912

相关文章

  • 【APP逆向13】JNI开发简介之一
    简介:在一些不一般的APP中,核心算法不是直接写在java代码中,如果直接写在java中,逆向人员只需要简单的反编译就能找到;如是就出现了JNI:javanativeinterface,Java本地开发接口,实现JAVA和C语言之间的相互调用。将核心算法写在C语言中。1.正向开发流程1.1:新建一个java类,实现核心......
  • SharePoint Online 使用Power Apps定制页面
    前言最近,用户有个需求,想要定制一下SharePointOnline的表单,我们就推荐用户使用PowerApps,下面我们就介绍下如何去做。正文1.我们先简单建一个测试列表,比较懒,字段类型我就都选择了单行文本,如下图:2.选择自定义表单,会默认打开PowerApps界面,如下图:3.......
  • Apptisan #002|AAAny:当一名有着 10w+ 听众的播客主播开始做 App
    名字:AAAny开发者/团队:AAAnyTeam平台:iOS请简要介绍下这款产品AAAny是一个专为AMA(我们称之为AAA)设计的App。多解释一下的话,其实AAA是一种独特的交流形式,所以它应该有专门的展示和互动形式。AAAny就是专门为这种交流形式设计的,比如以Host为中心的展示模式、......
  • P1114 “非常男女”计划
    原题链接这道题是前缀和的简单应用。我们可以将男生看为1,女生看为-1。那么题目要求的最长子数组的判断条件为该数组和是否为0。首先我们对整个数组进行前缀和;接下来假定该最长子数组在right位置(right进行遍历)结束,那么就有两种情况讨论:1、该位置前缀和为0,那么与max进行比较。......
  • flutter3+dart3聊天室|Flutter3跨平台仿微信App语音聊天/朋友圈
    全新研发flutter3+dart3+photo_view跨多端仿微信App界面聊天Flutter3-Chat。flutter3-chat基于最新跨全平台技术flutter3+dart3+material-design+shared_preferences+easy_refresh构建的仿微信APP界面聊天实例项目。实现发送图文表情消息/gif大图、长按仿微信语音操作面板、图片......
  • leetcode 第141题:环形列表
    leetcode第141题:环形列表第一种:哈希列表publicbooleanhasCycle(ListNodehead){Set<ListNode>seen=newHashSet<ListNode>();while(head!=null){if(seen.contains(head)){returntrue;}......
  • app自动化测试环境搭建
    一,安装AppiumAppium和node.js一起安装(据说两者有依赖关系)。1,node.js傻瓜式安装官网地址:https://nodejs.org/en/安装完成后,运行cmd,输入node–v,如果安装成功,提示版本号2,安装Appium官网下载对应的版本并安装,官网地址:https://bitbucket.org/appium/appium.app/downloads/......
  • Automotive IQ第14届年度汽车网络安全大会将于2024年在底特律举行
    在接受《AutomotiveIQ》独家采访时,福特汽车公司汽车和移动网络安全高级顾问DarrenShelcusky深入探讨了符合UNECER155/R156法规的关键因素,揭示了汽车行业满足这些严格法规的过程。从区分网络安全标准和法规到详细说明其对主机厂和更广泛的汽车网络安全领域的影响,Darren提供了综......
  • CF1499
    A氵B如果11后出现了00就不行。C枚举走几段。横竖可以分开算。一定是:除了费用最小的都是走长度\(1\),费用最小的包揽剩下的。D\(c\cdotlcm(a,b)-d\cdotgcd(a,b)=x\)\(c\cdot\dfrac{a}{gcd(a,b)}\cdot\dfrac{b}{gcd(a,b)}=\dfrac{x}{gcd(a,b)}+d\)\(gcd(a,b)\)......
  • APP在申请敏感权限时,应同步说明权限申请的使用目的,包括但不限于申请权限的名称、服务
    一、概述华为APP应用市场反馈问题:(目前是华为审核特有的问题)APP在申请敏感权限时,应同步说明权限申请的使用目的,包括但不限于申请权限的名称、服务的具体功能、用途;告知方式不限于弹窗、蒙层、浮窗、或者自定义操作系统权限弹框等验证了小米、vivo、oppo、应用宝,只......