源代码如何注入钩子

简介: 源代码如何注入钩子

引言

相信大家都不想自己的代码被人拿出去做一些商业化的行为,但是一时半会又没有一个有效的方法,这里我提供一点思路。

常用的钩子程序植入方式

方式 解释 使用难度 描述
植入通知程序(直接植入) 使用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) {

        }
    }
  • 钩子程序一般需要配合部署一个第三方监控程序,用来接收通知,并且报警通知指定人员(这里不展开)
相关文章
|
5天前
|
存储 调度
【源码&库】 Vue3 的依赖收集和依赖触发是如何工作的
【源码&库】 Vue3 的依赖收集和依赖触发是如何工作的
64 0
|
5月前
|
Python
关于SSTI模块注入的常见绕过方法
关于SSTI模块注入的常见绕过方法
85 0
|
8月前
|
Windows
3.4 DLL注入:全局消息钩子注入
SetWindowHookEx 是`Windows`系统的一个函数,可用于让一个应用程序安装全局钩子,但读者需要格外注意该方法安装的钩子会由操作系统注入到所有可执行进程内,虽然该注入方式可以用于绕过游戏保护实现注入,但由于其属于全局注入所以所有的进程都会受到影响,而如果想要解决这个问题,则需要在`DllMain()`也就是动态链接库开头位置进行判断,如果是我们所需操作的进程则执行该DLL模块内的功能,如果不是则自动跳过不执行任何操作即可实现指定进程的注入方式。
66 0
|
10月前
|
JavaScript 前端开发
FastAdmin中RequireJs是如何调用的
FastAdmin中RequireJs是如何调用的
272 0
|
11月前
VC 不同版本代码注入的区别
VC 不同版本代码注入的区别
40 0
|
11月前
VC 不同版本代码注入的改进
在上篇文章中 《VC 不同版本代码注入的区别》 ,我们想要对目标进程进行代码的注入,由于 Debug 版编译生成的代码和 Release 版编译生成的代码有些不同(Debug 版编译后,调用函数时会有一条 jmp 指令,而 Release 没有),因此,通过 #ifdef 这样的宏来区别 VC 是以 Debug 版方式编译,还是通过 Release 版方式编译,从而编译不同的代码来针对不同的版本进行了处理。
56 0
|
Shell 数据安全/隐私保护 iOS开发
代码注入(11)
代码注入(11)
126 0
|
自然语言处理 JavaScript 前端开发
JS中的依赖注入 — 在测试中未使用过的最佳工具
让我来为大家介绍在测试中最好的朋友。
JS中的依赖注入 — 在测试中未使用过的最佳工具
【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中找到要拦截的方法 )
【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中找到要拦截的方法 )
134 0