引言
相信大家都不想自己的代码被人拿出去做一些商业化的行为,但是一时半会又没有一个有效的方法,这里我提供一点思路。
常用的钩子程序植入方式
方式 | 解释 | 使用难度 | 描述 |
植入通知程序(直接植入) | 使用APi调用接口形式通知远程服务端程序,告知代码被部署了 | 最简单 | 直接在源码里 |
源代码内植入通知程序 (使用pom依赖) | 使用APi调用接口形式通知远程服务端程序,告知代码被部署了 | 较难 | 把通知程序再隐藏一层,到jar层面 |
源代码内植入通知程序 (使用pom依赖基础上加密混淆源代码) | 使用APi调用接口形式通知远程服务端程序,告知代码被部署了 | 最难 | 这种一般在方式二的基础上写好钩子程序,会请专业的安全团队来扫描,确保无法发现(可以发散一下思维-市场上有些开源源码为什么有个协议不可商用) |
钩子程序,以maven项目为例子
第一步引入pom依赖
<!-- httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.5</version> </dependency>
第二步编写通知程序
public static void authentication() { try { // 通知地址 String url=""; String osName = System.getProperty("os.name"); //需要通知上传的数据,自定义即可 Map<String, String> map = new HashMap<>(); map.put("osName", osName); try (CloseableHttpClient client = HttpClients.createDefault()) { HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "application/json"); httpPost.setEntity(new StringEntity(map.toString())); HttpResponse response = client.execute(httpPost); HttpEntity entity = response.getEntity(); BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); String line; StringBuilder responseContent = new StringBuilder(); while ((line = reader.readLine()) != null) { responseContent.append(line); } } } catch (Exception ex) { } }
- 钩子程序一般需要配合部署一个第三方监控程序,用来接收通知,并且报警通知指定人员(这里不展开)