Unity3d 调用 C++ 函数 实现加密防破解 (Android向)
因为Unity 采用C# 作为主要语言,代码编译之后作为DLL存在与执行文件中,这就给我们带来很大的一个问题,反编译非常容易。
如何反编译Unity游戏的代码:
Unity打包生成的安装包,我们随便下载一个游戏,解压APK,来到
assets\bin\Data\Managed
这个目录。
Assembly-CSharp.dll Assembly-CSharp-firstpass.dll
你在游戏中编写的代码就存放在这两个dll中。
把dll拖放到MonoDevelop中,稍等片刻,就能看到dll中的代码。
如果有一些比较重要的代码不想让别人看到,那就用C++来编写,C++编译成so文件,反编译之后只能成为汇编语言,无疑加大了破解难度(当然不能百分百防破解,汇编大牛很多的)
我们先新建一个文件夹,在里面新建一个jni文件夹,新建一个c文件,内容如下:
#include<string.h> #include<jni.h> int Share() { return 1234561; }
就这么一个函数吧,供C#调用。
然后新建一个Android.mk文件,这是NDK编译SO需要的一个mk文件,在里面指定了如何编译。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Share LOCAL_SRC_FILES := Share.c include $(BUILD_SHARED_LIBRARY)
然后新建一个Application.mk文件,指定编译平台以及其它的依赖。
APP_ABI :=armeabi-v7a APP_PLATFORM:=android-8 APP_STL:=gnustl_static APP_CFLAGS += -Wno-error=format-security
然后在jni文件夹中执行命令:
ndk-build
就会编译出来so文件,存放在上一级的lib中。
新建一个Unity3d的工程,然后编写代码,调用so中的的函数。
using UnityEngine; using System.Collections; using System.IO; using System.Runtime.InteropServices; using System; public class test : MonoBehaviour { [DllImport("Share")] private static extern int Share(); // Use this for initialization void Start () { Debug.Log("Shared = "+Share()); } // Update is called once per frame void Update () { } }
注意 如果要调用SO中的函数一定要按照Unity指定的规则来编写:
[DllImport("Share")] private static extern int Share();
在Unity工程中新建目录
Plugins\Android
拷贝SO文件到这里
然后我们导出APK安装测试
Demo工程下载:
http://download.csdn.net/detail/cp790621656/8430985
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。