Skip to content

Latest commit

 

History

History
118 lines (83 loc) · 3.65 KB

Unity_code_encrypt.md

File metadata and controls

118 lines (83 loc) · 3.65 KB

[TOC]

unity C# 加密

准备工作

  1. unity mono branch 源码
  2. Android NDK
    • 查看所需ndk版本

      • 在你下载的源码工程中查看external/buildscripts/build_runtime_android.sh
      • 有下面类似的一句 perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r9 -env=envsetup.sh && source envsetup.sh
      • 其中 -ndk 的内容 就是所就是所需的NDK版本号。去下载即可.
    • 配置 android NDK 环境变量

NDK_ROOT=/path/2/android-ndk-r10e
NDK=$NDK_ROOT 
ANDROID_NDK_ROOT=$NDK_ROOT 
export NDK_ROOT NDK ANDROID_NDK_ROOT 

编译

  1. brew install autoconf automake pkg-config 这些工具

    • el captain 自带 libtool, 如果 自带的 libtool编译出错,brew install libtool
    • brew 可能不会把 libtool装到 /usr/local/bin上,导致 libtool 相关出错,把 brew libtool 连接到 /usr/local/bin
  2. pl 脚本会使用 git 协议下载 krait-signal-handler.git, 如果使用 proxy的话, 可能会下载不到,可以预先下载好

    • cd external
    • git clone https://github.com/Unity-Technologies/krait-signal-handler.git android_krait_signal_handler
  3. 替换 老旧文件: android_krait_signal_handler/PrepareAndroidSDK.pm

    • cp buildscripts/PrepareAndroidSDK.pm android_krait_signal_handler/PrepareAndroidSDK.pm
  4. pl 脚本会 use lib ("./perl_lib"); , 但是相对路径比较混乱,把mono 根目录下的 perl_lib 目录分别拷贝一份到 android_krait_signal_handler 和 buildscripts 目录下

  5. 修改 external/android_krait_signal_handler/jni/Application.mk

    • clang3.3 改为 clang3.6
    • NDK_TOOLCHAIN_VERSION := clang3.6
    • 看具体情况 NDK r10e 因为已经没有 clang3.3了,所以需要改成 NDK r10e 有的 clang3.6
  6. 修改 external/android_krait_signal_handler/jni/build.pl

    • PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r10e");
  7. Terminal cd到mono根目录下,执行

    • sh external/buildscripts/build_runtime_android.sh
  8. 编译 release版本

    • build_runtime_android.sh 和 build_runtime_android_x86.sh
      • 去掉 -fpic -g 后面的 -g
      • -g 替换成 -O2 生成的 .so 会小点

加密

  • 加密 assets/bin/Data/Managed/Assembly-CSharp.dll

解密

  • mono/metadata/image.c 文件
  • mono_image_open_from_data_with_name 方法
MonoCLIImageInfo *iinfo;
MonoImage *image;
char *datac;

// start decrypt
if(name != NULL)
{
    if(strstr(name,"Assembly-CSharp.dll")){
        // TODO decrypt
    }
}
// end decrypt


if (!data || !data_len) {
    if (status)
        *status = MONO_IMAGE_IMAGE_INVALID;
    return NULL;
}

编译Windows平台mono.dll

  1. 打开Visual Studio Command Prompt(2010)
    • 这会编译出win32的 dll
    • 编译 x64版本dll, 使用 x64 Command Prompt
  2. 进入mono-unity-4.5\msvc目录
  3. 执行msbuild.exe mono.sln /p:Configuration=Release_eglib
    • 注意:直接打开mono.sln解决方案,在Visual Studio底下是编译不了的。