WEB安全学习—续

Day81--代码审计-PHP项目_MVC注入_CNVD拿1day_SQL监控_动态调试等

利用正则表达式(搜取敏感函数)

数据库监控-QQ业务源码系统(无过滤) 

构造XFF,可以通过抓包伪造数据包 

正则表达式-Bluecms源码系统(无过滤) 

CNVD拿1day(存在漏洞但是没有公开,没有exp)

MVC 设计模式

  

梦想CMS后台Bo***.cl***.php文件存在SQL注入漏洞 

LmxCMS V1.4琴台Ta***.cl***.php存在SQL注入漏洞 

所以$data = p(2,1,1)中函数p表示post提交方式,有转义,有过滤 

详解php魔术方法addslashes 

关键!!! 

Day82--代码审计-PHP项目-MVC文件安全_上传_包含_下载_删除_读取等 

php unlink函数

梦想CMS存在任意文件删除漏洞 

删除成功后,再次访问install目录,提示重新安装

梦想CMS存在任意文件读取

php常见文件读取函数

php内置打印函数var_dump

  

文件安全-文件下载-功能点定位-earmusic

采用功能追踪的方式而不是关键字搜索的方式 

通过数据包中字段的修改实现文件下载的操作 

经过数据库分析得,下载的文件由in_audio决定 

 从上传音乐得功能方面分析,寻找in_audio的决定值

所以,音频地址决定了in_audio

在实现任意文件下载的时候发现存在过滤,过滤为Safety filter。经分析得,过滤了点('.'),正斜杠('/'),'?iframe=','.php',所以要采用绝对路径的方式绕过

成功读取到数据库相关配置信息 

ZZZCMS文件删除漏洞 

mvc模型源码跟常规源码的分析区别:mvc中函数在类中声明,常规源码中函数则需要谁调用了

 

常规源码中函数

mvc模型中函数,直接在域名路径中a=editfile

Day83--代码审计-RCE安全_调试_追踪_代码执行_命令执行 

百家CMS微商城存在命令执行漏洞(CNVD-2021-12800) 

 

Day84--代码审计-PHP项目_变量覆盖_反序列化_未授权访问_身份验证 

BossCMS实现任意文件删除(未授权访问)

其中变量file由id决定,id是get传参 

其中delete函数得具体实现 

 

漏洞所在 

漏洞的更新修复 

 然而未授权访问即在未登录到后台得情况下,构造并执行删除等数据包,成功执行

熊海CMS(SEACMS)逻辑验证漏洞 

 

抓包修改数据包 

成功登录到后台 

php反序列化引起读取

php反序列化常见函数 

构造payload

Day85--代码审计-PHP项目_TP框架_SQL_XSS_架构_路由_调试_写法 

thinkphp框架 

 

思路分析 

CNVD拿1day-HSYCMS 

调试设置 

config.php 

database.php 

设置延时 

Day86--代码审计-PHP项目_TP框架_安全写法_1day利用_0day分析

thinkphp3.2 

 流程 

YxtCMF 

Day87--代码审计-NET项目_DLL反编译_MSSQL监控_VS搜索_注入_上传

反编译 

反编译的目的:寻找封装代码 

Day88--代码审计-NET项目_DLL反编译_未授权访问_脆弱验证_注入_上传 

脆弱验证(固定判断身份)

思路 

直接登录到后台 

验证未引用 

找到了验证文件,如果其他文件没有调用/引用该文件,就不受限制,可以直接访问,否则会进行跳转到login登录界面 

思路:尽可能使变量DonforYhm符合admin中数据,返回值就不等于0,那么就会进行跳转

Day89--代码审计-JAVA项目_JDBC_Mybatis_Hibernate_注入_预编译_写法

jdbc进行sql注入

 

Mybatis进行sql注入 

Hibernate 

Day90--代码审计-JAVA项目_filter过滤器_CNVD分析_XSS跨站_框架安全 

Demo-filter过滤器引用 

 

访问jsp后缀文件时会调用过滤规则函数(一般过滤器名字跟路由在web.xml文件中)

Jeesns-XSS跨站绕过 

配置文件中引用过滤器 

过滤器中new一个XssWrapper类 

XssWrapper类中的存在过滤规则

 

悟空CRM-Fastjson组件漏洞

利用dnslog

Day91--代码审计-JAVA项目_访问控制_Shrio框架_filter过滤器_CNVD分析 

逻辑越权-WS租车系统-传统验证机制

普通用户界面(客户)

admin用户界面

漏洞利用:普通用户直接访问admin用户的功能域名地址,普通用户界面可以展示admin内容信息

漏洞产生:admin跟普通用户都有相应的操作功能,只是在前端界面的区别

CNVD-Tumo-未授权访问-Shiro框架引用

在配置文件中发现引用到Shiro框架

CNVD-华夏ERP-未授权访问-filter过滤器 

过滤器

漏洞利用(利用 ../ 的方式直接绕过过滤器) 

Day92--代码审计-Java项目_框架_RCE_表达式注入_SPEL_Log4j_Fastjson 

java表达式注入

表达式注入 ~ Misaki's Blog (misakikata.github.io)

SpringCloudFunctionSpel 框架存在漏洞(表达式注入) 

漏洞利用 

RCE

java项目RCE主要是实现命令执行和代码执行

log4j

搭配dnslog 

 

Day93--代码审计-Java项目_SSTI_SSRF_XXE_XML_CNVD模块_CTF组件

OFCMS后台模板定制处存在命令执行漏洞 

 网鼎杯-2020青龙组filejava

 

Day94--代码审计-Java项目_反序列化_shiro_fastjson_原生态_框架_利用链

java反序列化 

相关工具 

不安全写法 

安全写法 

利用脚本生成calc的反序列化代码(因为windows不支持 '| base64' 操作,所以在linux执行)

生成的base64数据需要进行去换行的操作,可利用py脚本实现 

漏洞利用在登录的前提下,利用登录之后的cookie,抓包用payload替换cookie

执行成功后自动弹出计算器 

Day95--代码审计-SATA_IAST项目_PHP_JAVA_NET_Python_JS_Go_等测评(工具使用)

  

Day97--权限提升-WEB权限_权限划分_源码后台_中间件_第三方_数据库等

权限提升(web权限,系统权限,域控权限) 

phpmyadmin权限提升(数据库权限->网站权限  /  网站权限->数据库权限)

Day98--权限提升_WIN全平台_MSF自动化_CS插件_EXP筛选_溢出漏洞 

windows提权相关命令

工具:Vulmap-master、WindowsVulnScan-master、wesng-master

WindowsVulnScan-master:

利用脚本生成出来对方主机的windows版本补丁(相当于systeminfo命令),然后在本机执行python cve-check.py进行比对

wesng-master:

首先将对方主机执行systeminfo的内容保存到本地1.txt,然后利用py脚本进行比对 

msf使用 

-p        payload

-f        文件类型exe可执行文件

-o       带外的文件名

将生成的msf.exe上传到本地的后门,在后门运行msf.exe

Day99--权限提升-数据库提权_口令获取_MYSQL_MSSQL_Oracle_MSF 

注:MYSQL高版本配置文件中-secure-file-priv会对sql操作目录限制,dll及启动项不起作用

MYSQL提权--UDF提权

首先判断mysql版本

select version()        查看mysql数据库版本

select @@basedir   查看mysql安装目录 

由于mysql的root用户不支持外连,所以用哥斯拉(webshell)连接服务器,执行以下语句开启外连

GRANT ALL PRIVILEGES ON *.* TO'账号'@'%' IDETIFIED BY '密码' WITH GRANT OPTION; 

MSF执行成功会在mysql服务器创建一个dll可执行文件 

创建sys_eval,实现可执行命令

 

MYSQL提权--启动项提权 

mysql启动项目录

shell:Common Startup

搭配MSF,生成windows启动脚本 

MYSQL提权--反弹shell 

Mysql提权之反弹shell_magnet:?xt=urn:btih:04e8ed9c7ea74fc9dfddc49ebc07d1-CSDN博客

MSSQL提权

MSSQL数据库组件中xp_cmdshell、 sp_oacreate可进行命令执行

MSSQL的端口:1433 

xp_cmdshell 

EXEC master.dbo.xp_cmdshell '命令' 

组件启动关闭命令   

sp_oacreate 

组件启动关闭命令  

MYSQL提权--沙盒提权

SQL Server提权方法汇总(MSSQL)_Margin的技术博客_51CTO博客

Day100--权限提升-数据库_Redis_Postgre_第三方软件_TV_向日葵_服务类 

Postgre数据库

PostgreSQL 提权漏洞(CVE-2018-1058) 

条件:需要管理员操作数据库从而触发反弹shell 

Vulhub - Docker-Compose file for vulnerability environmenticon-default.png?t=N7T8https://vulhub.org/#/environments/postgres/CVE-2019-9193/

PostgreSQL 高权限命令执行漏洞(CVE-2019-9193) 

条件:管理员的账号密码登录 

Vulhub - Docker-Compose file for vulnerability environmenticon-default.png?t=N7T8https://vulhub.org/#/environments/postgres/CVE-2019-9193/

Day101--权限提升_Win本地用户_进程注入_令牌窃取_AT_SC_PS服务命令

at命令提权

sc命令提权(同at命令)

PsExec提权

进程迁移(条件:用户权限为adminstrator及以上,低权限用户无法进行迁移)

令牌窃取 

土豆提权(原理:令牌窃取)

首先在webshell上上传一个后门potato.exe 

Day102--权限提升_WIN本地用户BypassUAC_DLL劫持_引号路径_服务权限

BypassUAC(msf模块/UACME项目)

msf 

 UACME项目

DLL劫持 

利用msfvenom生成一个dll文件,替换原有的dll,当用户执行原有的应用程序,就会上线一个后门,成功拿到权限 

 

不带引号服务路径配合msf提权

服务的启动时系统system权限,利用工具搜索服务中不带引号且路径还有空格的,在webshell中替换服务为后门msf.exe,修改msf名称与原服务名字保持一致,当服务启动时,后门上线且权限是system 

不安全服务权限 

工具

1 、

2 、AccessChk

Day103--权限提升_Linux系统_辅助项目_脏牛_Dirty_内核漏洞_SUID_GUID

提权命令参考网站 :

linux: 

GTFOBinsicon-default.png?t=N7T8https://gtfobins.github.io/windows:

LOLBAS (lolbas-project.github.io)icon-default.png?t=N7T8https://lolbas-project.github.io/SUID提权

漏洞成因:find命令是linux查找命令,由于管理员需要查找文件,为了使查找的文件结果更多,赋予find命令suid权限(也就是root权限),而且find可以与exec参数进行组合进行其他命令,那么exec后面的命令就会以root执行。

自动化工具探针:LinEnum.sh、taritor 

手工探针 

脏牛漏洞(CVE-2016-5195)

工具:

DirtyPipe漏洞 

Day104--权限提升-Linux系统_环境变量_定时任务_权限配置不当_MDUT自动化 

环境变量 

定时任务 

cat /etc/crontab        查看定时任务命令 

m:分钟 h:小时 dom:天 mon:月 dow:星期几 

Day105--权限提升-linux系统_Docker挂载_Rsync未授权_Sudo-CVE_Polkit-CVE 

rsync提权 

rsync端口873 

rsync是linux自带的服务,通过修改计时任务的文件,尝试覆盖(反弹shell)

rsync -av nc rsync://xxx:xxx/src/ect/cron.hourly/

docker挂载 

docker run -v /root:/mnt -it alpine        镜像不重要,只要是参数 

sudo漏洞CVE 

判断漏洞是否存在:

方一、sudo --version查看版本

方二、执行命令  sudoedit -s /

存在漏洞情况 

Day107--免杀对抗-C_C++_溯源_ShellCode上线_混淆变异算法_回调编译执行 

混淆加密算法

 

xor工具

Hex

CyberChefThe Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysisicon-default.png?t=N7T8https://gchq.github.io/CyberChef/

Rc4 

网络信息安全:RC4加密算法的实现_采用rc4_256加密算法 保证了重要数据在传输过程中的完整-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_45590789/article/details/105536623

#include <iostream>
#include <bitset>
#include<fstream>
using namespace std;
void swap(unsigned char &a,unsigned char &b){
	unsigned char temp = a;
	a = b;
	b = temp;
	return;

}
//返回明文的字节长度
int getSecret(unsigned char key[],unsigned char data[],unsigned char k[]){
	unsigned char S[256];
	unsigned char T[256];
	int keylen;
	int datalen;
	int i,j = 0;
	//检测密钥长度
	for (i = 0;; i++){
		if (key[i] == '\0'){ 
			keylen = i; 
			break;
		}
	}
	//检测明文长度
	for (i = 0;; i++){
		if (data[i] == '\0'){
			datalen = i;
			break;
		}
	}
	//KSA key scheduling算法初始化S
	for (i = 0; i < 256; i++){
		S[i] = i;
	}
	i = 0;
	if (keylen >= 256){
		for (i = 0; i < 256; i++){
			T[i] = key[i];
		}
	}
	else{
		while (1){
			for (j = 0; j < keylen; j++){
				T[i++] = key[j];
				if (i >= 256)break;
			}
			if (i >= 256)break;
		}
	}
	i = 0;
	j = 0;
	for (i = 0; i < 256; i++){
		j = (j + S[i] + T[i]) % 256;
		swap(S[i], S[j]);
	}
	//PRGA伪随机生成算法,生成密钥流
	int t;
	int m = 0;
	int times = datalen;
	while (times-->0){//相当于执行明文长度次,这样生成的秘钥流也是明文长度个字节
		i = (i + 1) % 256;
		j = (j + S[i]) % 256;
		swap(S[i], S[j]);
		t = (S[i] + S[j]) % 256;
		k[m++] = S[t];//生成密钥流并存储
	}
	cout << "The secret key is: ";
	for (i = 0; i < datalen;i++){
		cout << (bitset<8>)k[i] << " ";
	}
	cout << endl;
	return datalen;
}
void encrypt(unsigned char data[],unsigned char k[],int datalen){
	//异或加密
	for (int i = 0; i < datalen;i++){
		data[i] = data[i] ^ k[i];
	}
	ofstream ofile("rc4_encrypted.txt",ios::app);
	ofile << "The secret message is: ";
	cout << "The secret message is: ";
	//指定8位2进制输出
	for (int i = 0; i < datalen; i++){
		ofile << (bitset<8>)data[i] << " ";
		cout << (bitset<8>)data[i] << " ";
	}
	ofile << endl;
	ofile.close();
	cout << endl;
}
void decrypt(unsigned char data[], unsigned char k[],int datalen){
	//异或解密
	for (int i = 0; i < datalen; i++){
		data[i] = data[i] ^ k[i];
	}
	ofstream ofile("rc4_decrypted.txt", ios::app);
	ofile << "The decrypted message is: ";
	cout << "The decrypted message is: ";
	//指定8位2进制输出
	for (int i = 0; i < datalen; i++){
		ofile << data[i];
		cout << data[i];
	}
	ofile << endl;
	ofile.close();
	cout << endl;
}
int main(){
	unsigned char key[] = {"hello world"};
	unsigned char data[] = {"北京时间十八点实施轰炸!北京时间十八点实施轰炸!北京时间十八点实施轰炸!"};
	unsigned char k[1024] ;
	int datalen=getSecret(key, data, k);
	encrypt(data, k,datalen);
	decrypt(data, k,datalen);
}

Day108--免杀对抗_python混淆算法_反序列化_打包生成器_py2exe_Nuitka

打包器 

pyinstaller

py2exe 

Nuitka

Day109--免杀对抗_PowerShell_混淆_分离加载器_特征修改_EXE生成_填充替换 

文件模式(.ps)

利用CS生成powershell的后门 

分离-将后门文件放到web上去,加载该文件(666)

混淆(lj)

对于windowsDef,需要转换CS的编码格式以及脚本中的变量名和函数名,才能上线

执行模式(.txt)

Day110--免杀对抗-Go_C#_反VT沙盒_逆向调试_参数加载_资源分离_混淆加密 

C#免杀

msf生成C#后门 

文件混淆(利用工具对文件进行保护,加壳,反编译)

go

Day111--免杀对抗-Java_ASM_汇编_CS调用_内连C_MSF源码特征修改_Jar打包 

Java 

 

 

Day112--免杀对抗_加载器分离_无文件落地_图片隐写_SOCK管道_参数协议化 

 

将shellcode从文本中分离

CS生成payload,利用py2exe,修改setup.py内容,使用分离的思想,生成exe程序(exe和payload都要上传)WINdef,360,火绒都可以绕过

将shellcode从加载器中分离(参数分离)

再用py2exe转换为exe,然后执行 

执行语法:xxx.exe + shellcode 

图片隐写(不同于图片码)

Python3 图片隐写术的实现 (qq.com)icon-default.png?t=N7T8https://mp.weixin.qq.com/s/c8U2M_iJ8pWaI50sH8u9Hw payload

#!/usr/bin/env python3 
#coding=utf-8

"""Encode png image via command-line.

Usage:
    imageEncoding (-e|encode) <originImage> [<text>] [<encodedImage>]
    imageEncoding (-d|decode) <encodedImage>

Options:
    -h,--help   显示帮助菜单
    -e          加密
    -d          解密

Example:
    imageEncoding -e coffee.png hello textOrFileToEncode encodedImage.png
    imageEncoding -d encodedImage.png
"""

from PIL import Image
from docopt import docopt
import crash_on_ipy

"""
取得一个 PIL 图像并且更改所有值为偶数(使最低有效位为 0)
"""
def RGBAmakeImageEven(image):
    pixels = list(image.getdata())  # 得到一个这样的列表: [(r,g,b,t),(r,g,b,t)...]
    evenPixels = [(r>>1<<1,g>>1<<1,b>>1<<1,t>>1<<1) for [r,g,b,t] in pixels]  # 更改所有值为偶数(魔法般的移位)
    evenImage = Image.new(image.mode, image.size)  # 创建一个相同大小的图片副本
    evenImage.putdata(evenPixels)  # 把上面的像素放入到图片副本
    return evenImage

def RGBmakeImageEven(image):
    pixels = list(image.getdata())  # 得到一个这样的列表: [(r,g,b,t),(r,g,b,t)...]
    evenPixels = [(r>>1<<1,g>>1<<1,b>>1<<1) for [r,g,b] in pixels]  # 更改所有值为偶数(魔法般的移位)
    evenImage = Image.new(image.mode, image.size)  # 创建一个相同大小的图片副本
    evenImage.putdata(evenPixels)  # 把上面的像素放入到图片副本
    return evenImage

"""
内置函数 bin() 的替代,返回固定长度的二进制字符串
"""
def constLenBin(int):
    binary = "0"*(8-(len(bin(int))-2))+bin(int).replace('0b','')  # 去掉 bin() 返回的二进制字符串中的 '0b',并在左边补足 '0' 直到字符串长度为 8
    return binary

"""
将字符串编码到图片中
"""
def RGBAencodeDataInImage(image, data):
    evenImage = RGBAmakeImageEven(image)  # 获得最低有效位为 0 的图片副本
    binary = ''.join(map(constLenBin,bytearray(data, 'utf-8'))) # 将需要被隐藏的字符串转换成二进制字符串
    if len(binary) > len(image.getdata()) * 4:  # 如果不可能编码全部数据, 抛出异常
        raise Exception("Error: Can't encode more than " + len(evenImage.getdata()) * 4 + " bits in this image. ")
    encodedPixels = [(r+int(binary[index*4+0]),g+int(binary[index*4+1]),b+int(binary[index*4+2]),t+int(binary[index*4+3])) if index*4 < len(binary) else (r,g,b,t) for index,(r,g,b,t) in enumerate(list(evenImage.getdata()))] # 将 binary 中的二进制字符串信息编码进像素里
    encodedImage = Image.new(evenImage.mode, evenImage.size)  # 创建新图片以存放编码后的像素
    encodedImage.putdata(encodedPixels)  # 添加编码后的数据
    return encodedImage

def RGBencodeDataInImage(image, data):
    evenImage = RGBmakeImageEven(image)  # 获得最低有效位为 0 的图片副本
    binary = ''.join(map(constLenBin,bytearray(data, 'utf-8'))) # 将需要被隐藏的字符串转换成二进制字符串
    if len(binary)%3 != 0:  # 将转换的比特流数据末位补零,使其长度为3的倍数,防止其在下面重新编码的过程中发生越界
        rema = len(binary)%3
        binary = binary+('0'*(3-rema))
#        print(len(binary))
    if len(binary) > len(image.getdata()) * 3:  # 如果不可能编码全部数据, 抛出异常
        raise Exception("Error: Can't encode more than " + len(evenImage.getdata()) * 3 + " bits in this image. ")
    # evenImageList = list(evenImage.getdata())

    # for index in range(len(evenImageList)):
    #     if index*3 < len(binary):
    #         tup = evenImageList[index]
    #         r = tup[0]
    #         g = tup[1]
    #         b = tup[2]
    #         r += int(binary[index*3+0])
    #         evenImageList[index] = (r,g,b)
    #     else:
    #         break
    #     if index*3+1 < len(binary):
    #         tup = evenImageList[index]
    #         r = tup[0]
    #         g = tup[1]
    #         b = tup[2]
    #         g += int(binary[index*3+1])
    #         evenImageList[index] = (r,g,b)
    #     else:
    #         break
    #     if index*3+2 < len(binary):
    #         tup = evenImageList[index]
    #         r = tup[0]
    #         g = tup[1]
    #         b = tup[2]
    #         b += int(binary[index*3+2])
    #         evenImageList[index] = (r,g,b)
    #     else:
    #         break
    #     index += 1
    # encodedPixels = evenImageList
    encodedPixels = [(r+int(binary[index*3+0]),g+int(binary[index*3+1]),b+int(binary[index*3+2])) if index*3 < len(binary) else (r,g,b) for index, (r,g,b) in enumerate(list(evenImage.getdata()))] # 将 binary 中的二进制字符串信息编码进像素里
    encodedImage = Image.new(evenImage.mode, evenImage.size)  # 创建新图片以存放编码后的像素
    encodedImage.putdata(encodedPixels)  # 添加编码后的数据
    return encodedImage

"""
从二进制字符串转为 UTF-8 字符串
"""
def binaryToString(binary):
    index = 0
    string = []
    rec = lambda x, i: x[2:8] + (rec(x[8:], i-1) if i > 1 else '') if x else ''
    # rec = lambda x, i: x and (x[2:8] + (i > 1 and rec(x[8:], i-1) or '')) or ''
    fun = lambda x, i: x[i+1:8] + rec(x[8:], i-1)
    while index + 1 < len(binary):
        chartype = binary[index:].index('0') # 存放字符所占字节数,一个字节的字符会存为 0
        length = chartype*8 if chartype else 8
        string.append(chr(int(fun(binary[index:index+length],chartype),2)))
        index += length
    return ''.join(string)

"""
解码隐藏数据
"""
def RGBAdecodeImage(image):
    pixels = list(image.getdata())  # 获得像素列表
    binary = ''.join([str(int(r>>1<<1!=r))+str(int(g>>1<<1!=g))+str(int(b>>1<<1!=b))+str(int(t>>1<<1!=t)) for (r,g,b,t) in pixels]) # 提取图片中所有最低有效位中的数据
    # 找到数据截止处的索引
    locationDoubleNull = binary.find('0000000000000000')
    endIndex = locationDoubleNull+(8-(locationDoubleNull % 8)) if locationDoubleNull%8 != 0 else locationDoubleNull
    data = binaryToString(binary[0:endIndex])
    return data

def RGBdecodeImage(image):
    pixels = list(image.getdata())  # 获得像素列表
    binary = ''.join([str(int(r>>1<<1!=r))+str(int(g>>1<<1!=g))+str(int(b>>1<<1!=b)) for (r,g,b) in pixels]) # 提取图片中所有最低有效位中的数据
    # 找到数据截止处的索引
    locationDoubleNull = binary.find('0000000000000000')
    endIndex = locationDoubleNull+(8-(locationDoubleNull % 8)) if locationDoubleNull%8 != 0 else locationDoubleNull
    data = binaryToString(binary[0:endIndex])
    return data

def isTextFile(path):
    if path.endswith(".txt"):
        return True
    elif path.endswith(".m"):
        return True
    elif path.endswith(".h"):
        return True
    elif path.endswith(".c"):
        return True
    elif path.endswith(".py"):
        return True
    else:
        return False

if __name__ == '__main__':
    """command-line interface"""
    arguments = docopt(__doc__)
#    print(arguments)

    if arguments['-e'] or arguments['encode']:
        if arguments['<text>'] is None:
            arguments['<text>'] = "待加密的文本"
        if arguments['<encodedImage>'] is None:
            arguments['<encodedImage>'] = "encodedImage.png"

        if isTextFile(arguments['<text>']):
            with open(arguments['<text>'], 'rt') as f:
                arguments['<text>'] = f.read()

        print("载体图片:")
        print(arguments['<originImage>']+"\n")
        print("待加密密文:")
        print(arguments['<text>']+"\n")
        print("加密后图片:")
        print(arguments['<encodedImage>']+"\n")
        print("加密中……\n")
        im = Image.open(arguments['<originImage>'])
        if im.mode == 'RGBA':
            RGBAencodeDataInImage(im, arguments['<text>']).save(arguments['<encodedImage>'])
        # elif im.mode == 'RGB':
        #     RGBencodeDataInImage(im, arguments['<text>']).save(arguments['<encodedImage>'])
        else:
            print("暂不支持此图片格式……")

        print("加密完成,密文为:\n"+arguments['<text>']+"\n")
    elif arguments['-d'] or arguments['decode']:
        print("解密中……\n")
        im = Image.open(arguments['<encodedImage>'])
        if im.mode == 'RGBA':
            print("解秘完成,密文为:\n"+RGBAdecodeImage(im)+"\n")
        # elif im.mode == 'RGB':
        #     print("解秘完成,密文为:\n"+RGBdecodeImage(im)+"\n")
        else:
            print("非法的图片格式……")

 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: shanchen_两相流shan-chen模型_c_ _lbmshan-chen_lbm_shanchen模型_源码是一个用于模拟两相流的计算模型,采用了Shan-Chen模型和LBM(Lattice Boltzmann Method)方法实现。 Shan-Chen模型是一种基于格子上的动力学理论,用于模拟复杂流体中的相互作用。它通过引入虚拟粒子的相互作用来模拟流体的宏观行为,因此在处理两相流问题时具有较好的适用性。 LBM是一种求解流体力学问题的数值方法,其基本思想是将流体划分为格子,并通过在格子上的微观速度分布函数的演化来模拟流体的宏观行为。 shanchen_两相流shan-chen模型_c_ _lbmshan-chen_lbm_shanchen模型_源码结合了Shan-Chen模型和LBM方法,用于模拟两相流动的过程。通过数值计算,可以得到流体的速度场、密度场等宏观信息,并可以确定相界面的位置、形态变化等细节信息。 该源码的实现过程主要包括以下几个步骤:初始化流场参数、设置流体的初始状态、演化速度和分布函数、更新流体状态、计算流体的宏观量等。通过不断迭代以上步骤,可以模拟出两相流的动态过程,并得到相应的结果。 总之,shanchen_两相流shan-chen模型_c_ _lbmshan-chen_lbm_shanchen模型_源码是一个基于Shan-Chen模型和LBM方法的计算模型,用于模拟两相流动的过程,并通过数值计算得到相应的结果。它在计算复杂流体中的相互作用问题时具有较好的可行性和适用性。 ### 回答2: shan-chen模型是一种常用的用于模拟两相流动行为的数学模型。它可以描述液体和气体两相同时存在于同一空间中的流动情况。 而shan-chen Lattice Boltzmann Method (LBM)是一种基于格子的计算方法,用于模拟流体动力学。它通过将流体分割成一个个小格子,然后在每个格上计算该的流体性质,如密度和速度等。LBM以其简洁的数学形式和并行计算的特,成为了模拟两相流动的重要方法。 shan-chen LBM shan-chen模型源码是指实现shan-chen LBM模型的计算程序。该源码是用编程语言编写的一段代码,通过利用数值计算方法和算法,实现了对两相流行为的模拟和计算。 这段源码可能包含了一系列的数学计算和物理模型,用于描述流体在两相流中的行为。其中可能包括计算格子上的流体性质、更新流体的速度和压力、处理两相界面的移动和相互作用等。 通过运行源码,可以获得模拟结果,例如两相流的速度场、压力分布等。这些结果对于理解和研究两相流的行为和特性非常重要,可以用于工程设计和科学研究等领域。 总而言之,shan-chen LBM shan-chen模型源码是一段实现了用于模拟两相流行为的数值计算程序,通过数学模型和算法,可以模拟和计算两相流的特性和行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值