代码混淆求教Java web项目一般怎样做代码混淆或加密
关于代码混淆,怎么不混淆注解 我用过xUtils框架也用到了注解,我用的注解方法是这样的,你可以参考一下试试;
-keepattributes *Annotation*
-keep class * extends java.lang.annotation.Annotation { *; }代码混淆后常量让然可以被看到怎么处理? 正如楼上所说,隐藏服务器地址是没意义的,捉网络的数据包就可以看到如果想隐藏其他的变量,可以把字符串先加密(AES之类的),用的时候再解密加密所用的代码要混淆,不要让人看出是什么加密算法 查看原帖>>如何做Unity3d的代码混淆 Unity代码混淆方案
内容提要:Unity引擎下的代码保护,由于Unity引擎的一些特殊性,实行起来较为复杂,在国内外业界并没有现成的方案。 笔者通过在《QQ乐团》项目上的实际尝试,得出了一种具体可行,能够有效保护代码逻辑的方案。 特此分享给关注Unity引擎的项目,希望能提供一些的参考。
背景
Unity引擎上的程序执行在Mono运行时上,使用Mono编译出的程序集格式与.NET标准一致。 C#是Unity引擎下主要的开发语言,它具备不少高级语言特性,如反射、元数据、内置序列化等。 但C#同时也是很容易被反编译的语言,如果不采用任何保护措施,使用常用的工具(.NET Reflector)便能很容易得到可二次编译的代码。 对项目运营带来了比较大的风险。
.NET平台下通常的保护手段是混淆编译出的程序集。 VisualStudio自带了一个混淆工具Dotfuscator可以对程序集进行混淆。 功能包括名称修改,流程混淆,字符串加密等。 经过Dotfuscator混淆后的程序集,能够避免被常用反编译工具破解。 变量的表意性被破坏,同时函数的内部流程也被混淆(如下[B1] )。 能有效起到保护源代码的效果。
lass181: 218
{
// Fields
publicuint0;
publicushort1;
publicstaticreadonlyuint2;
publicstaticreadonlyuint3;
// Methods
static181();
public181();
public95.02();
public95.02(ref515A_0, uintA_1);
public95.02(79A_0, refuintA_1);
public95.02(ref79A_0, uintA_1);
public95.02(byte[] A_0, intA_1, refuintA_2);
public95.02(ref481A_0, intA_1, charA_2);
public95.02(refstringA_0, intA_1, charA_2);
public95.02(refbyte[] A_0, intA_1, refintA_2, uintA_3);
public95.03(ref79A_0, uintA_1);
public95.03(refbyte[] A_0, intA_1, refintA_2, uintA_3);
public95.04(refbyte[] A_0, intA_1, refintA_2, uintA_3);
}
public95.00(refsbyteA_0, intA_1)
{
// This item is obfuscated and can not be translated.
goto Label_0006;
if(1!= 0)
{
}
95.0local= 95.0.0;
bytenum= 0;
local = this.0(refnum,A_1);
A_0 = (sbyte) num;
returnlocal;
Unity引擎下,Mono编译出的程序集,由于采用与.NET相同的格式标准。 能够直接被Dotfuscator混淆。 但Unity引擎有一些特殊的地方,使混淆工作与一般的.NET程序存在差异。 第三节将主要讨论这些特殊点。
Unity引擎下代码混淆的特殊性
代码被资源引用[B2] 。 Unity的可视化编辑特性在设计上的关键之处在于使代码能够以组件的形式依附到资源实例上。 相比传统游戏,Unity的两类资源(scene和prefab)不仅包括数据,还包括附加在资源上的类对象。 也就是说,这两类资源的存储格式中存在唯一标识某代码类型的数据。 混淆流程必须不破环这种对应关系才能使资源上的代码逻辑正确被执行。 (Unity这样设计的意义并不是本文讨论的重点,而另一篇分享个人对Unity可视化编辑的理解的文章中将会详细说明。 )
发布到Web的Unity项目,在生成播放器可执行包(*.unity)的接口中,将编译程序集和打包这两个步骤捆绑在的一起。 我们没办法像普通.NET程序那样,对编译出的程序集进行混淆后再打到播放器可执行包中。
UnityEngine按函数名进行调用。 MonoBehaviour是Unity引擎的一个重要的组件基类。 其上的很多方法,Unity是通过方法名称进行访问的,如Awake、Start、Update等等。 这些方法如果在混淆中被改名,将使方法调用失败。 这个问题相对比较好处理,Dotfuscator的重命名功能提供了排除配置。 我们只要得到继承于MonoBehaviour的所有类型,就能生成相应的排除配置,告知Dotfuscator不要对这些方法进行重命名。 生成的配置节选如下[B3] :
xmlserialization
思路
何时混淆?由于Web项目编译和打包的过程是捆绑在一起的,官方没有提供独立的接口。 (之前有跟官方反馈,但目前官方并没有提供具体计划。 )想自己来分析官方的打包格式是行不通并且不太科学的。 仅剩的办法就是自己将代码编译成DLL,混淆之后再添加到Unity项目中。
顺着这条思路,笔者在《QQ乐团》项目上作了尝试。 将项目中所有执行相关的代码(不包括编辑器扩展的代码)移出,指定相关的Unity依赖库,编译成DLL。 再将此DLL复制到原项目中。 这时意料之中的事情发生了——项目中所有资源上的代码引用全部丢失。 为了找到资源对代码的映射形式,笔者调整Unity编辑器的设定,将资源的序列化格式改为文本格式,并进行对比分析。 发现资源中是通过一个GUID来对应具体代码的[B4] 。 (如下)
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID:11500000, guid: 4b0f, type: 1}
m_Name:
mInt: 1
mFloat: .5
中的类型虽然还没有进行过混淆,但GUID已经发生了变化。 将新的GUID替换到资源文件中,引用关系果然恢复了。
Unity引擎下的特殊问题都是可以解决的。 于是顺着这思路,开发了若干工具,得到了前后GUID的对应关系,并扫描所有资源以进行GUID的替换。 另一方面,在混淆之后,类型的变量名发生了改变,资源中变量名赋有具体的值,也需要替换资源中的变量名对应到混淆后的变量名。 这一切花费了不少的精力,终于是把工具都做成了。
然而人算不如天算,最终导致此方案走进死角的是一个之前很难意料到的问题:Unity引擎在处理DLL中的模版类型时存在缺陷——DLL中的模版类型没有GUID,不能被资源所引用。 这个问题在Unity官方网站上有少量反馈,而官方承认了这个bug,且没有给出解决方案。 而《QQ乐团》的项目在UI操作上比较广泛地使用了模版类型,去除模版的使用谈何容易。 就这样,这么一个不经意的问题为这个尝试的方向画上了句号。
“系着枷锁跳舞”,这句话是形容的是在各种条件约束下尽可能的追求解决方案的一种状态。 总结之前的失败,最终还是找到了实际可行的改进方案,并成功应用到《QQ乐团》的Web版本和微客户端版本上。
最终的思路是将项目进行分层。 独立出一个不被资源引用的,包含最敏感的协议解析和各个系统模块的“逻辑层”,将逻辑层的代码独立编译成一个DLL,进行混淆再包含到项目中。 逻辑层之外的代码主要包括被资源引用到的,或是系统模块部分接口定义这样的不太敏感的内容,姑且称为“行为层”。 为了让逻辑层可以独立编译,我们要求逻辑层可对行为层进行引用,而行为层则只能通过留在行为层的逻辑层接口访问逻辑层。 这样我们就保护了我们最重要的代码,同时绕过了资源引用代码的问题。
这个方案对项目架构提出了一定的要求。 一是要求敏感代码和资源保持独立,需要一个框架来加载各个模块,而不是直接将模块代码直接附在场景物体的资源中。 二是要求层次清晰,不允许反向依赖。 有利于《QQ乐团》项目的消息是,《QQ乐团》从最早期就实现了一个较清晰的架构管理方法。 因此花费了一定的时间进行分层,和实现接口访问机制后,就成功执行了这个方案。
实际混淆步骤。 《QQ乐团》是使用VisualBuild来执行版本构建和发布流程的。 以下介绍版本构建中混淆相关的流程:
从Unity项目的Assets目录中拷贝出逻辑层的代码目录(CodeGameLogic)。 和编辑器扩展代码(避免混淆后编辑器扩展代码对逻辑层的依赖丢失导致编译出错)。
调用Unity.exe命令行编译剩余的行为层部分:
这个函数实际执行了:
BuildPipeline.BuildPlayer(new string[] {"Assets/obfuscated.unity" }, "WebPlayerObfuscated",
BuildTarget.WebPlayer, BuildOptions.None);
Editor程序集(也就是编辑器扩展程序集)时编译失败,中断编译过程,避免在BuildPlayer过程结束时构建生成的DLL被清理掉。 BuildPlayer之前故意在Editor目录下弄一个错误的代码文件即可。
将生成的行为层DLL拷贝到逻辑层构建目录。 行为层DLL的路径是在项目的Library/ScriptAssemblies下,有Assembly-CSharp.dll和Assembly-CSharp-firstpass.dll两个文件。 另外也拷贝逻辑层依赖的其它DLL到构建目录,包括UnityEngine.dll,以及项目Plugins目录下的依赖库。
调用Mono的编译器mcs编译逻辑层DLL——CodeGameLogic.dll。 编译命令如下:
生成DotObfuscator的配置文件”WebCfg.xml”。 这里是用自己编写的工具,扫描CodeGameLogic.dll中的类型,得到不能被混淆的类型名和方法名,加入到配置文件的排出列表中。 如“三。 3”小节所示。
调用DotObfuscator对CodeGameLogic.dll执行混淆,得到混淆后的CodeGameLogic.dll:
将混淆后的CodeGameLogic.dll拷贝到项目中,然后构建项目。 这里要注意的是,如果是构建Web项目,需要将dll拷贝到Plugins目录。 如果是Standalone(即客户端)项目,直接拷贝到Assets目录下即可。 另外,这次构建是不可以有编译错误的,所以第1部需要移除Editor目录下的编辑器扩展的代码。
接下来将构建好的项目与资源合并,就可以得到完整的混淆版本。
总结:
Unity项目的代码反编译较为容易。 需要在重视代码混淆工作。
Unity项目的代码混淆方案实施起来限制较多。 本文介绍的方案是笔者知晓的目前唯一可用的混淆方案。 对项目的架构分层有强制性的要求。 最好是在项目初期就考虑如何对项目进行分层,将需要保护的内容放置在被混淆的层中。如何混淆代码和相关配置 项目发布之前混淆是必不可少的工作,混淆可以增加别人反编译阅读代码的难度,还可以缩小APK包。 使用步骤: 1、修改project.properties文件: Java代码 收藏代码 # To enable ProGuard to shrink and obfuscate your code, ment this (available properties: sdk.dir, user.home): # proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 去掉proguard.config一行前面的#注释; 2、配置proguard-project.txt文件: 这个是主配置文件,里面配置哪些需要混淆,哪些不需要混淆的选项; 提供给外部的类、方法、变量等名字不能混淆; 在AndroidManifest中配置的类(Activity、Service等的子类及Framework类默认不会进行混淆) 不混淆Parcelable的子类,防止android.os高分!如何还原网页代码混淆 xFF十六进制数规定的字符 范围00-FF
uFFFF 范围0000-FFFF
稍微处理一下就出来了:document.write("x44x4fx4dx43x6fx6ex74x65x6e
")
结果:DOMConten求教Java web项目一般怎样做代码混淆或加密 一、java web项目混淆
proguard4.8工具,说是支持war的,可混淆过后少了classes目录了,自然成功不了。 网上搜的过程不详说了,最后找着--“J2EE-web工程ProGuard代码混淆07_28”,网址:/link?url=CxToEqg5QWbz2_SYIxqJkpnsjOLf9K6BzJcCfVfmBB3TEvaRzFb4CRPKkZDz1K35s0XH2u6bdIJ2WfrE791v--cVqaImGKnLLLTO45u6uD_
根据提示一步步完成。
把web项目打成jar包后用proguard进行混淆,然后把混淆过后的class目录替换发布包war中的对应目录,启动运行是正常的。
主要注意利用proguard生成xxx.pro文件,然后手动加工-keep class WebRoot.WEB-INFO.lib.* 等项目中不需要混淆的包和类。
二、java web项目打成.exe
没找到免费的,这搜到个收费的--Jinstall,试了下功能挺好,
可以加密、集成jdk、tomcat,如果数据库是mysql也集成,其他数据库的话要设置数据库的url.
一般大厂都是通过首年才有可以享受爆款活动,然后吸引我们注册他们商家达到持续续费和购买的目的。一般只有大厂才能有这样的魄力和能力首年亏本,但是对于一般的公司和个人厂家确实难过,这几年确实看到不少的同类商家难以生存。这里我们可以看到有对应的套餐方案。不过这两个套餐都是100%CPU独享的,不是有某云商家限制CPU的。但是轻量服务器有个不好的就是带宽是较大且流量是限制的额,分别是1GB和1.2TB月流量...
pia云怎么样?pia云是一家2018的开办的国人商家,原名叫哔哔云,目前整合到了魔方云平台上,商家主要销售VPS服务,采用KVM虚拟架构 ,机房有美国洛杉矶、中国香港和深圳地区,洛杉矶为crea机房,三网回程CN2 GIA,带20G防御。目前,Pia云优惠促销,年付全场8折起,香港超极速CN2季付活动,4核4G15M云服务器仅240元/季起,香港CN2、美国三网CN2深圳BGP优质云服务器超高性...
819云互联 在本月发布了一个购买香港,日本独立服务器的活动,相对之前的首月活动性价比更高,最多只能享受1个月的活动 续费价格恢复原价 是有些颇高 这次819云互联与机房是合作伙伴 本次拿到机房 活动7天内购买独立服务器后期的长期续费价格 加大力度 确实来说这次的就可以买年付或者更长时间了…本次是5个机房可供选择,独立服务器最低默认是50M带宽,不限制流量,。官网:https://ww...
代码混淆为你推荐
可以访问违规网站的浏览器电脑上浏览器的重要权限有哪些,比如有可以访问系统文件之类的权限吗? 蓝屏代码windows 系统蓝屏代码多少? blastpblast 和bomb的区别 blastpblast是什么意思 blastpBLAST有什么用?为什么要BLAST? 电子听诊器听诊器有哪些用途的知识 wizardry哈利波特里的蛇院,狮院,獾院,鹰院. 分别指什么 阶乘函数C语言编写一个求n阶乘的函数,在主函数中输入n,调用函数求n阶乘。。谢谢 vrrp配置我准备做一个关于MSTP的配置,但是不知道如何去做,拓扑如下 软件群发我是做微商的需要经常群发一些图片给很多个群,有什么群发软件吗?
虚拟主机提供商 合租服务器 10t等于多少g 空间打开慢 外国空间 国内加速器 国外在线代理 150邮箱 52测评网 linux空间 双拼域名 中国网通测速 常州联通宽带 国外的代理服务器 万网空间 supercache 江苏徐州移动 后门 阵亡将士纪念日 黑科云 更多