Linux部署jar包,隐藏命令行参数

news2024/9/24 19:23:44

Linux部署jar包,隐藏命令行参数

  • 一、背景需求
  • 二、查阅资料
  • 三、实现隐藏库
      • 3.1、测试test.c
      • 3.2、设置隐藏库
      • 3.3、验证
  • 四、应用jar启动命令
  • 五、直接应用结果

最新项目安全检测,发现配置文件中数据库密码,redis密码仍处理明文状态
于是整理了一篇:SpringBoot集成jasypt,加密yml配置文件:https://blog.csdn.net/qq_38254635/article/details/132026841
过程比较曲折,一直报错:Failed to bind properties under ‘spring.datasource.password‘ to java.lang.String
于是整理了一篇:https://blog.csdn.net/qq_38254635/article/details/132027639

所有都配置好了,发现一个致命问题,使用 ps -ef | grep java 可以清晰的看到秘钥,裂开了啊!

一、背景需求

1、不能改动任何的代码。
2、隐藏 nohup 启动命令里面的配置参数。

二、查阅资料

大部分都是按照C的思路处理,将配置参数提前写入内存中,然后在启动的时候,通过指针指向对应的配置,以达到隐藏配置的目的。
依据这个链接,学习了一下:https://zhuanlan.zhihu.com/p/610215116?utm_id=0

三、实现隐藏库

新建一个目录

cd /
mkdir test
cd test

3.1、测试test.c

新增测试文件

touch test.c

测试程序: test.c

#include <stdio.h>

int main(int argc,char **argv){
	printf("argc=%d\n",argc);
	printf("argv[0]=%s\n",argv[0]);
	printf("argv[1]=%s\n",argv[1]);
	printf("argv[2]=%s\n",argv[2]);
	getchar();
	return 0;
}

编译测试程序

gcc test.c

运行测试程序

./a.out 123 456

在这里插入图片描述

查看进程

ps -ef

在这里插入图片描述

进程的查看结果,直接运行命令行参数用ps命令直接打印了出来。
现在要做的就是把后面的参数隐藏起来。

3.2、设置隐藏库

隐藏库程序 hide.c

touch hide.c

编写代码 hide.c

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int (*main_bak) (int, char **, char **);
/*
 * 所有的argv指向的内存先备份,然后全部改为*,再将argv指针指向备份内存
 */
static int mymain(int argc, char **argv, char **env) {
	int ret = 0,i = 0,len = 0;
	char **argvbak = NULL;
	if(argc > 1){
		argvbak=(char **)calloc(argc,sizeof(char *));
		for(i = 1;i < argc;i++){
			len = strlen(argv[i]);
			argvbak[i] = (char *)calloc(len,sizeof(char));
			strcpy(argvbak[i],argv[i]);
			strncpy(argv[i],"*",strlen(argv[i]));
			argv[i] = argvbak[i];
		}
	}
	ret = main_bak(argc, argv, env);
	if(argc > 1){
		for(i = 1;i < argc;i++){
			free(argvbak[i]);
		}
		free(argvbak);
	}
	return ret;
}
int (*__next_libc_start_main)(int (*main)(int, char **, char **),
	    int argc,
	    char **argv,
	    void (*init) (void),
	    void (*fini) (void),
	    void (*_fini) (void),
	    void (*stack_end));
int __libc_start_main(int (*main)(int, char **, char **),
		     int argc, char **argv,
		     void (*init)(void),
		     void (*fini)(void),
		     void (*_fini)(void),
		     void (*stack_end))
{
	__next_libc_start_main = dlsym(RTLD_NEXT, "__libc_start_main");
	main_bak = main;
	return __next_libc_start_main(mymain, argc, argv, init, fini, _fini, stack_end);
}

编译代码 hide.c

gcc -O2 -fPIC -shared -o hide.so hide.c -ldl

在这里插入图片描述

3.3、验证

使用参数隐藏的方式运行程序

LD_PRELOAD=./hide.so ./a.out 111 222

在这里插入图片描述
查看进程
在这里插入图片描述
以上便实现了 隐藏

四、应用jar启动命令

原项目的启动命令:

nohup java -jar -Djasypt.encryptor.password='1234qwer' /app/web.jar --server.port=8080 --spring.config.location=/app/web.yml >> /app/web.out 2>&1 &

在此基础上采用隐藏库即可,及命令前加上 LD_PRELOAD,如下:

LD_PRELOAD=./hide.so nohup java -jar -Djasypt.encryptor.password='1234qwer' /app/web.jar --server.port=8080 --spring.config.location=/app/web.yml >> /app/web.out 2>&1 &

如果再其他地方启动,使用绝对路径即可:

LD_PRELOAD=/test/hide.so nohup java -jar -Djasypt.encryptor.password='1234qwer' /app/web.jar --server.port=8080 --spring.config.location=/app/web.yml >> /app/web.out 2>&1 &

执行完成之后,查看项目进程

ps -ef |grep java

在这里插入图片描述

五、直接应用结果

1、直接下载.so文件
CSDN地址:https://download.csdn.net/download/qq_38254635/88140515
百度网盘地址:https://pan.baidu.com/s/1HcPlHjRpBsmUTU8GnAhKfg?pwd=dge1
提取码:dge1

2、放到服务器里,在启动命令前添加下面命令即可。

LD_PRELOAD=/my/hide.so 

地址需根据放服务器的位置调整。

参考链接:
Java 程序隐藏命令行参数:https://www.5axxw.com/wenku/pg/5100338h.html
如何隐藏进程的启动参数?:https://www.zhihu.com/question/27518530
linux小妙招-隐藏命令行参数(不修改源码):https://zhuanlan.zhihu.com/p/610215116?utm_id=0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/822898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

做软件测试,掌握哪些技术才能算作“测试大佬”?

一、过硬的基础能力 其实所有的测试大佬都是从底层基础开始的&#xff0c;随着时间&#xff0c;经验的积累慢慢变成大佬。要想稳扎稳打在测试行业深耕&#xff0c;成为测试大牛&#xff0c;首当其冲的肯定就是拥有过硬的基础&#xff0c;所有的基础都是根基&#xff0c;后期所…

【应用层】HTTPS协议详细介绍

文章目录 前言一、什么是"加密"二、常见的加密方式三、数据摘要&#xff08;数据指纹&#xff09;四、证书总结 前言 HTTPS也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层&#xff0c;由于HTTP协议内容都是按照文本的方式明文传输的&#xff…

【外卖系统】修改菜品

需求分析 在菜品管理列表页面点击修改按钮&#xff0c;跳转到修改页面&#xff0c;在修改页面回显菜品相关信息并进行修改&#xff0c;在最后点击确定按钮完成修改操作 代码设计 页面发送ajax请求&#xff0c;请求服务端获取分类数据&#xff0c;用于菜品分类下拉框中数据显…

【Unity学习笔记】对象池

文章目录 设计思路总体设计从生命周期考虑 一些代码 对象池这个东西老生常谈了&#xff0c;使用它的好处在于&#xff1a;当我们需要重复创建或者销毁一些物体&#xff0c;例如限制子弹数量上限为10发&#xff0c;当射出第11发就需要使第10发消失&#xff0c;第11出现。销毁10号…

vue中人员导出功能实现

大纲&#xff1a; 1、导出定义的export.js文件 代码展示 import axios from axios //导出一 export const exportExcel (url, params, name, type post) > {// url url路径 params 查询参数 name 文件名 type 请求方式axios[type](url, params, {responseType: blob,}).t…

微信小程序多码融合

1、多码融合实现 如果需要实现扫码关注、跳转页面、扫码充电以及第三方融合扫码充电的需求&#xff0c;通过“扫普通链接二维码打开小程序” 的功能采用hlht协议的方式进行融合&#xff0c;使用代码生成新的二维码&#xff0c;二维码内容格式如下&#xff1a; hlht://9900000…

性能测试基础知识(三)性能指标

性能测试基础知识&#xff08;三&#xff09;性能指标 前言一、时间特性1、响应时间2、并发数3、吞吐量&#xff08;TPS&#xff09; 二、资源特性1、CPU利用率2、内存利用率3、I/O利用率4、网络带宽使用率5、网络传输速率&#xff08;MB/s&#xff09; 三、实例场景 前言 性能…

ES6系列之let、const、箭头函数使用的坑

变量提升块级作用域的重要性箭头函数this的指向rest参数和arguments 1.ECMAScript与Js的关系 2.Babel转码器 Babel是一个广泛使用的ES6转码器&#xff0c;可以将ES6代码转为ES5代码&#xff0c;从而在老版本的浏览器执行。这意味着&#xff0c;你可以用ES6的方式编写程序&…

MyBatis的使用方法

文章目录 一、MyBatis的创建准备工作 二、MyBatis的使用1.项目分层2.业务代码1&#xff09;使用XML的方法2&#xff09;直接使用注解 总结 一、MyBatis的创建 准备工作 1.添加依赖 旧项目 方法一&#xff1a;在pom.xml中添加MyBatis和MySQL Diver依赖 <!-- 添加 MyBati…

QC API全系列揭秘之Test Execution操作(全网首发)

目录 一、QC简介&#xff1a; 二、写作目的&#xff1a; 三、解决问题&#xff1a; 四、本文重点&#xff1a; 五、QC接口规范&#xff1a; 六、QC接口操作Test Execution&#xff1a; 定义全局变量 QC服务器连接、登录&#xff08;身份验证&#xff09;及项目连接 重点…

小程序商城系统的开发方式及优缺点分析

小程序商城系统是一种新型的电子商务平台&#xff0c;它通过小程序的形式为商家提供了一种全新的销售渠道&#xff0c;同时也为消费者提供了一种便捷的购物体验。小程序商城系统具有低成本、快速上线、易于维护等特点&#xff0c;因此在市场上受到了广泛的关注和应用。这里就小…

【设计模式——学习笔记】23种设计模式——模板方法模式Template Method(原理讲解+应用场景介绍+案例介绍+Java代码实现)

介绍 基本介绍 模板方法模式&#xff0c;又叫模板模式&#xff0c;在一个抽象类中定义了一个执行它的其他方法的公开模板方法&#xff0c;子类可以按需重写抽象类的抽象方法简单说&#xff0c;模板方法模式 定义一个操作中的算法&#xff08;或者说流程&#xff09;的骨架&am…

Vue引入

1. vue引入 第一种方法&#xff1a;在线引入 <script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 第二种方法&#xff1a;本地引入 2. 语法学习 el用于绑定id&#xff0c;data用于定义数据如下例题 <!DOCTYPE html> <html…

xinput1_4.dll丢失的解决方法,三种解决方法分享

xinput1_4.dll是一个动态链接库文件&#xff08;DLL&#xff09;&#xff0c;它是Microsoft DirectX的一部分&#xff0c;用于处理游戏控制器输入。当你的电脑提示xinput1_4.dll文件丢失时&#xff0c;意味着与这个文件相关的游戏或应用程序无法正常运行。 当你的电脑提示xinp…

正负样本分配策略(OTA, SimOTA,TAS)

文章目录 OTASimOTATALATSS OTA 论文&#xff1a;《OTA: Optimal Transport Assignment for Object Detection》 代码&#xff1a;Megvii-BaseDetection/OTA 标签分配算法 目标CNN-based的目标检测器是预测 pre-defined anchors 的类别 (cls) 以及偏移量 (reg) 。 为了训练目标…

go 结构体 - 值类型、引用类型 - 结构体转json类型 - 指针类型的种类 - 结构体方法 - 继承 - 多态(interface接口) - 练习

目录 一、结构体 1、python 与 go面向对象的实现&#xff1a; 2、初用GO中的结构体&#xff1a;&#xff08;实例化一个值类型的数据&#xff08;结构体&#xff09;&#xff09; 输出结果不同的三种方式 3、实例化一个引用类型的数据&#xff08;结构体&#xff09; 4、…

esp32 wifi无线透传

wifi无线透传 目录 wifi无线透传[TOC](目录) 一、Esp32代码1.1 下载烧写 二、星空内网穿透配置2.1 平台注册2.2 充值2元(用于实名认证)2.3 实名认证2.4 创建隧道2.5 下载软件2.6 配置文件2.7 启动服务 因为常见的无线传输视频或图片&#xff0c;只能在局域网内中实现&#xff0…

【并发专题】手写MyReentantLock

分析 ReentantLock的特点如下&#xff1a; 首先是继承自AQS的可中断可以设置超时时间可以切换公平锁/非公平锁支持多个条件变量支持可重入 事实上&#xff0c;上面的很多东西AQS已经帮忙实现了&#xff0c;所以想要复刻一个不是很难。仔细观察一下源码&#xff0c;我们需要重…

Text-to-SQL小白入门(一)

摘要 本文主要介绍了Text-to-SQL研究的定义、意义、研究方法以及未来展望&#xff0c;主要是对Text-to-SQL领域进行一个初步的认识和了解&#xff0c;适合初学者入门了解。 1 引言 作为Text-to-SQL领域的小白&#xff0c;学习该领域的最好方式就是看最新的综述文章&#xff…