[超级详细]学so编写时顺手制作CrackMe的过程
前几天发了这么一篇文章: 自己顺手搞了一个超级超级简单的CrackMe
一、所用工具
Android Studio4.1
+ Ndk 21.1.6352462
+ MUMU模拟器2.4.2
二、编写过程
打开 Android Studio4.1版本 选择 Empty Activity
然后 Next
创建项目,填写应用名称与应用包名 选择项目存放的位置 之后点击 Finish
创建后找到 activity_maim.xml
使用下面的代码直接全选并替换 Code里的代码 搞一个界面布局,如下图所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/linearLayout1"
android:layout_alignLeft="@+id/linearLayout1"
android:layout_alignRight="@+id/linearLayout1"
android:layout_marginTop="20dp">
<EditText
android:id="@+id/TEST_PASS"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint=" 请输入密 码"
android:inputType="textPassword">
<requestFocus />
</EditText>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="39dp">
<EditText
android:id="@+id/TEXT_NAME"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint=" 请输入用户名" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/linearLayout2"
android:layout_alignLeft="@+id/linearLayout2"
android:layout_marginLeft="3dp"
android:layout_marginTop="-2dp">
<Button
android:id="@+id/BTN_Login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/linearLayout3"
android:layout_alignRight="@+id/logbutredister"
android:layout_marginTop="31dp"
android:background="#5f9ea0"
android:text="登 录"
android:textColor="#ffffff"
app:backgroundTint="#009688" />
</LinearLayout>
</RelativeLayout>
写登录验证相关的代码,这里就只写死密码相关,后期so文件的做好后,直接替换掉写死的数据就可以了!
public class MainActivity extends AppCompatActivity {
private EditText Name;
private EditText Pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.Name = (EditText) findViewById(R.id.TEXT_NAME);
this.Pass = (EditText) findViewById(R.id.TEST_PASS);
((Button) findViewById(R.id.BTN_Login)).setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
MainActivity.this.check(MainActivity.this.Name.getText().toString().trim(), MainActivity.this.Pass.getText().toString().trim());
}
});
}
@SuppressLint({"WrongConstant", "ShowToast"})
public void check(String name, String pass) {
if (pass.equals("yimingrj") { //yimingrj
Toast.makeText(this, "恭喜!登录成功", 0).show();
startActivity(new Intent().setClass(this, NewActivity.class));
}
Toast.makeText(this, "抱歉!您失败了", 0).show();
}
}
创建另一个Activity,只搞一个TextView 布局控件,用来显示后期登录成功之后的数据!
创建一个类RjJNI,并写相关代码,作用就是后期读取so文件中的数据
选择 软件包 并点击 Open in Terminal
在软件包处打开命令行。如下图所示:
并 执行相关的命令 编译 RjJNI.java
文件为class文件 如下图所示:
选择 java
并点击 Open in Terminal
在java
处打开命令行 并记住包名和类名。如下图所示:
使用 javah -jni com.yimingrj.crackme.RjNI
生成.h文件,如下图所示:
选择main
创建 JNI Folder
如下图所示:
选择 jni
新建一个c文件 我这里命名为了c.c
引用上面.h的代码 或者 将上面 .h的代码复制进c.c,简单修改返回一个字符串 yiming-yrj(这是后期的登录密码)!
创建 Android.mk
和 Application.mk
文件 并写入相关的代码。如下图所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := RjJNI
LOCAL_SRC_FILES := c.c
include $(BUILD_SHARED_LIBRARY)
在 项目下找到相关的文件 并添加 ndk路径 或者 你之前配置的有也可以,这里ndk的版本不是一定的!
选择 jni
并点击 Open in Terminal
在jni
处打开命令行 并输入 ndk-build
运行生成so 如下图所示:
之后就在 libs中生成了多种架构so文件,这里也可以直接在Application.mk
中定制想要生成的so架构文件!
找到 build-gradle
添加相关代码加载使用so文件所在的路径 之后点击 Sync Now
同步。如下图所示:
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = []
}
}
在MainActivity.java
和 NewActivity.java
修改相关的代码调用so文件里的密码 并运行在模拟器 看so调用情况
最后验证 软件加载so文件以及调用的情况,执行成功!如下图所示,一个很简单很简单的so就制作完成了!
三、最后总结
之前只是想了解一下so文件的制作过程和如何调用so文件里的内容,想着以后对分析so文件会有一定的帮助!
写这篇文章之前我也百度看了一些,也有一些教程过时了,今天总结了一下,毕竟一直看的话很容易形成
眼睛:我会了; 手:不,你不会!
通过这篇文章的总结,我清楚了so文件的简单制作流程 以及 so文件内数据的简单调用 ,收获还是挺多的!