‘壹’ 反编译违法吗
法律分析:不违法。反编译不违法。反编译是指计算机软件反向工程也称为计算机软件还原工程,是指通过对他人软件的目标程序(可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。
法律依据:《计算机软件保护条例》 第三条 本条例下列用语的含义:
(一)计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序和目标程序为同一作品。
(二)文档,是指用来描述程序的内容、组成、设计、功能规格、开发情况、测试结果及使用方法的文字资料和图表等,如程序设计说明书、流程图、用户手册等。
(三)软件开发者,是指实际组织开发、直接进行开发,并对开发完成的软件承担责任的法人或者其他组织;或者依靠自己具有的条件独立完成软件开发,并对软件承担责任的自然人。
(四)软件着作权人,是指依照本条例的规定,对软件享有着作权的自然人、法人或者其他组织。
‘贰’ 重写全部源代码实现同样功能界面的软件算侵权吗
这本身是不侵权的,QQ当时就是抄袭ICQ的功能的。
但是,如果该程序里面用到了一些思想或逻辑,已经被申请了专利,则会构成侵权
‘叁’ 如何防止程序员反编译
java从诞生以来,其基因就是开放精神,也正因此,其可以得到广泛爱好者的支持和奉献,最终很快发展壮大,以至于有今天之风光!但随着java的应用领域越来越广,特别是一些功能要发布到终端用户手中(如android开发的app),有时候,公司为了商业技术的保密考虑,不希望这里面的一些核心代码能够被人破解(破解之后,甚至可以被简单改改就发布出去,说严重点,就可能会扰乱公司的正常软件的市场行为),这时候就要求这些java代码不能够被反编译。
这里要先说一下反编译的现象。因为java一直秉持着开放共享的理念,所以大家也都知道,我们一般共享一个自己写的jar包时,同时会共享一个对应的source包。但这些依然与反编译没有什么关系,但java的共享理念,不只是建议我们这样做,而且它自己也在底层上“强迫”我们这么做!在java写的.java文件后,使用javac编译成class文件,在编译的过程,不像C/C++或C#那样编译时进行加密或混淆,它是直接对其进行符号化、标记化的编译处理,于是,也产生了一个逆向工程的问题:可以根据class文件反向解析成原来的java文件!这就是反编译的由来。
但很多时候,有些公司出于如上述的原因考虑时,真的不希望自己写的代码被别人反编译,尤其是那些收费的app或桌面软件(甚至还有一些j2ee的wen项目)!这时候,防止反编译就成了必然!但前面也说过了,因为开放理念的原因,class是可以被反编译的,那现在有这样的需求之后,有哪些方式可以做到防止反编译呢?经过研究java源代码并进行了一些技术实现(结果发现,以前都有人想到过,所以在对应章节的时候,我会贴出一些写得比较细的文章,而我就简单阐述一下,也算偷个懒吧),我总共整理出以下这几种方式:
代码混淆
这种方式的做法正如其名,是把代码打乱,并掺入一些随机或特殊的字符,让代码的可读性大大降低,“曲线救国”似的达到所谓的加密。其实,其本质就是打乱代码的顺序、将各类符号(如类名、方法名、属性名)进行随机或乱命名,使其无意义,让人读代码时很累,进而让人乍一看,以为这些代码是加过密的!
由其实现方式上可知,其实现原理只是扰乱正常的代码可读性,并不是真正的加密,如果一个人的耐心很好,依然可以理出整个程序在做什么,更何况,一个应用中,其核心代码才是人们想去了解的,所以大大缩小了代码阅读的范围!
当然,这种方式的存在,而且还比较流行,其原因在于,基本能防范一些技术人员进行反编译(比如说我,让我破解一个混淆的代码,我宁愿自己重写一个了)!而且其实现较为简单,对项目的代码又无开发上的侵入性。目前业界也有较多这类工具,有商用的,也有免费的,目前比较流行的免费的是:proguard(我现象临时用的就是这个)。
上面说了,这种方式其实并不是真正加密代码,其实代码还是能够被人反编译(有人可能说,使用proguard中的optimize选项,可以从字节流层面更改代码,甚至可以让JD这些反编译软件可以无法得到内容。说得有点道理,但有两个问题:1、使用optimize对JDK及环境要求较高,容易造成混淆后的代码无法正常运行;2、这种方式其实还是混淆,JD反编译有点问题,可以有更强悍的工具,矛盾哲学在哪儿都是存在的^_^)。那如何能做到我的class代码无法被人反编译呢?那就需要我们下面的“加密class”!
加密class
在说加密class之前,我们要先了解一些java的基本概念,如:ClassLoader。做java的人已经或者以后会知道,java程序的运行,是类中的逻辑在JVM中运行,而类又是怎么加载到JVM中的呢(JVM内幕之类的,不在本文中阐述,所以点到为止)?答案是:ClassLoader。JVM在启动时是如何初始化整个环境的,有哪些ClassLoader及作用是什么,大家可以自己问度娘,也不在本文中讨论。
让我们从最常见的代码开始,揭开一下ClassLoader的一点点面纱!看下面的代码:
Java代码
publicclassDemo{
publicstaticvoidmain(String[]args){
System.out.println(“helloworld!”);
}
}
上面这段代码,大家都认识。但我要问的是:如果我们使用javac对其进行编译,然后使用java使其运行(为什么不在Eclipse中使用Runas功能呢?因为Eclipse帮我们封闭,从而简化了太多东西,使我们忽略了太多的底层细节,只有从原始的操作上,我们才能看到本质),那么,它是怎么加载到JVM中的?答案是:通过AppClassLoader加载的(相关知识点可以参考:http://hxraid.iteye.com/blog/747625)!如果不相信的话,可以输出一下System.out.println(Thread.currentThrea().getContextLoader());看看。
那又有一个新的问题产生了:ClassLoader又是怎样加载class的呢?其实,AppClassLoader继承自java.lang.ClassLoader类,所以,基本操作都在这个类里面,让我们直接看下面这段核心代码吧:
看到这里,已经没有必要再往下面看了(再往下就是native方法了,这是一个重大伏笔哦),我们要做的手脚就在这里!
手脚怎么做呢?很简单,上面的代码逻辑告诉我们,ClassLoader只是拿到class文件中的内容byte[],然后交给JVM初始化!于是我们的逻辑就简单了:只要在交给JVM时是正确的class文件就行了,在这之前是什么样子无所谓!所以,我们的加密的整个逻辑就是:
在编译代码时(如使用ant或maven),使用插件将代码进行加密(加密方式自己选),将class文件里面的内容读取成byte[],然后进行加密后再写回到class文件(这时候class文件里面的内容不是标准的class,无法被反编译了)
在启动项目代码时,指定使用我们自定义的ClassLoader就行了,而自定义的部分,主要就是在这里做解密工作!
如此,搞定!以上的做法比较完整的阐述,可以仔细阅读一下这篇文章:https://www.ddtsoft.com/#developerworks/cn/java/l-secureclass/文章中的介绍。
通过这个方法貌似可以解决代码反编译的问题了!错!这里有一个巨大的坑!因为我们自定义的ClassLoader是不能加密的,要不然JVM不认识,就全歇菜了!如果我来反编译,呵呵,我只要反编译一下这个自定义的ClassLoader,然后把里面解密后的内容写到指定的文件中保存下来,再把这个加了逻辑的自定义ClassLoader放回去运行,你猜结果会怎样?没错,你会想死!因为你好不容易想出来的加密算法,结果人家根本不需要破解,直接就绕过去了!
现在,让我们总结一下这个方法的优缺点:实现方式简单有效,同时对代码几乎没有侵入性,不影响正常开发与发布。缺点也很明显,就是很容易被人破解!
当然啦,关于缺点问题,你也可以这么干:先对所有代码进行混淆、再进行加密,保证:1、不容易找到我们自定义的那个ClassLoader;2、就算找到了,破解了,代码可读性还是很差,让你看得吐血!(有一篇文章,我觉得写得不错,大家可以看一看:http://www.scjgcj.com/#blog/851544)
嗯,我觉得这个方法很好,我自己也差点被这个想法感动了,但是,作为一个严谨的程序员,我真的不愿意留下一个隐患在这里!所以,我继续思索!
高级加密class
前面我们说过有个伏笔来着,还记得吧?没错,就是那个native!native定义的方法是什么方法?就是我们传说中的JNI调用!前面介绍过的有一篇文章中提到过,其实jvm的真实身份并不是java,而是c++写的jvm.dll(windows版本下),java与dll文件的调用就是通过JNI实现的!于是,我们就可以这样想:JNI可以调用第三方语言的类库,那么,我们可不可以把解密与装载使用第三方语言写(如C++,因为它们生成的库是不好反编译的),这样它可以把解密出来的class内容直接调jvm.dll的加载接口进行初始化成class,再返回给我们的ClassLoader?这样,我们自定义的ClassLoader只要使用JNI调用这个第三方语言写的组件,整个解密过程,都在黑盒中进行,别人就无从破解了!
嗯,这个方法真的很不错的!但也有两个小问题:1.使用第三方语言写,得会第三方语言,我说的会,是指很溜!2.对于不同的操作系统,甚至同一操作系统不同的版本,都可能要有差异化的代码生成对应环境下的组件(如window下是exe,linux是so等)!如果你不在乎这两个问题,我觉得,这个方式真的挺不错的。但对于我来说,我的信条是,越复杂的方式越容易出错!我个人比较崇尚简洁的美,所以,这个方法我不会轻易使用!
对了,如果大家觉得这个方法还算可行的话,可以推荐一个我无意中看到的东西给大家看看(我都没有用过的):jinstall,
更改JVM
看到这个标题,我想你可能会震惊。是的,你没看错,做为一个程序员,是应该要具有怀疑一切、敢想敢做的信念。如果你有意留心的话,你会发现JVM版本在业界其实也有好几个版本的,如:Sun公司的、IBM的、Apache的、Google的……
所以,不要阻碍自己的想象力,现在没有这个能力,并不代表不可能。所以,我想到,如果我把jvm改了,在里面对加载的类进行解密,那不就可以了吗?我在设计构思过程中,突然发现:人老了就是容易糊涂!前面使用第三方语言实现解密的两个问题,正好也是更改JVM要面对的两个问题,而且还有一个更大的问题:这个JVM就得跟着这个项目到处走啊!
‘肆’ 请问我将一个软件用不同的计算机语言重写,算侵权吗
算的,如果那个软件已经发表注册了,你这样的做法是侵权的,根据《计算机软件保护条例》第二十三条第五项的规定:未经软件着作权人许可,修改、翻译其软件的,除《中华人民共和国着作权法》或者本条例另有规定外,应当根据情况,承担停止侵害、消除影响、赔礼道歉、赔偿损失等民事责任。
当然,如果你这样做是符合着作权法规定的例外情况,例如:为个人学习研究而用的,不涉及第三人。。。就除外不算侵权
另外还有,《计算机软件保护条例》第二十九条规定: 软件开发者开发的软件,由于可供选用的表达方式有限而与已经存在的软件相似的,不构成对已经存在的软件的着作权的侵犯。
但是依你上面的说法看,应该不属于此条范围内,所以你这种说法应该是属于侵权的。。。
‘伍’ 反编译是什么意思
高级语言源程序经过
编译
变成可执行文件,反编译就是逆过程。
但是通常不能把可执行文件变成高级语言源代码,只能转换成汇编程序。
好比android系统的apk程序文件包,可以用apktool之类的的工具进行反编译,可以得到class代码文件和source资源文件。
一般反编译只适用于高级语言,低级语言,好比汇编等语言,比较难。
‘陆’ 反编译是违法的吗
反编译是违法的,反编译是指计算机软件反向工程( Revers e engineering )也称为计算机软件还原工程,是指通过对他人软件的目标程序(可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。反编译作为自己开发软件时的参考,或者直接用于自己的软件产品中。
根据《共和国着作权法》规定有下列侵权行为的,应当根据情况,承担停止侵害、消除影响、赔礼道歉、赔偿损失等民事责任:
(一)未经软件着作权人许可,发表或者登记其软件的;
(二)将他人软件作为自己的软件发表或者登记的;
(三)未经合作者许可,将与他人合作开发的软件作为自己单独完成的软件发表或者登记的;
(四)在他人软件上署名或者更改他人软件上的署名的;
(五)未经软件着作权人许可,修改、翻译其软件的;
(六)其他侵犯软件着作权的行为。
‘柒’ 从同学那里拷贝一份应用软件安装到自己的电脑上属于侵犯着作权吗
一般情况下,以下几种情况不构成侵犯着作权。
一、安装的不是破解软件,用的是原版软件,未进行修改和反编译。
二、进行了修改或反编译,但是只是用于学习和研究,未用于商业目的。
‘捌’ 破解软件是犯法的吗
破解软件是违法行为
第二十三条除《中华人民共和国着作权法》或者本条例另有规定外,有下列侵权行为的,应当根据情况,承担停止侵害、消除影响、赔礼道歉、赔偿损失等民事责任:(一)未经软件着作权人许可,发表或者登记其软件的;
(二)将他人软件作为自己的软件发表或者登记的;
(三)未经合作者许可,将与他人合作开发的软件作为自己单独完成的软件发表或者登记的;
(四)在他人软件上署名或者更改他人软件上的署名的;
(五)未经软件着作权人许可,修改、翻译其软件的;
(六)其他侵犯软件着作权的行为。
(8)反编译软件并全部重写侵权吗扩展阅读:
破解软件案例:
当前,通过购票软件、OTA(在线旅行社)网站预定火车票,已成为很多消费者的习惯。然而,网页上以默认勾选的方式,将租车、酒店优惠、快速退改签服务、交通意外险等五花八门的附加项目与火车票、飞机票进行捆绑销售,
是普遍存在的现象。春运期间抢票环节争分夺秒,消费者如果没有留意这些隐蔽搭售产品而主动取消的话,订单金额将比票面价格多出20~40元不等,在不经意间多花钱。
从法律的角度看,无论购票软件的套路有多深,其实质都是经营者以隐蔽方式,搭售消费者不愿意或不需要购买的商品或服务,这种行为侵害了消费者的合法权益。
首先,“花式”搭售违反了合同法中的平等自愿、诚实信用原则。购票软件的搭售方式一般是在网页的隐蔽位置默认勾选,除非消费者主动点击取消,否则达成购买。这一做法有故意误导消费者之嫌,违背消费者作为缔约方享有缔约自由的意愿,
利用消费者急于付款买票的心理搭售产品,有违平等自愿、诚实信用原则。
其次,“花式”搭售违反了《消费者权益保护法》的诸多规定,侵犯了消费者合法权益。《消费者权益保护法》规定,消费者享有知悉其购买、使用的商品或者接受的服务的真实情况的权利。但默认搭售行为,
使得消费者对所购产品或服务的真实情况并不知情,没意识到自己在购票的同时还购买了附加服务项目,其知情权被侵犯。
再次,侵犯了消费者的自主选择权。《消费者权益保护法》规定,消费者享有自主选择商品或者服务的权利。这意味着消费者有权选择买或者不买、向谁购买某种产品或服务,并且通过货比三家选出最适合自己的一种。
而OTA网站默认勾选了附加套餐并置于页面隐蔽位置,使消费者很难注意到,更无从比较、选择附加套餐的具体内容,一旦付款完成,只能被动接受所搭售的产品,消费者的自主选择权事实上被剥夺。
最后,侵犯了消费者的公平交易权。《消费者权益保护法》规定,消费者享有公平交易的权利。OTA网站的默认搭售行为,违背消费者的真实意愿,强制消费者购买商家指定的产品或服务,侵犯其公平交易权。
此外,购票软件搭售保险的行为也涉嫌违法。目前OTA网站搭售的保险主要有两种:交通意外险和延迟出票险。对于前者,《消费者权益保护法》规定使用格式条款的经营者应当履行说明义务。然而在默认勾选搭售保险的情况下,
商家显然未尽到对该保险的理赔内容、保险责任等进行说明的义务。对于后者,商家涉嫌变相收费、破坏购票秩序,违背了公平交易的原则。一是火车票是由政府定价、具有公共利益属性的产品,作为一种有限资源,火车票的分配应当具有普惠性,
并非出价高者得票。如果消费者花30元购买极速出票服务,真的能够更早抢到车票,意味着他多花钱可以“插队”,
侵犯了其他消费者购票的合法权益,无形中还推高了票价。二是2006年国家就发布了《关于依法查处代售代办铁路客票非法加价和倒卖铁路客票违法犯罪活动的通知》,其中明确规定铁路客票销售服务费5元封顶,禁止加价或变相收费。
面对“花式”搭售,需要社会共治。一方面,监管部门应当积极作为,加大执法监督力度,依法整治,明确要求OTA网站诚实守信,明码标价,禁止默认搭售,规范OTA网站的售票行为。另一方面,各OTA网站也应当认识到,欺瞒、误导消费者只能逞一时之快,
尊重消费者的合法权益,营造和谐良好的交易氛围,才是企业的长久之道。同时,消费者也需要提高法律和维权意识,谨慎识别各类“花式”搭售。
参考资料来源:光明网-购票软件“花式”搭售侵犯消费者权益