JNI

要逆向,必须会正向编写。第一个.so文件的编写(adnroid studio环境)

配置环境

参考
我这里直接安装adnroid studio,环境就搭好了。

编写

创建check

在MainActivity同一级创建一个check.java

1
2
3
4
5
6
package com.example.ese.jni;
public class check {
public native static String Check(String sstr);
}

工具栏Build->Make Project(ctrl+f9)。在main的下一层(java层)创建jni目录
android在终端
Terminal>>cd app/src/main/java
Terminal>>javah -jni com.example.ese.jni.check
(这时会产生一个com.example.ese.jni.check.h文件)
Terminal>>cd ..
Terminal>>cd jni
(将上面的com.example.ese.jni.check.h拖入jni目录中)

在jni目录下新建一个check.c文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <string.h>
#include <jni.h>
#include <com_example_ese_jni_check.h>
int enc_f[]={0xc2, 0xfc, 0xce, 0x93, 0xd0, 0xa2, 0xd4, 0xbb, 0xe4, 0xbf, 0x8b};
int sub_14025xor(char *input)
{
int i=0;
int llen = strlen(input);
for(;i<llen;i++)
{
if(i%2==0)
{
if((input[i]^0xbb)!=enc_f[i])
{
return 0;
}
}else
{
if((input[i]^0xcc)!=enc_f[i])
{
return 0;
}
}
}
return 1;
}
//方法名是com_example_ese_jni_check+方法Check
JNIEXPORT jstring JNICALL Java_com_example_ese_jni_check_Check(JNIEnv *env, jclass jz,jstring str1)
{
const char *str = (*env)->GetStringUTFChars(env, str1, NULL);
if(str == NULL) {
return NULL;
}
int key = sub_14025xor(str);
char* tmpstr = "succeeded";
if(key)
{
jstring rtstr = (*env)->NewStringUTF(env, tmpstr);
return rtstr;
}else{
tmpstr = "failed!!";
jstring rtstr = (*env)->NewStringUTF(env, tmpstr);
return rtstr;
}
}

在jni目录下新建一个Android.mk文件和Application.mk文件
Android.mk

1
2
3
4
5
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := check
LOCAL_SRC_FILES := check.c
include $(BUILD_SHARED_LIBRARY)

Application.mk

1
APP_ABI := all

现在terminal在jni目录下
terminal>>ndk-build

这时候会生成libcheck.so文件在libs(jni同级目录)

调用so

在方法Check添加调用库check

1
2
3
4
5
6
7
8
public class check {
static {
System.loadLibrary("check");
}
public native static String Check(String sstr);
}

在app目录下的build.gradle中添加

1
2
3
4
5
6
7
8
9
android {
......
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
}
}
}

这时一个简单的输入结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
activity_main.xml
{
.....
<EditText
android:id="@+id/input_flag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="80dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="100dp"
android:ems="10"
android:inputType="textPersonName"
android:hint="input your flag"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="UnknownId" />
<Button
android:id="@+id/input_ok"
android:layout_width="102dp"
android:layout_height="45dp"
android:layout_marginBottom="276dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:text="确认"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.458"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="MissingConstraints" />
}

MainActivity结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText sstr = (EditText) findViewById(R.id.input_flag);
final Button ok = (Button) findViewById(R.id.input_ok);
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String st = sstr.getText().toString().trim();
String res = check.Check(st);
Toast.makeText(MainActivity.this, res, Toast.LENGTH_SHORT).show();
}
});
}
}

运行就可以得到调用native方法的apk了。
apk生成路径:C:\Users\Administrator\AndroidStudioProjects\jni\app\build\outputs\apk\debug

Donate
-------------本文结束感谢您的阅读-------------