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

【APP逆向13】JNI开发简介之一

时间:2024-02-05 21:33:45浏览次数:36  
标签:info 13 String int APP char env JNI include

  • 简介:在一些不一般的APP中,核心算法不是直接写在java代码中,如果直接写在java中,逆向人员只需要简单的反编译就能找到;如是就出现了JNI:java native interface ,Java本地开发接口,实现JAVA和C语言之间的相互调用。将核心算法写在C语言中。

  • 1.正向开发流程

    • 1.1:新建一个java类,实现核心算法
    • 注意,看到native关键字,就说明此方法具体实现在C语言中实现
package com.nb.s6dayin;
public class Utils {

    static {
        System.loadLibrary("utils");   //对应的C文件
    }

    public native static int v1(int a1, int a2);

    public static native String v2(String old);   //native--说明具体实现在C语言中
}
  • 1.2:创建C文件,实现具体算法

#include <jni.h>

JNIEXPORT jint
JNICALL Java_com_nb_s6dayin_Utils_v1(JNIEnv *env, jclass clazz, jint a1, jint a2) {
    // 编写C语言的代码
    return a1 + a2 + 100;
}
  • 1.3:C编译配置

  • 1.4:java调用C语言

  • 1.5:当我们逆向某APP找到对应的native关键字方法时,就需要找到对应的so(压缩APK后,解压--lib--找到对应的so文件,名称一般为:lib+C文件名称)文件,查看C语言实现


  • 2.java调用C示例

    • 2.1:数字处理
public static native int v1(int v1, int v2);

#include <jni.h>
JNIEXPORT jint
JNICALL Java_com_nb_s4luffy_EncryptUtils_v1(JNIEnv *env, jclass clazz, jint v1, jint v2) {
    return v1 + v2;
}
  • 2.2:字符串修改,指针
public static native String v2(String old);

#include <jni.h>
#include <string.h>
#include <syslog.h>

JNIEXPORT jstring

JNICALL
Java_com_nb_s5dabai_EncryptUtils_v2(JNIEnv *env, jclass clazz, jstring old) {
	
    // char info[]  = {'w','w','p','e',..'w'...};
    char *info = (*env)->GetStringUTFChars(env, old, 0);
    syslog(LOG_ERR, "%s", info);

    info += 1;
    *info = 'w';
    info += 3;
    *info = 'w';
    info -= 4;
    syslog(LOG_ERR, "%s", info);
    return (*env)->NewStringUTF(env, info);
}
  • 2.3:字符串修改-数组
public static native String v3(String old);

JNIEXPORT jstring

JNICALL
Java_com_nb_s4luffy_EncryptUtils_v3(JNIEnv *env, jclass clazz, jstring old) {
	// 字符串数组
    char *info = (*env)->GetStringUTFChars(env, old, 0);
    info[0] = 'x';
    info[5] = 'x';
    
    return (*env)->NewStringUTF(env, info);
}
  • 2.4:字符串拼接
public static native String v4(String name, String role);

#include <jni.h>
#include <string.h>
#include <syslog.h>
#include<stdlib.h>


int GetStringLen(char *dataString) {
    int count = 0;
    for (int i = 0; dataString[i] != '\0'; i++) {
        count += 1;
    }
    return count;
}

JNIEXPORT jstring

JNICALL
Java_com_nb_s4luffy_EncryptUtils_v4(JNIEnv *env, jclass clazz, jstring name, jstring role) {
	
    // 字符数组=指针  alex   dsb
    char *nameString = (*env)->GetStringUTFChars(env, name, 0);
    char *roleString = (*env)->GetStringUTFChars(env, role, 0);
	
    // alexdsb
    char *result = malloc(GetStringLen(nameString) + GetStringLen(roleString) + 1);
    
    strcpy(result, nameString);
    strcat(result, roleString);
    syslog(LOG_ERR, "%s", result);
    return (*env)->NewStringUTF(env, result);
}
  • 2.5:字符处理
String n5 = EncryptUtils.v5("name=xwl&age=19");
public static native String v5(String data);

#include <jni.h>
#include <string.h>
#include <syslog.h>
#include<stdlib.h>

int GetStringLen(char *dataString) {
    int count = 0;
    for (int i = 0; dataString[i] != '\0'; i++) {
        count += 1;
    }
    return count;
}


JNIEXPORT jstring
JNICALL
Java_com_nb_s4luffy_EncryptUtils_v5(JNIEnv *env, jclass clazz, jstring data) {
	
    // "name=xwl&age=19"
    char *urlParams = (*env)->GetStringUTFChars(env, data, 0);
    int size = GetStringLen(urlParams);
	
    // v34 = {1,2,,,,,,,,,,,}
    char v34[size * 2];
    
    char *v28 = v34;

    for (int i = 0; urlParams[i] != '\0'; i++) {
        //syslog(LOG_ERR, "%02x", urlParams[i]);
        sprintf(v28, "%02x", urlParams[i]);
        v28 += 2;
    }

    return (*env)->NewStringUTF(env, v34);
}
  • 2.6:字节处理
String n6 = EncryptUtils.v6("name=xwl&age=19".getBytes());
public static native String v6(byte[] data);

#include <jni.h>
#include <string.h>
#include <syslog.h>
#include<stdlib.h>

JNICALL
Java_com_nb_s4luffy_EncryptUtils_v6(JNIEnv *env, jclass clazz, jbyteArray data) {

//    jbyte *byteArray = (*env)->GetByteArrayElements(env, data, 0);
    char *byteArray = (*env)->GetByteArrayElements(env, data, 0);
    int size = (*env)->GetArrayLength(env, data);

    char v34[size * 2];
    char *v28 = v34;

    for (int i = 0; byteArray[i] != '\0'; i++) {
        syslog(LOG_ERR, "%02x", byteArray[i]);
        sprintf(v28, "%02x", byteArray[i]);
        v28 += 2;
    }

    return (*env)->NewStringUTF(env, v34);
}

标签:info,13,String,int,APP,char,env,JNI,include
From: https://www.cnblogs.com/xwltest/p/18008864

相关文章

  • [ARC135D] Add to Square 题解
    题目链接点击打开链接题目解法很牛的题!!!先考虑一步很牛的转化:把矩阵黑白染色,且\(i+j\)为奇数的位置的值取反,每次操作变为左上右下\(+v\),左下右上\(-v\)这样有啥好处?操作不会使行和列的和改变考虑答案的下界显然是:\(\max\{\)行的绝对值之和,列的绝对值之和\(\}\)这里给出......
  • 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为中心的展示模式、......
  • 【2024潇湘夜雨】WIN11_Pro_23H2.22635.3139软件选装纯净版2.04
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_23H2.22635.3139.2.增加部分优化方案,手工精简部分较多。3.OS版本号为22635.3139。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.16.0.0》网卡版、运......
  • (13)TreeView1前面带CheckBox显示
     这些节点都是动态生成,再设置。原理还是在前面显示图片实现procedureTForm1.FormCreate(Sender:TObject);varpnode,node:TTreeNode;beginwithTreeView1.Itemsdobeginnode:=Add(nil,'Item1');//动态生成一个节点node.ImageIndex:=......
  • flutter3+dart3聊天室|Flutter3跨平台仿微信App语音聊天/朋友圈
    全新研发flutter3+dart3+photo_view跨多端仿微信App界面聊天Flutter3-Chat。flutter3-chat基于最新跨全平台技术flutter3+dart3+material-design+shared_preferences+easy_refresh构建的仿微信APP界面聊天实例项目。实现发送图文表情消息/gif大图、长按仿微信语音操作面板、图片......
  • app自动化测试环境搭建
    一,安装AppiumAppium和node.js一起安装(据说两者有依赖关系)。1,node.js傻瓜式安装官网地址:https://nodejs.org/en/安装完成后,运行cmd,输入node–v,如果安装成功,提示版本号2,安装Appium官网下载对应的版本并安装,官网地址:https://bitbucket.org/appium/appium.app/downloads/......
  • CF1348
    传送门A:一个组\(2^n+2^1+\dots+2^{\frac{n}{2}-1}\),另一个组剩下的。B:考虑不停循环。如果不同的数字超过\(k\),无解。否则先把原序列去重,然后把末尾补一些数补成\(k\)个,再把这个新序列循环\(n\)次。C:先把字符们排序。肯定先把最小的\(k\)个字符作为各自的开头......
  • 再测python3.13 —— python3.13是否移除了GIL的限制(续)
    前文:python3.13是否移除了GIL的限制x86_64ubuntu22.04环境下编译版本python3.13.0alpha0源码——python3.13.0alpha0的源码编译相关资料:PEP703–MakingtheGlobalInterpreterLockOptionalinCPythonhttps://github.com/python/cpython/issues/108223......
  • APP在申请敏感权限时,应同步说明权限申请的使用目的,包括但不限于申请权限的名称、服务
    一、概述华为APP应用市场反馈问题:(目前是华为审核特有的问题)APP在申请敏感权限时,应同步说明权限申请的使用目的,包括但不限于申请权限的名称、服务的具体功能、用途;告知方式不限于弹窗、蒙层、浮窗、或者自定义操作系统权限弹框等验证了小米、vivo、oppo、应用宝,只......