佚名RJ 发表于 2020-12-14 15:58

[超级详细]学so编写时顺手制作CrackMe的过程

本帖最后由 佚名RJ 于 2020-12-14 16:41 编辑

# [超级详细]学so编写时顺手制作CrackMe的过程

**前几天发了这么一篇文章: ** **[自己顺手搞了一个超级超级简单的CrackMe](https://www.52pojie.cn/thread-1327112-1-1.html)**

## 一、所用工具

`Android Studio4.1` + `Ndk 21.1.6352462` + `MUMU模拟器2.4.2`

## 二、编写过程

打开 Android Studio4.1版本 选择 `Empty Activity` 然后 Next



创建项目,填写应用名称与应用包名 选择项目存放的位置之后点击 `Finish`



创建后找到 `activity_maim.xml`使用下面的代码直接全选并替换 Code里的代码 搞一个界面布局,如下图所示:

```xml
<?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文件的做好后,直接替换掉写死的数据就可以了!

```java
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` 文件 并写入相关的代码。如下图所示:

```java
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`同步。如下图所示:


```java
      sourceSets {
            main() {
                jniLibs.srcDirs = ['src/main/libs']
                jni.srcDirs = []
            }
      }
```




在`MainActivity.java`和 `NewActivity.java` 修改相关的代码调用so文件里的密码并运行在模拟器看so调用情况





最后验证 软件加载so文件以及调用的情况,执行成功!如下图所示,一个很简单很简单的so就制作完成了!



## 三、最后总结

之前只是想了解一下so文件的制作过程和如何调用so文件里的内容,想着以后对分析so文件会有一定的帮助!

写这篇文章之前我也百度看了一些,也有一些教程过时了,今天总结了一下,毕竟一直看的话很容易形成

**眼睛:我会了;**            **手:不,你不会!**

通过这篇文章的总结,我**清楚了so文件的简单制作流程** 以及 **so文件内数据的简单调用** ,收获还是挺多的!

正己 发表于 2020-12-14 20:53

Gentmepj 发表于 2020-12-14 20:14
谢谢楼主 学习了
若能再带一下 这个CRACKME为什么用这种方式编程会被破解更好

没有绝对安全的软件,佚名之前的帖子说过很详细的破解教程了

wantwill 发表于 2020-12-14 16:20

很详细,学习了。谢谢

guo8122881 发表于 2020-12-14 17:05

mk,谢谢楼主,学习了

wanshiz 发表于 2020-12-14 17:12

感谢楼主分享经验。有志者事竟成。

tabirs 发表于 2020-12-14 17:17

感谢楼主分享经验。有志者事竟成。

lwedwin 发表于 2020-12-14 18:00


感谢楼主分享经验。有志者事竟成。

Heilexplode 发表于 2020-12-14 18:07

真的是很细了,目前还只能理解小部分,借鉴了

Gentmepj 发表于 2020-12-14 20:14

谢谢楼主 学习了
若能再带一下 这个CRACKME为什么用这种方式编程会被破解更好

一人之下123456 发表于 2020-12-14 20:24

感谢楼主分享的教程,学习了

刘留留 发表于 2020-12-14 20:51

感谢分享,写的很详细
页: [1] 2 3
查看完整版本: [超级详细]学so编写时顺手制作CrackMe的过程