0x00 背景
本文依然是团队大佬 非尘 学习逆向的学习笔记,这一系列都将以实验的方式进行知识点学习和总结,后续将持续更新,不喜勿喷~
本文及后续文章中使用到的靶场地址:
https://adworld.xctf.org.cn/task/task_list?type=mobile&number=6&grade=0
0x01 实验目的
0x02 实验步骤
//实现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; //必须返回该值
}
7)首先在c文件中导入我们的头文件<jni.h>,然后实现我们在java层的方法
8)绑定java层方法和c层方法,在jni接口中查找JNINativeMethod结构体,完成结构体
//实现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; //必须返回该值
}
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");
}
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() {
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);
}
0x03 看到这里的大佬,别停,再往下继续
如果有缘的逆向大佬看到这里,希望能够因为缘份加入我们团队哦:
团队现多为攻防和漏洞挖掘方向(团队人员17名),仅存的逆向方向的非尘希望能够有个一起学习和研究的队友,因此希望能够招募一名有缘人,有意者可以将简历发送至团队邮箱:
[email protected]
期待大佬的加入~
往期经典推荐:
----------------------------------------------------------------------
渗透实战(一)|BSides Vancouver 2018 (Workshop)
移动安全(一)|Android设备root及神器Xposed框架安装
>>关于我们:
WhITECat安全小组隶属于起源实验室分支安全小组,主要致力于分享小组成员技术研究成果、最新的漏洞新闻、安全招聘以及其他安全相关内容。团队成员暂时由起源实验室核心成员、一线安全厂商、某研究院、漏洞盒TOP10白帽子等人员组成。
欢迎各位大佬关注^_^
本文始发于微信公众号(WhITECat安全团队):移动安全(六)|NDK开发教程_动态注册
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论