本发明涉及java源代码安全领域,特别涉及一种让java程序可以安全运行,不会被反编译以窃取源码的方法设计。
背景技术:
java是一种面向对象编程的高级语言,活跃的apache社区拥有最完善的技术框架,其高效、开源、易维护等特性成为大多项目的最佳选择。但也因为java程序包容易被反编译的问题,许多非开源的商业软件在上线后被黑客恶意反编译,获取到源码后进行盗版使用,极大损害了软件开发者的利益,在源代码保护要求较高的项目中不占优势。
如何保证java源码不被窃取,传统实现分两种方式。
第一种方案,给java代码编译后得到class文件进行加密,客户获取的是一个密文的可执行jar文件包,这样就能防止反编译工具反编译class文件。此方案并非绝对安全,由于是一个密文的jar文件包,那么客户需要运行程序,必须得到对应的解密密码,获取密码有两种方式:
(1)把密码隐藏在jar文件包里面的一个类加载器中,当客户运行jar文件时,类加载器解密class文件得出正确的字节流,再生成类对象。
(2)在方案(1)上继续改进,将密码存放在远程服务器上,当类加载器运行时从远程服务上下载密码进行解密。
以上两种方案,都可以对类加载器进行反编译或者重写截获密码,一旦获取到密码,便可以对整个jar文件进行反编译得到源代码。
第二个方案是对jar文件进行代码混肴,此方案并没有对防止反编译起到任何作用,相反此方案可以允许被反编译,只是反编译出来的源代码是混乱的,不容易读懂,但是对于资深的技术专家也可以轻松通过重构获取源代码。
以上的两种方案虽然能在一定程度上阻碍了反编译操作,但对于技术专家或者黑客仍然没有一点效果。
因此本发明提出一种防止java程序被反编译的方法,让java程序可以安全地运行,同时保护程序的源代码不被其他人窃取。
技术实现要素:
本发明提出一种防止java程序被反编译的方法,主要解决javaclass文件被反编译导致源代码泄露的问题。
本发明的方法步骤如下:
(1)需要运行软件一方作为客户端,软件的可执行文件如jar包、class文件等保存在服务端;
(2)客户端启动后向服务端发送程序启动请求,服务端生成类加载器实例并返回给客户端;
(3)客户端启动类加载器,并激活类加载器中的反反编译程序,进行反编译工具检查与禁用,例如:
(3a)禁用jvm(javavirtualmachine,java虚拟机)内存监控,防止通过恶意拷贝内存文件方式获取可执行文件进行反编译;
(3b)禁止反编译工具运行;
(3c)解析客户端程序是否被恶意改写或存在恶意代码,若有则中断客户端的启动;
(4)客户端向服务端发送获取密码请求,该密码用于解密可执行文件,为一次性临时密码,由服务端生成;
(5)服务端向客户端发送随机跳转类goto-n,该跳转类可能指向下一个跳转类,也可能包含用于解密可执行文件的密码;
(6)客户端接收跳转类,若该跳转类指向下一个跳转类,则继续向客户端发送跳转请求并重复步骤(5),若该跳转类包含密码数据,则进入下一步;
(7)客户端获取到密码后,向服务端发送执行文件获取请求,服务端返回使用密码加密后的可执行文件;
(8)客户端将获取到的可执行文件解密,并通过类加载器加载到jvm运行,程序启动完毕。
进一步地,所述步骤(4)中的临时密码,每次客户端启动后服务端都将生成新的临时密码,该密码只可被一个客户端使用一次,一旦被使用,立即失效,不同客户端之间不可进行密码共享。
进一步地,服务端在可执行文件发送完毕后或客户端启动成功后销毁临时密码,保证密码仅使用一次。
进一步地,所述步骤(5)中,服务端为每个客户端每次启动请求生成的跳转链长度和顺序都是不固定的。即服务端向客户端发送跳转类的次数不定,每个跳转类有可能指向新的跳转类或直接返回密码,若指向新的跳转类,则每个跳转类具体的指向对象也不固定。例如,在某实施例中,可能存在跳转顺序为goto-1跳转至goto-7跳转至goto-3然后返回密码,也可能存在跳转顺序为goto-7跳转至goto-2然后返回密码。
本发明提出一种防止java程序被反编译的方法,使得客户端的jvm成为安全黑盒,class文件存放在服务端,保证源代码的安全,黑客无法对其进行反编译。本发明提出的方法能够有效的解决java程序可能存在的源代码反编译和源代码泄露问题,保证了程序开发者的合法权益。
附图说明
图1为本发明提出的一种防止java程序被反编译的方法流程示意图;
图2为本发明实施例中客户端和服务端的简化交互示意图。
具体实施案例
在以下的叙述中,为了使读者更好的理解
本技术:
而提出了许多技术细节,但是,本领域的普通技术人员可以理解,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也是本申请各权利要求所要求保护的技术方案。
为使本发明的目的、技术方案和优点更加清楚,下面将对本发明的实施方式作进一步地详细描述。
如图2一种典型的客户端/服务端架构模式,java编译好的字节码class被存放在服务端,当有需要的时候客户端会进行远程加载并运行。加载过程中服务端向客户端传送密文的class文件和密码,一个服务端可以同时服务于多个客户端,每个客户端可以运行在物联网上任何地方。
流程如下:
(1)服务端进行初始化,缓存好需要的提供用于下载的class,并封装;
(2)客户端启动程序,开始向服务端申请远程代码,服务端返回一个类加载器,该加载器不仅仅用于远程加载代码,还嵌入了反反编译代码、反后门代码等;
(3)反反编译代码运行,检测运行环境是否包含反编译代码和工具,扫描检测是否包含后门程序窃取源码。如果包含其中一项则立即结束程序运行;
(4)客户端和服务端进入跳转链阶段,该阶段是为了迷惑黑客使用程序代理类加载器骗取密码,所以跳转链被设置成不规律的且程度不固定的多个跳转类,直到最后才能获取真正的密码并交付给客户端;
(5)当步骤(4)顺利完成后此时类加载器已经成功获取了本次远程加载的密码,可以开始进行远程代码加载,服务端会返回一个使用了密码加密后的class文件包,客户端的类加载器获取后使用密码进行解密,再加载到jvm中运行;
(6)完成以上全部步骤后服务端销毁本地存储的密码,并且此时中内存中已经存在可运行的class,客户端可正常运行。
1.一种防止java程序被反编译的方法,其步骤为:
(1)需要运行软件一方作为客户端,软件的可执行文件保存在服务端;
(2)客户端启动后向服务端发送程序启动请求,服务端生成类加载器实例并返回给客户端;
(3)客户端启动类加载器,并激活类加载器中的反反编译程序,进行反编译工具检查与禁用;
(4)客户端向服务端发送获取密码请求,该密码用于解密可执行文件;
(5)服务端向客户端发送随机跳转类,该跳转类可能指向下一个跳转类,形成跳转链,也可能包含用于解密可执行文件的密码;
(6)客户端接收跳转类,若该跳转类指向下一个跳转类,则继续向客户端发送跳转请求并重复步骤(5),若该跳转类包含密码数据,则进入下一步;
(7)客户端获取到密码后,向服务端发送执行文件获取请求,服务端返回使用密码加密后的可执行文件;
(8)客户端将获取到的可执行文件解密,并通过类加载器加载到jvm运行,程序启动完毕。
2.根据权利要求书1所述一种防止java程序被反编译的方法,其特征为,每次客户端启动后服务端都将生成新的密码,服务端在可执行文件发送完毕后或客户端启动成功后销毁临时密码,保证密码仅使用一次。
3.根据权利要求书1所述一种防止java程序被反编译的方法,其特征为,服务端为每个客户端每次启动请求生成的跳转链长度和顺序都是不固定的。