標籤:unity android 組合語言 反編譯 破解
因為Unity 採用C# 作為主要語言,代碼編譯之後作為DLL存在與執行檔案中,這就給我們帶來很大的一個問題,反編譯非常容易。
如何反編譯Unity遊戲的代碼:
Unity打包產生的安裝包,我們隨便下載一個遊戲,解壓APK,來到
assets\bin\Data\Managed
這個目錄。
Assembly-CSharp.dllAssembly-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-v7aAPP_PLATFORM:=android-8APP_STL:=gnustl_staticAPP_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 initializationvoid Start () {Debug.Log("Shared = "+Share());}// Update is called once per framevoid Update () {}}
注意 如果要調用SO中的函數一定要按照Unity指定的規則來編寫:
[DllImport("Share")]private static extern int Share();
在Unity工程中建立目錄
Plugins\Android
拷貝SO檔案到這裡
然後我們匯出APK安裝測試
Demo工程下載:
http://download.csdn.net/detail/cp790621656/8430985
Unity3d 調用 C++ 函數 實現加密防破解 (Android向)