[超级详细]学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文件内数据的简单调用** ,收获还是挺多的! Gentmepj 发表于 2020-12-14 20:14
谢谢楼主 学习了
若能再带一下 这个CRACKME为什么用这种方式编程会被破解更好
没有绝对安全的软件,佚名之前的帖子说过很详细的破解教程了 很详细,学习了。谢谢 mk,谢谢楼主,学习了 感谢楼主分享经验。有志者事竟成。 感谢楼主分享经验。有志者事竟成。
感谢楼主分享经验。有志者事竟成。 真的是很细了,目前还只能理解小部分,借鉴了 谢谢楼主 学习了
若能再带一下 这个CRACKME为什么用这种方式编程会被破解更好 感谢楼主分享的教程,学习了 感谢分享,写的很详细