移动安全(六)|NDK开发教程_动态注册

  • A+
所属分类:移动安全

0x00 背景

      本文依然是团队大佬 非尘 学习逆向的学习笔记,这一系列都将以实验的方式进行知识点学习和总结,后续将持续更新,不喜勿喷~

本文及后续文章中使用到的靶场地址:

https://adworld.xctf.org.cn/task/task_list?type=mobile&number=6&grade=0

移动安全(六)|NDK开发教程_动态注册

0x01 实验目的

通过动态注册,实现一个计算器的编写,功能为加减乘除。

0x02 实验步骤

1)新建一个项目为Calc,然后一路next,完成项目的创建:

移动安全(六)|NDK开发教程_动态注册 

2)然后再在layout布局文件中定义我们的控件布局,详细布局代码见下图:

移动安全(六)|NDK开发教程_动态注册

移动安全(六)|NDK开发教程_动态注册

布局代码如下:
#include <jni.h>//实现java层被native修饰的方法jfloat addc(JNIEnv* env,jobject obj,jfloat a,jfloat b){  return a+b;}
jfloat subc(JNIEnv* env,jobject obj,jfloat a,jfloat b){ return a-b;}
jfloat mulc(JNIEnv* env,jobject obj,jfloat a,jfloat b){ return a*b;}jfloat divc(JNIEnv* env,jobject obj,jfloat a,jfloat b){ return a/b;}
//结构体 JNINativeMethod//用于绑定java方法和c方法的关系JNINativeMethod nativeMethod[] = { //java层的方法名;Java层的签名;指针,指向c层的方法 {"add","(FF)F",(void*)addc}, {"sub","(FF)F",(void*)subc}, {"mul","(FF)F",(void*)mulc}, {"div","(FF)F",(void*)divc}};//注册相应的类以及方法jint registerNatives(JNIEnv* env){ jclass _jclass = (*env)->FindClass(env,"com/example/calc/MainActivity"); if((*env)->RegisterNatives(env, _jclass,nativeMethod,sizeof(nativeMethod)/sizeof(nativeMethod[0]))!=JNI_OK){ return JNI_ERR; } return JNI_OK;
}//动态注册JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){ JNIEnv* env; if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_4)!=JNI_OK){ return JNI_ERR; } if(registerNatives(env)!=JNI_OK){ return JNI_OK; } return JNI_VERSION_1_4; //必须返回该值}
3)然后在MainActivity编写我们的程序代码,首先绑定控件,之后对控件初始化(由于控件较多,单独创建一个方法用于控件的初始化)

移动安全(六)|NDK开发教程_动态注册

移动安全(六)|NDK开发教程_动态注册

4)设置监听获取点击事件及编辑框输入的值(由于四个按钮监听方式相同,可采用switch-case方式来监听)

移动安全(六)|NDK开发教程_动态注册

移动安全(六)|NDK开发教程_动态注册 

5)定义c层实现的native方法声明,到此java层代码已经完成

移动安全(六)|NDK开发教程_动态注册

6)然后在项目下新建一个文件夹jni,然后新建一个calc.c的文件,编写我们的c层代码

移动安全(六)|NDK开发教程_动态注册

7)首先在c文件中导入我们的头文件<jni.h>,然后实现我们在java层的方法移动安全(六)|NDK开发教程_动态注册

    8)绑定java层方法和c层方法,在jni接口中查找JNINativeMethod结构体,完成结构体

移动安全(六)|NDK开发教程_动态注册

9)然后在jni接口中查找RegisterNatives,注册相应的类以及方法

移动安全(六)|NDK开发教程_动态注册

移动安全(六)|NDK开发教程_动态注册

移动安全(六)|NDK开发教程_动态注册

10)然后实现动态注册JNI_OnLoad,最后的c层代码如下

移动安全(六)|NDK开发教程_动态注册

#include <jni.h>//实现java层被native修饰的方法jfloat addc(JNIEnv* env,jobject obj,jfloat a,jfloat b){  return a+b;}
jfloat subc(JNIEnv* env,jobject obj,jfloat a,jfloat b){ return a-b;}
jfloat mulc(JNIEnv* env,jobject obj,jfloat a,jfloat b){ return a*b;}jfloat divc(JNIEnv* env,jobject obj,jfloat a,jfloat b){ return a/b;}
//结构体 JNINativeMethod//用于绑定java方法和c方法的关系JNINativeMethod nativeMethod[] = { //java层的方法名;Java层的签名;指针,指向c层的方法 {"add","(FF)F",(void*)addc}, {"sub","(FF)F",(void*)subc}, {"mul","(FF)F",(void*)mulc}, {"div","(FF)F",(void*)divc}};//注册相应的类以及方法jint registerNatives(JNIEnv* env){ jclass _jclass = (*env)->FindClass(env,"com/example/calc/MainActivity"); if((*env)->RegisterNatives(env, _jclass,nativeMethod,sizeof(nativeMethod)/sizeof(nativeMethod[0]))!=JNI_OK){ return JNI_ERR; } return JNI_OK;
}//动态注册JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){ JNIEnv* env; if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_4)!=JNI_OK){ return JNI_ERR; } if(registerNatives(env)!=JNI_OK){ return JNI_OK; } return JNI_VERSION_1_4; //必须返回该值}
11)c层代码编写完成后,将两个mk文件拖到jni目录下,更改Android.mk文件的模块名称和源文件。然后来到项目jni的路径下执行ndk-build,之后在java层加载so库,附上java层的代码
package com.example.calc;
import android.os.Bundle;import android.app.Activity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity { //定义编辑框接受变量 private EditText first; private EditText second; //定义按钮变量 private Button add; private Button sub; private Button mul; private Button div; //定义编辑框接收值 private float one; private float two; static{ System.loadLibrary("calc"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); //运算 yunsuan(); }

private void init(){ //编辑框的绑定 first = (EditText)findViewById(R.id.editText1); second = (EditText)findViewById(R.id.editText2); //按钮的绑定 add = (Button) findViewById(R.id.add); sub = (Button) findViewById(R.id.sub); mul = (Button) findViewById(R.id.mul); div = (Button) findViewById(R.id.div); } private void yunsuan() { OnClickListener cl = new OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.add: //获取编辑框的值 one = Float.parseFloat(first.getText().toString()); two = Float.parseFloat(second.getText().toString()); Toast.makeText(MainActivity.this, add(one,two)+"", 1).show(); break; case R.id.sub: //获取编辑框的值 one = Float.parseFloat(first.getText().toString()); two = Float.parseFloat(second.getText().toString()); Toast.makeText(MainActivity.this, sub(one,two)+"", 1).show(); break; case R.id.mul: //获取编辑框的值 one = Float.parseFloat(first.getText().toString()); two = Float.parseFloat(second.getText().toString()); Toast.makeText(MainActivity.this, mul(one,two)+"", 1).show(); break; case R.id.div: //获取编辑框的值 one = Float.parseFloat(first.getText().toString()); two = Float.parseFloat(second.getText().toString()); Toast.makeText(MainActivity.this, div(one,two)+"", 1).show(); break; default: break; } } }; //按钮的监听 add.setOnClickListener(cl); sub.setOnClickListener(cl); mul.setOnClickListener(cl); div.setOnClickListener(cl); } public native float add(float one,float two); public native float sub(float one,float two); public native float mul(float one,float two); public native float div(float one,float two);}


移动安全(六)|NDK开发教程_动态注册

移动安全(六)|NDK开发教程_动态注册

移动安全(六)|NDK开发教程_动态注册

12)最后运行项目,完成实验

移动安全(六)|NDK开发教程_动态注册

0x03 看到这里的大佬,别停,再往下继续

    如果有缘的逆向大佬看到这里,希望能够因为缘份加入我们团队哦:

团队现招募一名Android逆向方向的大佬,或者有过相关Android开发经验的亦可。
     
团队现多为攻防和漏洞挖掘方向(团队人员17名),仅存的逆向方向的非尘希望能够有个一起学习和研究的队友,因此希望能够招募一名有缘人,有意者可以将简历发送至团队邮箱:
[email protected]
期待大佬的加入~


往期经典推荐:

----------------------------------------------------------------------

漏洞笔记|记一次与XXE漏洞的爱恨纠缠

深入探究浏览器编码及XSS Bypass

Apache Solr远程命令执行复现

“最后”的Bypass CDN 查找网站真实IP

渗透实战(一)|BSides Vancouver 2018 (Workshop)

移动安全(一)|Android设备root及神器Xposed框架安装

内网信息收集篇

MSF 下域内渗透


>>关于我们:

WhITECat安全小组隶属于起源实验室分支安全小组,主要致力于分享小组成员技术研究成果、最新的漏洞新闻、安全招聘以及其他安全相关内容。团队成员暂时由起源实验室核心成员、一线安全厂商、某研究院、漏洞盒TOP10白帽子等人员组成。

欢迎各位大佬关注^_^

移动安全(六)|NDK开发教程_动态注册





 

本文始发于微信公众号(WhITECat安全团队):移动安全(六)|NDK开发教程_动态注册

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: