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



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。