山那边是海 发表于 2015-1-16 23:15:22

ASP网页编程之含混:让你的代码阔别窃看之眼

写软件都是想的时间比写的时间要长的.如果反过来了就得看看是什么原因了.另外大家可以回去问问公司里的小MM.(一般企业里,跟你们交付软件接触得最多的是她们)我们晓得,Java编译源程序失掉的是字节码,VS.NET编译源程序失掉的是MSIL(Microsoft两头言语),这类编译体例称为“不完整编译”,出格简单被反编译或实行反向工程。与本机代码分歧,不完整编译失掉的两头代码完全地保存了变量、历程称号,从而使反编译失掉的程序几近与原始程序完整一样,只短少原始程序的正文,其他内容差未几能够一成不变地复原出来。

  关于商品软件的开辟者,高质量的反编译代码带来了很年夜的风险:算法大概被夺取和改革,程序代码大概被复制和变动。(即便单元外部利用的非商品软件,因为反编译酿成的源代码泄露也带来很年夜的威逼。比方,用户将很简单看到会见数据库的暗码或程序嵌进的SQL命令。一样地,利用外单元托管服务器的网站也面对风险,一旦上载了ASP.NET使用的代码,托管单元的人便可能随便检察和变动程序代码)。

  更让人忧虑的是,如今黑客或猎奇的用户可以便利地失掉各类反向工程工具。Microsoft自己就收费供应了一个MSIL反汇编器,称为ILDASM;这里有一个源代码开放的.NET反编译工具Anakrino;固然,另有其他很多厂商供应了商品化的反向工程工具。

  1、修正变量称号

  为避免这类反向工程的威逼,最无效的举措是含混。(据《美国传统辞典》,“含混”的意义是“使凌乱,使懵懂利诱,使过于凌乱或含混,使得难于感到或了解”)。含混工具使用各类手腕到达这一方针,但次要的路子是让变量名字不再具有唆使其感化的才能、加密字符串和笔墨、拔出各类棍骗指令使反编译失掉的代码不成再编译。

  一个行将公布的VisualStudio版本(称为VS.NET2003,代码称号Everett)将集成一个含混工具,Microsoft倡议用这个工具对.NET两头代码举行最初的处置。这个含混器是另外一个工具Dotfuscator的所谓Lite版。由PreemptiveSolutions公司出品的Dotfuscator功效更壮大,这家位于美国俄亥俄州西南部克利夫兰的公司最后开辟Java代码的含混手艺。Dotfuscator含混器使用一系列出色的手艺使反向工程白费无功,大概最少说使得反向工程很难举行。

  PreemptiveSolutions公司给它修正两头代码中变量称号的专利手艺取了一个叫“超载感到”(Overloadinduction)的称号,VS.NET2003带来的Lite版只要这类含混功效。(含混器永久不会修改原始的源代码,乃至基本不必要用源代码作为参考。)这类手艺充实使用了VS.NET代码的特性:统一个标识符可同时使用于具有分歧特性的类和办法;在分歧的称号空间中,变量能够有不异的名字而不会抵触。

  Dotfuscator充实使用VS.NET这些标记学上的特性,把尽量多的标记改成字母“A”。据该公司说,某些代码约莫有33%的援用能够改成“A”,另有10%能够改成“B”。经由含混器这一处置,反向工程失掉的代码将很难了解。上面来看一个例子。

  对未经含混处置的代码实行反向工程:

privatevoidCalcPayroll(SpecialListemployeeGroup){
while(employeeGroup.HasMore()){
employee=employeeGroup.GetNext(true);
employee.updateSalary();
DistributeCheck(employee);
}
}



  一样的代码,经由含混处置再实行反向工程:

privatevoida(ab){
while(b.a()){
a=b.a(true);
a.a();
a(a);
}
}



  明显,两段代码的处置逻辑不异。可是,要说分明第二段代码究竟在做些甚么极为坚苦,乃至要判别它正在会见哪些办法、哪些变量也很坚苦。

  这类改动变量称号的功效是可设置的,比方,假定你正在机关一个DLL,能够请求不修改API。风趣的是,这一处置历程明显只是复杂地把大批变量的称号简缩成单个字符,但取得了十分好的含混效果。

  2、加密字符串

  字符串加密凑合另外一个平安成绩,实在这一平安成绩在本机代码中也一样存在――从二进制代码提取字符和笔墨是一件很复杂的事变。比方,用UNIX的strings工具处置任何二进制文件,能够敏捷失掉该二进制文件包括的ASCII文本清单。

  在最复杂的情况下,这个清单只会保守版权信息和二进制实行文件援用了哪些库。可是,假如程序要会见数据库,这个清单将包括一切的SQL命令;假如代码模块中嵌进了暗码,暗码也将不密。

  关于两头代码,未加密的字符串还会带来一层分外的风险。黑客们经由过程剖析对特定字符串的援用,能够判别出从那里入手下手代码遭到暗码回护,然后加上补钉使代码绕过暗码考证部分。

  为懂得决字符串明文带来的平安成绩,年夜多半含混器使用了加密字符串的手艺。因为解密操纵必要必定的开支,以是运转时会见字符串的功能一定会有所下降。风趣的是,在这方面本机代码反而不占廉价,由于假如要到达一样的效果,关于本机代码开辟者必需手工加密息争密每一个字符串,而关于两头代码这些事情却能够由含混器代庖。

  3、埋没实行流程

  把持流程含混是一种用来误导反编译器的手艺,它在原始的代码中拔出很多goto指令,固然程序终极实行的指令序列仍跟本来的一样,但太多的“迂回举措”使得剖析程序实践的逻辑流程十分坚苦。上面来看一个例子。

  对没有经由把持流程含混处置的两头代码实行反向工程:

publicintCompareTo(Objecto){
intn=occurrences-((WordOccurrence)o).occurrences;
if(n==0){
n=String.Compare(word,((WordOccurrence)o).word;
}
return(n);
}



  一样的代码,经由把持流程含混处置后再实行反向工程:

publicvirtualinta(objectA_0){
intlocal0;
intlocal1;

local0=this.a-(c)A_0.a;
if(local0!=0)
gotoi0;
gotoi1;
while(true){
returnlocal1;
i0:local1=local0;
}
i1:local0=System.String.Compare(this.b,(c)A_0.b);
gotoi0;
}



  能够看到,经由把持流程含混处置后,代码被拔出了一个伪前提检测语句,接着又实行了一个goto指令。在goto的目标地,本来的语句(以经由含混处置后的情势)被实行,接着又是一个goto语句将把持转到本来的逻辑流程分支。注重while()轮回未被实行,它只是起到一种误导的感化。这个代码片段很小,即便没有原始的代码可供对照和参考,辨认出程序实践流程的大概性仍存在。但是,关于一个范围较年夜的历程,假如没有源代码可供参考,那些专门用来混淆程序一般实行流程的指令将使剖析代码的人疲于奔命,终极不能不保持。

  也就是说,这类含混处置的基本头脑是让恢回复始代码变得极为坚苦,迫使黑客改动主张,大概是换做轻松一点的,比方“本人写代码算了”。

  对把持流程举行含混处置要在二进制文件中拔出一些代码,因此增添了一些运转工夫开支。假如代码对运转工夫的请求十分刻薄,能够只给那些出格主要的部分加上这一层分外的回护。

  含混器和反编译器年夜展播:

  ▲含混器:

  LSWDotNetILObfuscator

  Demeanorfor.NET

  Salamander.NETObfuscator

  dotfuscator

  Aspose.Obfuscator

  .NETIL-Obfuscator

  Deploy.NET

  Salamander.NETProtector

  Thinstall

  XenoCode

  ▲反编译器:

  Salamander.NETDecompiler

  Exemplar/Anakrino

1:18|批评(1)


</p>问题是他们究竟是喜欢他们是使用软件时,速度快还是速度慢好.(当然在3秒以内).无论是他们输入资料时,查找资料时,分析资料时.

活着的死人 发表于 2015-1-20 08:42:57

我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。

小妖女 发表于 2015-1-24 15:33:59

代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。

山那边是海 发表于 2015-2-1 20:47:27

我可以结合自己的经验大致给你说一说,希望对你有所帮助,少走些弯路。

兰色精灵 发表于 2015-2-7 15:00:30

以HTML语言整合(HTML负责界面上,ASP则负责功能上)形成一个B/S(浏览器/服务器)模式的网页程序。

若天明 发表于 2015-2-22 08:21:43

它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。

因胸联盟 发表于 2015-3-6 23:40:49

我想问如何掌握学习节奏(先学什么再学什么)最好详细点?

精灵巫婆 发表于 2015-3-13 22:37:06

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp),它可以看作是VC和Java的混合体吧。

分手快乐 发表于 2015-3-20 20:55:59

下载一个源代码,然后再下载一个VBScript帮助,在源代码中遇到不认识的函数或是其他什么程序,都可以查帮助进行解决,这样学习效率很高。
页: [1]
查看完整版本: ASP网页编程之含混:让你的代码阔别窃看之眼