2023年5月

2023最新发卡宝卡密寄售系统源码+自动发卡系统源码;

发卡宝是一款基于PHP语言实现的卡密寄售系统,适用于php5.5-7.3和Mysql5.1-5.7的环境。

不论是使用Windows服务器还是Linux服务器,或者是在虚拟主机(PHP)上安装,都可以很方便地进行部署。

该系统提供了两种运营模式:自营模式和商家入驻模式。自营模式下,只允许管理员在后台发布商品,首页会直接进入店铺;商家入驻模式下,商家和管理员均可发布商品,首页会显示商家入驻介绍页面。

运行环境
PHP5.5~7.3+MYSQL5.1~5.7

2023最新发卡宝卡密寄售系统源码+自动发卡系统源码
2023最新发卡宝卡密寄售系统源码+自动发卡系统源码1
2023最新发卡宝卡密寄售系统源码+自动发卡系统源码2

YPay是一款专为个人站长设计的聚合免签系统,其卓越的性能和丰富的功能值得您的关注。

该系统采用全新轻量化的界面UI,让使用者可以更加快捷方便地解决知识付费和运营赞助的难题。

同时,YPay基于高性能的thinkphp 6.1.2 + layui + PearAdmin架构,提供了实时监控和管理的功能,让您随时随地掌握系统运营情况。

测试环境:
Nginx + PHP7.3 + MySQL5.6

网站运行目录设置为 /public

伪静态设置为thinkphp规则

数据库配置文件修改路径 /config/database.php

后台登录地址 /admin.php

账号密码 admin 123456

Ypay支付系统源码+支持易支付和码支付
Ypay支付系统源码+支持易支付和码支付1
Ypay支付系统源码+支持易支付和码支付2
Ypay支付系统源码+支持易支付和码支付3

智能水印相机微信源码简单方便易上手,相信大家日常在生活中或者工作中都有使用过水印相机来拍照记录吧,但是又要在手机上面多下载一个APP;

智能水印相机,拍照自动添加时间、地点、经纬度等水印文字,可用于工作考勤、学习打卡、工作取证等,支持自定义内容以及给现有照片添加水印。

用户无需安装,无需注册,即开即用。支持时间地点日期添加,支持用户随意切换前后摄像头,支持用户随意开启手机闪关灯,支持用户上传图片来生成,等等功能大家自行模式吧。
智能水印相机微信小程序源码+支持自定义内容+照片添加水印
智能水印相机微信小程序源码+支持自定义内容+照片添加水印1

找到手机文件管理,打开Android/data/com.tencent.qqlive/files/logo/ ,把logo文件夹里的文件全删掉
再打开腾讯视频,随便点几个视频,然后回到logo文件夹把文件名复制出来并删掉源文件
电脑新建一个空的文本文档,把复制的名字粘贴上去并删除后缀,复制这个文件再加上后缀.xlog
把这两个空文件通过数据线导入手机的logo文件夹内。(因为是空文件没法qq微信传输,需要电脑。改完后进去腾讯视频就没有右上角那四个大字的水印了) 测试机型为iqoo9pro及华为mate40pro都是最新系统。至今有效 。

昨天在QQ群看到别人再问是怎么做到的,今天看到了,就分享给大家。附有视频教程和所需要用到的所有素材。
短视频直播平台很火的怀旧QQ视频聊天直播教程

软件和教程都是免费的,每个软件都有视频教程,下载好后按教程操作设置。
音乐获取途径:可以去b站搜索“非主流”怀旧集合获取歌曲名字,然后用下载工具下载。
还有就是汽水音乐app,抖音官方推的一个手机音乐软件,目前是赠送vip,可以用这个来下载
需要的歌曲。

文字说明:
第一步:打开直播伴侣登录要开播的抖音号,添加聊天背景,调整合适的位置
第二步:打开咩播,打开窗口弹幕助手(咩播文件夹有视频可以自己查看)
第三步:点直播伴侣右上角“添加素材”找到截屏,然后截取“弹幕”区域,然后把截屏放置
到素材聊天面板。
第四步:添加素材,截屏,截取“礼物框”放置合适位置。
第四步:添加素材,截屏,截取“进入直播间”放置合适位置。
调整大小,可以在素材又键选择“平铺素材”进行自定义大小
第五步:添加素材,添加摄像头,调整大小如上一步,调好后摄像头放在最下面(添加素材字样的上面)
设置好后开播!!
短视频直播平台很火的怀旧QQ视频聊天直播教程
下载链接:链接: https://caiyun.139.com/m/i?005ChjdLXgeVQ 提取码:8ktD 复制内容打开中国移动云盘手机APP,操作更方便哦
解压密码:blog.xiaohack.org

介绍

Web Net Tools 是一些有用的命令行工具的 Web 前端。 它特别为 Ping 、MTR 、DIG 、Nmap 、Test SSL 、Trace Route 等工具提供了一个 Web 前端。

提供一个简单方便的 web 测试网络工具,类似于 Ping.pe 。

项目地址:https://github.com/johannesschaefer/webnettools

个人编译推送镜像:https://hub.docker.com/r/songxwn/webnettools

PS:MTR 增加了-n 选项,基础镜像使用了 RHEL 8.7 。

使用 Docker 部署

docker run -itd  -p 8080:8080 \
 -e RATE_LIMIT=3000\
 -e INTRO_TEXT="限制 3000 毫秒一次"\
 -e LANG=C.UTF-8\
 --restart=always\
 --name webnettools\
 songxwn/webnettools:1.4
  • 服务默认使用 8080 端口,映射到 8080 端口。
  • RATE_LIMIT 为限制服务使用频率,单位为毫秒。
  • INTRO_TEXT 作为 web 前端显示的公告。
  • 配置语言环境为 C.UTF-8 ,配置为开机启动,配置容器名字,指定镜像源。

    部署完成示例

    部署私有 Web Ping/MTR 测试服务 Web Net Tools

介绍

  • 多标签页管理,同时打开多个连接
  • 提供原生性能,并且比使用 Electron 等 Web 技术开发的同等应用程序消耗的资源少得多
  • 支持 MQTT v5.0 以及 MQTT v3.1.1 协议,支持通过 WebSocket 连接至 MQTT 服务器
  • 以树状结构划分主题,层次分明
  • 支持 SSL/TLS 传输加密,保障数据传输安全
  • 以漂亮的格式显示 JSON 、XML 、MessagePack 、十六进制等消息格式
  • 自动解析消息字段并绘制成图,让数据随时间的变化一目了然
  • 订阅主题与发布消息,搜索消息,还可以一次发送数千条消息进行性能测试,以了解系统如- 何处理负载
  • 内嵌 MQTT 服务器,开箱即用,最高支持 MQTT v5.0 协议,启动与关闭毫秒级延迟,协助您快速地进行本地开发测试。
    官网地址: http://www.redisant.cn/mqtt

激活码

  • D9F874A4-F6D2-4219-BA86-5B95F9E0B25B
  • 527C8510-15EF-4EBC-A92B-9B3CAAB9FF0F
  • FF26F859-FFCE-4235-A7A8-2454B50A95EE
  • 4833C5C1-2E9B-47CA-91FA-E5C88BEF5F94
  • 131C1EE7-C52A-4F1F-A7D0-A44C360052E0
  • C56ABC49-3C08-4A11-A58D-68C4D7114815
  • 3574B72E-7E41-4F8F-BBBA-3C8E7C09FAAC
  • DD51AB54-EDD0-46E3-A375-991AD4C817E6
  • CC94F796-497B-453E-8BEB-0DD3F9121BB0
  • 75CE5CCB-5D88-4383-A413-EA1CC049FBF3

截图

快速连接到您的 MQTT 服务器并开始工作
MQTT Assistant 支持 MQTT v5.0 & v3.1.1 ,还可以使用 WebSocket 连接至 MQTT 服务器

结构化主题及动态预览,支持丰富的数据格式
通过将主题组织成树状结构,让主题之间层次分明。动态预览让您在消息到达时立刻感知。

MQTT Assistant 会自动识别并格式化不同的数据格式,包括 Text 、JSON 、XML 、HEX 、MessagePack ,以及各种整数、浮点类型
结构化主题及动态预览,支持丰富的数据格式
内嵌 MQTT 服务器
基于内存,开箱即用,最高支持 MQTT v5.0 协议,启动与关闭毫秒级延迟,协助您快速地进行本地开发测试。
内嵌 MQTT 服务器
将收集的消息绘制成图
为每个主题保留历史消息,然后自动解析消息字段并绘制成图(折线、二次拟合、阶梯),让数据随时间的变化一目了然;万级数据毫秒响应。
将收集的消息绘制成图
数据模板与压力测试
使用 MQTT Assistant 提供的数据模板,您可以为任何开发、测试或演示目的生成大量、异构、真实的数据。 创建消息时,配合数据模板和定时器,您可以一次发送数千条消息进行性能测试,以了解系统如何处理负载。
数据模板与压力测试
健康服务器状态
MQTT Assistant 支持读取 Mosquitto 、EMQX 、HiveMQ Broker 系统指标
健康服务器状态

各位旅行者好~olah odumo!

著名丘丘语言学家,艾拉马斯克,在近日的研究中发现丘丘人正在通过一种特殊的编程语言试图重新控制提瓦特大陆上的遗迹守卫。他们的目的尚不明确,且此语言仍是草稿阶段,因此,暂时定名为 MITA ( Machine Instruction for Teyvat Automaton )意为“提瓦特自律机关机器指令”。

艾拉马斯克试着将其抄写出来并使用了地球科技 Go 语言进行了实现并分享在了 Github 上。

https://github.com/mitalang/mita

她表示丘丘其中语法部分最独特是 lakucha ,大家都知道 lawa 在丘丘语中为首领的意思,而 kucha 为弱者(引申为随从),而当 lakucha 组合起来后,就形成了先取第一个元素( sada )再取后面的元素。

(lalalakukucha '((1 2) (3 4) ((5 6)) (7 8)))
将返回 5

其他更有趣的例如斐波那契数列,但由于丘丘语没有 0 的表达,因此艾拉本人还是使用了人类的 0.

(muhe(

    (yafib (mita (si)
            (dala ((shato si 0) 0)
                    (da (dala ((aba si du) unu)
                            (da (celi (yafib(movo si du)) (yafib(movo si unu))))
                    ))
            )
    ))

))
好了,目前就是艾拉的发现语法,欢迎大家移步项目地址进行讨论,mita dada!

完全开源,大家可以下载看看。

项目地址: https://github.com/funnyzak/ChatMate-GPT

功能特点如下:

  • 以对话的形式跟 GPT 聊天
  • 支持多种语言设置
  • 支持多种界面主题设置
  • 内置 ChatGPT-Shortcut 提示词库
  • 支持聊天会话自定义设置
  • 高度自定义的 API 设置
  • 支持流式消息回复
  • 支持对回复消息 MarkDown 渲染
  • 支持对消息内容进行内容朗读
  • 支持对消息内容进行导出 CSV
  • 支持对聊天会话进行 iCloud 同步
  • 支持设置多 API Server 设置
  • 支持查询 API 花费
  • 支持 URL Scheme
  • 支持消息会话列表排序
  • 支持聊天字体大小设置
  • 支持实时消息会话 Token 、Cost 显示
  • 聊天提示词支持多个关键词设置
  • 支持回复消息代码块渲染、复制
    ...
    应用预览:
    开源一个基于 OpenAI 的聊天客户端,支持 iOS 和 Android 平台

在一个容器网络工具 passt 上做了一点微小的工作,增加了 --proxy 和 --dns-redirect 等选项,功能和 proxychains / graftcp / nsproxy 类似。使用示例如下:

./pasta --proxy="127.0.0.1:7890" --proxy-type=http wget https://example.com

--proxy-type 为 socks5 类型时支持 UDP:

./pasta --proxy="127.0.0.1:7890" --proxy-type=socks5 uip

上面的 uip 工具可以测试 UDP 转发。
如需指定 DNS 可以使用 --dns-redirect 选项:

./pasta --dns-redirect="1.1.1.1" --proxy="127.0.0.1:7890" bash

定位问题可加上 -d 打印详细日志。

https://github.com/hmgle/passt

DanbooruCLIP——二次元数据集微调的 CLIP 模型

介绍

Huggingface 在线体验: https://huggingface.co/OysterQAQ/DanbooruCLIP

github 主仓库地址( pt 模型文件可以在 release 下载): https://github.com/OysterQAQ/ACG2vec

使用 danburoo2021 数据集对 clip ( ViT-L/14 )模型进行微调。

0-3 epoch 学习率为 4e-6 ,权重衰减为 1e-3

4-8 epoch 学习率为 1e-6 ,权重衰减为 1e-3

标签预处理过程:

            for i in range(length):
                # 加载并且缩放图片
                if not is_image(data_from_db.path[i]):
                    continue

                try:
                    img = self.preprocess(
                        Image.open(data_from_db.path[i].replace("./", "/mnt/lvm/danbooru2021/danbooru2021/")))
                except Exception as e:
                    #print(e)
                    continue
                # 处理标签
                tags = json.loads(data_from_db.tags[i])
                # 优先选择人物和作品标签
                category_group = {}
                for tag in tags:
                    category_group.setdefault(tag["category"], []).append(tag)

                # category_group=groupby(tags, key=lambda x: (x["category"]))
                character_list = category_group[4] if 4 in category_group else []
                # 作品需要过滤以 bad 开头的

                work_list = list(filter(
                    lambda e:
                               e["name"] != "original"
                            , category_group[3])) if 3 in category_group else []
                # work_list=  category_group[5] if 5 in category_group else []
                general_list = category_group[0] if 0 in category_group else []
                caption = ""
                caption_2 = None
                for character in character_list:
                    if len(work_list) != 0:
                        # 去除括号内作品内容
                        character["name"] = re.sub(u"\\(.*?\\)", "", character["name"])
                    caption += character["name"].replace("_", " ")
                    caption += ","
                caption = caption[:-1]
                caption += " "
                if len(work_list) != 0:
                    caption += "from "
                for work in work_list:
                    caption += work["name"].replace("_", " ")
                    caption += " "
                # 普通标签
                if len(general_list) != 0:
                    caption += "with "
                if len(general_list) > 20:
                    general_list_1 = general_list[:int(len(general_list) / 2)]
                    general_list_2 = general_list[int(len(general_list) / 2):]
                    caption_2 = caption
                    for general in general_list_1:
                        if general["name"].find("girl") == -1 and general["name"].find("boy") == -1 and len(
                                re.findall(is_contain, general["name"])) != 0:
                            caption_2 += general["name"].replace("_", " ")
                            caption_2 += ","
                    caption_2 = caption_2[:-1]
                    for general in general_list_2:
                        if general["name"].find("girl") == -1 and general["name"].find("boy") == -1 and len(
                                re.findall(is_contain, general["name"])) != 0:
                            caption += general["name"].replace("_", " ")
                            caption += ","
                    caption = caption[:-1]
                else:
                    for general in general_list:
                        # 如果标签数据目大于 20 则拆分成两个 caption
                        if general["name"].find("girl") == -1 and general["name"].find("boy") == -1 and len(
                                re.findall(is_contain, general["name"])) != 0:
                            caption += general["name"].replace("_", " ")
                            caption += ","
                    caption = caption[:-1]

                # 标签汇总成语句
                # tokenize 语句
                # 返回
                # 过长截断 不行的话用 huggingface 的
                text_1 = clip.tokenize(texts=caption, truncate=True)
                text_2= None
                if caption_2 is not None:
                    text_2 = clip.tokenize(texts=caption_2, truncate=True)
                # 处理逻辑

                # print(img)
                yield img, text_1[0]
                if text_2 is not None:
                    yield img, text_2[0]

预览

二次元数据集微调的 CLIP 模型1
二次元数据集微调的 CLIP 模型2

简介

哔哩哔哩字幕列表是一个浏览器扩展,旨在提供更高效和可控的视频信息获取方式。

该扩展会显示视频的字幕列表,让用户能够快速浏览字幕内容,并通过点击跳转到相应的视频位置。同时,用户还可以方便地下载字幕文件。

除此之外,该扩展还提供了视频字幕总结功能,帮助用户快速掌握视频的要点。

该扩展主要面向知识学习类的视频,帮助用户更好地理解和总结视频内容。

功能特点

  • ? 显示视频的字幕列表
  • ? 点击字幕跳转视频对应位置
  • ? 多种格式复制与下载字幕
  • ? 多种方式总结字幕
  • ? 翻译字幕
  • ? 深色主题

    使用说明

    安装扩展后,在哔哩哔哩网站观看视频时,视频右侧会显示字幕列表面板。

下载扩展

chrome 商店

开源地址

github 开源地址

截图

哔哩哔哩字幕列表浏览器扩展 - 字幕显示,下载,总结,翻译,已开源-列表视图
哔哩哔哩字幕列表浏览器扩展 - 字幕显示,下载,总结,翻译,已开源-文章视图
哔哩哔哩字幕列表浏览器扩展 - 字幕显示,下载,总结,翻译,已开源-总结
哔哩哔哩字幕列表浏览器扩展 - 字幕显示,下载,总结,翻译,已开源-翻译

现在 tulang 终于迈出了第一步,已实现自举,已自举实现了 compiler,std,runtime ,覆盖了上百个测试用例

tu  [options] file.tu        
    build *.tu              编译 tulang 代码成汇编后进行链接生成二进制可执行文件
    -s  *.tu|dir            编译为 tulang 代码为 linux-amd64 汇编文件
    -c  *.s |dir            编译汇编为 elf&pecoff 跨平台可重定向 cpu 指令集文件
    -o  *.o |dir            链接 elf&pecofff 可重定向文件生成最终执行程序
    -d                      开启 trace 日志打印编译详细过程
    -gcc                    支持通过 gcc 链接生成最终可执行程序
    -g                      编译 tu 文件时带上 debug 段信息,支持栈回溯
    -std                    编译 runtime&std 相关内置库代码

到现在为止真正的实现了 0 依赖,坚持写了 4-5 年了,终于可以到试用测试阶段了,之前一直没有宣传过,今天也是第一次在这个论坛发帖,也算是激励一下自己吧

多年来就一直想不清楚一个问题:国内大牛这么多,为什么都在卷高级的优化,到现在为止都没有一个能用的上的真正意义的普通国产编程语言。

毕业多年来就一直想自己做一款对程序员友好的语言,感觉现在的语言为了高性能、安全,往越来越极端的方向走,现在工作中就是用的 rust ,简直折磨人,和当初用 php 时比起来,我认为动态语言才是更符合未来的方向,

但动态语言性能差,而且都是解释型,扩展差,通常通过写 c 语言动态库来实现增加一些底层的特性,最明显的就是 php 生态有个 swoole 扩展,就是写了一套 epoll 网络异步框架动态库,给 php 用,实际用起来效果也够用了,性能也比较好,但这种方式就是有点折磨人

所以我写 tulang 的目标本来就没有很大,只想走动态语言的方向,同时支持静态写法(自己写底层,自己写 syscall), 平时主要的就写写动态语法,没有心智负担,遇到性能问题的时候 就用静态语法写,也非常方便

还有一个目标就是,像 php ,python 这种都依赖 c ,gcc ,没有实现自举,环境依赖非常严重,所以 tulang 也要有自举,自己汇编自己链接,100%原汁原味
仓库地址: https://github.com/tu-lang/tu

最后欢迎大家试用,可以一起优化和做生态,我也会继续做下去,希望有一天能正式发生产版,成为国内的通用编程语言,也谢谢大家的 star

![? [AIGC] 小红书博文生成器:创造内容更进一步。](https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/05/17/1684309817.png!mark)

![? [AIGC] 小红书博文生成器:创造内容更进一步。1](https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/05/17/1684309822.png!mark)

名称:光点红

官网: www.wenanabc.xyz

功能:用于一键生成小红书风格的博文,简单输入对博文的描述,就能自动生成小红书风格的博文。

近来几个月 ChatGPT 的热度只增不减,许多应用都集成了 ChatGPT API ,但是有些使用都要自己去重新搭建一个新的程序,对于 WordPress 用户来说,没什么是一个主题或插件解决不了的问题。

Puock在 3 月份的2.7.6就已经支持了 ChatGPT 的集成,但是那个时候还是比较粗燥,在最新发布的2.7.9版本中已经实现了大部分功能,应该可以满足个人使用需求,包括以下内容:

  • 自定义 OpenAI API 代理域
  • 后台模型参数配置
  • 模型系统预设
  • AI 绘画支持( DALL.E )
  • 是否允许游客使用
  • Stream 方式输出
  • 默认提示语
  • markdown 渲染

    主题下载

    Github:https://github.com/Licoy/wordpress-theme-puock

截图

前台
Puock 主题给你的博客增加 ChatGPT- AI 助手-前台
后台配置
Puock 主题给你的博客增加 ChatGPT- AI 助手-后台配置

介绍

宝塔的证书续期功能一直有 bug ,莫名其妙续期不了,看了宝塔源代码感觉很复杂,自己菜无从下手。

于是动手写了这个面板,目前还有些不完善的地方,欢迎尝鲜!

好玩的地方

可以添加多个 ssh 服务器,然后比如你在命令行 cd 某个目录,你直接拖动文件到终端中,就会自动上传文件到这个目录下。(建议 20MB 以内的文件)。

说明

技术栈是 React TS + Django, 之前也发过帖子,拖到现在才更新,是因为后来发现可能我的 VUE 水平不够,

自己的项目写着写着都忘记该传什么参数了,于是去浅学了下 React 把前端重构了一遍。

仅支持 Debian 11 与 Ubuntu 22.04 ,暂时没精力去适配其他系统。

Watch the video

项目地址

https://github.com/UISSH/backend

演示地址

不要搞破坏,搞破坏的话直接删掉机器。

https://dev.uissh.com/

用户名:root 密码:root

为了避免破坏,后端权限从 root 降级成 admin ,目前仅为演示所用可能一些操作将会失败。
各位老哥部署的时候,尽量使用国外机器,国内机器网络环境估计安装巨慢。

然后强烈建议添加个域名解析,这样做后端将会尽可能的使用证书,比如 api 接口使用证书,phpmyadmin 也会使用证书,ftp 将会强制使用 ftps 协议。总之,一切能用到证书加密的地方,小弟都尽量使用证书去加密传输过程。

还有数据库也有证书加密的配置,目前没有做,没有多少人把数据库对外访问叭。

然后 ftp 支持挂载 s3 ,目前备份功能脚本需要自己写脚本添加到 crontab 中。

最后最后,各位不用这个面板或者担心安全问题,可以直接 systemctl stop ui-ssh 停掉整个面板而不影响网站的正常运行。

所有服务绝对不会去依赖面板的功能,面板只是起一个配置项目的可视化界面,而不应该成为项目运行的依赖。

从参加工作的第1台笔记本就一直采用Thinkpad系列,分别用过T400P,T440P,T480,基本上每4年更换一次,此次也不例外,于2022年9月份购入1台thinkpad T14 Gen3笔记本。不得不说,本人对商务本还是比较钟情于Thinkpad商务系列,毕竟自己是从事设计工作的,曾经中途想改过采用华为mateBOOk系列,但苦于性价比和对初中端独显的需求,还是放弃了更换华为的想法。。。。

 言归正传,新入手的thinkpad T14 Gen3是酷睿系列里算是配置比较高了,配置如下:CPU i7-1260P,内存板载16G(DDR4 3200MHz),硬盘为三星原厂512G,独显为N卡MX550(2G显存)。买之前就已经购入金士顿原厂的2T固态,1条16G三星原厂内存。笔记本到手之前,还没有开机,就已经迫不及待开后盖更换固态和内存了,更换完后安装系统,一次性点亮。安装系统当然是选择了64位WIN11系统,不然对不起这个笔记本的配置。

注意:更换固态硬盘的过程,需要提醒大家,ThinkPad T系列的笔记本不太好安装双面芯片的固态硬盘,起初我买的金士顿的2T固态就是双面芯片的,但笔记本的插槽不太支持,导致固态太厚,固定好尾部螺丝后,固态的PC板会有弯曲受力,时间长了也不确定会不会对固态芯片有影响,所以过了没有2个月,换了同容量单面芯片的固态,三星PM9A1,其实三星的980PRo和长江存储颗粒致态固态也是单面芯片的。

系统完成后,继续安装工作所需软件,CAD2020,PS2023等,但就CAD2020软件使用过程值得和大家分享一下经验。按以前个人安装系统的习惯,安装完系统之后,所有驱动直接用官方驱动替换一遍,觉得官方驱动毕竟是权威的,但经过使用一段时间,就会发现对这款笔记本,官方驱动并不是最适合的,尤其是电源管理相关的驱动等。因为,采用了官方驱动,运行CAD2020时经常出现硬件加速自动禁止,出现卡顿,鼠标漂移等现象,严重导致无法正常工作,心情也非常的不美好。同时发现,笔记本发热量大增,风扇特别狂噪。
接下来为解决此问题,在网上寻求一系列的解决方法,隔一段时间就会重装一次系统,更新驱动,包括显卡官网的驱动,更换其他品牌的内存等,能想到办法都用过了,但均无济于事。无意间,从网站上发现同款笔记本的用户分享提醒,尽量不要安装官方驱动,尤其开关为“Lenovo”标识的,当时还一直纳闷。反正是折腾,也不差这一下,找到了“不忘初心的精简版WIN11系统”,此系统安装后即可自动禁止系统更新,官方驱动更新,驱动安装DIY,用360驱动大师安装完所有驱动,仅采用了联想官方的主板芯片组驱动、显卡驱动和HotKey驱动,根据网友经验系统重启后,一定要关闭智能散热(Fn+T)功能。
这次折腾后,大功告成,世界一片安静,CAD2020运行流畅,CPU占用率低,各硬件温度均正常,散热情况良好,CPU正常温度控制在44℃,显卡48℃。

经验总结,解决办法可能是和更换系统、选择驱动有很大的关系,其他品牌的采用十二代intel CPU的笔记本可能也有此问题,可借鉴。至少对ThinkPad T14 Gen3笔记本是比较适合的。借次机向“不忘初心”大神表示感谢!

中午下班惊闻噩耗,真的有点懵逼,瞬间起了鸡皮疙瘩,人真是太脆弱了。

我能做的就是将博客备份下来,然后基于 ChatGPT 做个 CoolShell 博文问答机器人吧

功能如下:

  • 留个念想,对 CoolShell 博客的 740 篇文章做一个备份(还没爬取完毕,只录入了文章目录,手头有数据的朋友可以 PR)
  • 基于 ChatGPT 实现博客问答机器人
  • 服务化:

    1. 提供 QA 问答接口
    2. 提供文章展示查看接口
  • 微信群实现 QA 聊天
  • 提供 UI
  • 体验:
> >你好,做个自我介绍吧
>  你好,我是 CoolShell 问答机器人,我是由陈皓(左耳朵耗子)创办的。我可以基于上下文中的博客文章信息对用户的提问进行回答。
> 
>  简单说下 XY 问题
> XY 问题指的是当一个人遇到问题 X 时,他会想到一个解决方案 Y ,并去问别人如何实现 Y ,而不是直接问如何解决 X 。这种做法可能会浪费别人的时间和精力,因为 Y 并不一定是解决 X 的最佳方案。最终,讨论问题的人会明白原始问题 X 的本质,并发现 Y 并不是最佳的解决方案。

做的实在仓促(中午午休时间+下班到现在),后续再优化

项目地址:https://github.com/howie6879/coolshell_qa

我用了‮年三‬正版软件,钱‮完花‬了,家‮垮用‬了,现在好不‮易容‬有人发‮解破‬版,你们非说‮上他‬了马子,他‮没上‬上马子,我‮真是‬不知道啊,上了也‮办没‬法啊,谁家不‮破用‬解软件,难道你能保证‮一你‬辈子‮用不‬破解版吗,破解老哥发出来‮分一‬钱没收,破解者他‮本根‬没赚钱,球‮你球‬们别再查下‮了去
来源于pwn3‬
玩笑归玩笑,后门请自查
解压缩zip文件。Windows用户请在Powershell或其他高级Shell中运行,在CMD中运行可能体验不佳。

使用基础爬虫爬取并对爬虫爬取的链接进行漏洞扫描:

xray_windows_386.exe webscan --basic-crawler http://example.com --html-output xxx.html

使用 HTTP 代理进行被动扫描:

设置浏览器 http 代理为http://127.0.0.1:7777,然后使用浏览器访问网页,就可以自动分析代理流量并扫描。

xray_windows_386.exe webscan --listen 127.0.0.1:7777 --html-output xxx.html

快速测试单个 url, 无爬虫:

xray_windows_386.exe webscan --url http://example.com/?a=b --html-output single-url.html

手动指定本次运行的插件:

默认情况下,将会启用所有内置插件,可以使用下列命令指定本次扫描启用的插件。

xray_windows_386.exe webscan --plugins cmd_injection,sqldet --url http://example.comxray webscan --plugins cmd_injection,sqldet --listen 127.0.0.1:7777

生成 ca 证书:

.\xray_windows_386.exe genca

更新历程

1.GUI_TOOLS_闲客增强版 2022.4.17
在原有工具 "GUI肥胖版v8.0" 做出更新改动,再次致谢工具的原作者

  1. GUI_TOOLS_Py7h0n-Axiane_Mac母亲节专版 2023.5.16
    由于未能预期的Bug原因,Mac版本推迟发布
    3.GUI_TOOLS_Py7h0n-Axiane_Win母亲节专版 2023.5.17
    由GUI_TOOLS_Py7h0n-Axiane_Mac母亲节专版 2023.5.16重构页面改进而来
    Gui_Tools_Py7h0n-Axiane_Win母亲节专版

如何使用

双击 一键日卫星 即可,工具箱所在目录不要带有空格

内容递归

  1. 去除GUI界面中平时使用率低工具
  2. 删除文件夹内多余工具
  3. 重置内容取样与界面美化

    彩蛋增加

  4. 一键日卫星工具
  5. 母亲节快乐彩蛋,祝天下所有母亲!

    内容增加

    Gui_Tools_Py7h0n-Axiane_Win母亲节专版

  6. liqun1.6.2交流版
  7. Exp-tools综合利用工具
  8. Hw综合利用工具
  9. weblogicTool_1.1(深信服深蓝实验室天威战队强力驱动)
  10. shiro-v4.6.0
  11. Shiro-550-with-nocc
  12. jboss漏洞利用工具
  13. 若依综合利用工具
  14. Yakit老版本
  15. BerylEnigma 红队编码加密工具箱
  16. Hearts - APP 自动资产分析工具
  17. Tidewebshell免杀工具(定位至根目录使用)
  18. CS 4.7完美去暗桩版本

内容更新

  1. poc2jar新版本
  2. Gr33k工具替换为WIN版本
  3. 蓝队分析辅助工具箱V0.52 (希潭实验室强力驱动)
  4. burpsuite_pro_v2023.3.2(内置burp插件)
  5. Fofaviewer新版本
  6. 掩日免杀工具20230417
  7. GobyV2.4.8
  8. AuxTools Win V3.4
  9. Xray-GUI-CLI V1.9.9高级版本

下载地址:

https://pan.quark.cn/s/1ba08cbdcb49

前置了解:

what AFD is and what is does?
AFD (Ancillary Function Driver)是Windows操作系统中的一个内核模式驱动程序,它也是套接字(Socket) 通信的核心模块之一。
它提供了操作系统与网络协议栈之间的接口,让应用程序能够进行网络通信。支持WinSock,而WinSock是在Windows中访问网络服务的编程接口。
afd.sys 实现了套接字的管理,套接字之间的数据传输,监控套接字上的事件,afd.sys 还负责报告和处理网络通信错误。其实afd.sys功能基本上都是围绕网络套接字。它是网络上程序之间通信通道的端点。而套接字允许程序通过网络连接发送和接收数据。
通过这张图也可以更好的理解一下,而也让理解到winsock是user model下,afd.sys位于Kernel Mode,所以这种一般就需要一个桥梁将其联系来才能到达。

CVE-2023-21768 内核提权漏洞分析

漏洞原理:

该漏洞存在于AFD驱动程序处理用户模式输入/输出(I/O)操作的方式中。
具体来说,该漏洞允许攻击者向AFD驱动程序发送恶意输入/输出控制(IOCTL)请求,这可能导致以提升的权限执行任意代码。
这里从两个方面来看此漏洞,首先是通过补丁对比,其次再去通过公开的利用代码来进行分析和学习最后的利用过程。
从Winbindex拿到打补丁和未打补丁版本
Windows 11 22H2 KB5017389 (+6) x64 10.0.22621.608(未打补丁)
Windows 11 22H2 KB5022303 (+2) x64 10.0.22621.1105(已打补丁)

CVE-2023-21768 内核提权漏洞分析1
可以看见基本没有大改,基本都是细小的差距。基本就可以确定不是特别大的逻辑问题需要重写模块。而且看上去基本就一个函数需要去看一下AfdNotifyRemoveIoCompletion

CVE-2023-21768 内核提权漏洞分析2
其实从汇编代码这里就蛮明显可以看见,补丁处明显是增加了一处代码。来看一下f5之后的样子
CVE-2023-21768 内核提权漏洞分析3
CVE-2023-21768 内核提权漏洞分析4
原来是在之前加了一处if判断,再通过ProbeForWrite来进行检查a3。因为在原版的时候

**(_DWORD **)(a3 + 24)

(ProbeForWrite 的作用是检查用户模式缓冲区是否实际驻留在地址空间的用户模式部分、是否可写以及是否正确对齐。其参数含义如下

void ProbeForWrite(
  [in, out] volatile VOID *Address, //指定用户模式缓冲区的开头
  [in]      SIZE_T        Length, //指定用户模式缓冲区的长
  [in]      ULONG         Alignment //指定用户模式缓冲区开头的所需对齐方式
);)

现在通过函数的作用和diff的结果,确认了漏洞点是出现在AfdNotifyRemoveIoCompletion函数里,那么下一步就是要思考如何触发让我们的poc流程能触发到这个函数里边。
那么先来看一下此函数的交叉引用,来分析其调用序列
CVE-2023-21768 内核提权漏洞分析5
AfdNotifySock-->AfdNotifyRemoveIoCompletion
AfdNotifySock中调用AfdNotifyRemoveIoCompletion,而v7传入的就是后边a3的值。往上追踪代码发现
在到达函数之前很明显有几处条件判断,首先inputbufferlength要等于0x30,要不就会跳到分支LABEL_45就不会走到AfdNotifyRemoveIoCompletion函数那里。还需要Outputbuffer==0

CVE-2023-21768 内核提权漏洞分析6
继续往下边的流程走的话,会发现还经过了ObReferenceObjectByHandle函数,通过gpt的解释理解一下

CVE-2023-21768 内核提权漏洞分析7
所以在这里,我们要用NtCreateIoCompletion函数来创建有效的IO完成对象的句柄。而v11这块就是一个句柄HandleIoCompletion,再来让v10是个有效值来过下边的条件判断,这一处再后边的exp代码中也有体现。

CVE-2023-21768 内核提权漏洞分析8

while ( v13 < Inputbuffer->dwCounter) ) //这里要满足这个条件让其进入循环,将其counter 设为1
    {
      if ( pre_mode )
      {
        v24 = 0i64;
        v25 = 0i64;
        v15 = v13;
        pData1 = Inputbuffer->pData1;
        if ( v12 )
        {
          v17 = pData1 + 16 * v13; //这里是一个循环.上述 v13 < Counter就会循环,然后累加,这样需要的空间就变大了
          v31 = v17;
          if ( (v17 & 3) != 0 )
            ExRaiseDatatypeMisalignment();
          if ( v17 + 16 > *v14 || v17 + 16 < v17 )
            *(_BYTE *)*v14 = 0;
          *(_QWORD *)&v24 = *(unsigned int *)v17;
          *((_QWORD *)&v24 + 1) = *(unsigned int *)(v17 + 4);
          LOWORD(v25) = *(_WORD *)(v17 + 8);
          BYTE2(v25) = *(_BYTE *)(v17 + 10);
        }

最后Counter为1将pData1设置为一块申请出的空间,流程就会走到了AfdNotifyRemoveIoCompletion函数里

我们再来看 AfdNotifyRemoveIoCompletion 函数里还存在一个条件判断:
那就是当我们将dwLen 设置为1的时候,让IoRemoveIoCompletion返回0,if就会跳到pdata2 + 24 =v20那里,而pData2是一块申请出的内存。
这里最主要的就是来添加已完成的I/O操作,从而使IoRemoveIoCompletion正常返回。
使用NtSetIoCompletion ,此函数用于向 I/O 完成端口的完成队列中添加一个 I/O 完成包,这样就可以让IoRemoveIoCompletion返回0。从而最后走到漏洞触发点了。

CVE-2023-21768 内核提权漏洞分析9
总得来说就是dwLen 为 1,然后pData2指向一块可写的内存空间。
然后继续往上跟踪AfdNotifySock,看看是否还有调用
没有发现对该函数的直接调用,但是发现AfdNotifySock的地址在AfdIrpCallDispatch的函数指针表上方。
这张表包含了AFD驱动程序的调度例程,里面的函数都是AFD驱动程序的调度函数。调度例程用于通过调用DeviceIoControl来处理来自Win32应用程序的请求。每个函数的控制代码在AfdIoctlTable中找到。
CVE-2023-21768 内核提权漏洞分析10
从recon2015逆向AFD.sys的pdf文章中,可以知道afd其实是有两个调度表,还有一个是AfdImmediateCallDispatch

CVE-2023-21768 内核提权漏洞分析11
CVE-2023-21768 内核提权漏洞分析12
其实两个表里面的函数都是AFD驱动程序的调度函数,言归正传我们要找到怎么触发到AfdNotifySock函数,
首先需要通过AfdIoctlTable去获取ioctl_code
那么就需要计算AfdImmediateCallDispatch表的起点和指向AfdNotifySock的指针存储位置之间的距离
我们可以计算AfdIoctlTable的索引 在最后一位最后 查找发现AfdNotifySock函数的ioctl_code为12127h
CVE-2023-21768 内核提权漏洞分析13
知道了ioctl_code,就可以在用户层调用DeviceIoControl来访问此函数了。
通过外佬x86matthew发布的代码能让我们很方便的利用起来。他在文章中提到NtCreateFile和NtDeviceIoControlFile 这两个函数,是Winsock库用来与AFD驱动通信使用的。
CVE-2023-21768 内核提权漏洞分析14
将代码编译运行的时候,下断点到afd!AfdNotifySock就会发现能触发到了。比较主要的就是下边两个函数的构造和喂参。

CVE-2023-21768 内核提权漏洞分析15
代码通过直接调用AFD驱动程序来执行套接字操作,为TCP套接字创建句柄,向AFD驱动程序发出IOCTL请求。这样我们就能通过获得的ioctl_code让我们能够触发目标函数。

代码分析:

现在让我们来梳理一下,我们已经知道了怎么触发到AfdNotifySock函数,然后又知道了怎么设置参数让其通过AfdNotifySock函数里的条件判断走到我们的漏洞函数AfdNotifyRemoveIoCompletion里边,在其里边的最后一个条件判断,我们也知道如何进行绕过。然后此时我们也掌握了如何使用代码调用afd程序(也就是触发AfdNotifySock)那么我们就来看看公开的exp,来分析验证我们的结论。

CVE-2023-21768 内核提权漏洞分析16

代码里有两个函数NtCreateIoCompletion,NtSetIoCompletion 一个是用来创建IO完成端口对象并返回其句柄
一个是用来将完成包添加到 I/O 完成端口的完成队列中,正好对上了我们分析的两个函数(IoCompletionObjectType,ObReferenceObjectByHandle)要求绕过的条件。

再到下边引用x86matthew的代码NtCreateFile去触发afd驱动

ObjectFilePath.Buffer = (PWSTR)L"\\Device\\Afd\\Endpoint";
    ObjectFilePath.Length = (USHORT)wcslen(ObjectFilePath.Buffer) * sizeof(wchar_t);
    ObjectFilePath.MaximumLength = ObjectFilePath.Length;

    ObjectAttributes.Length = sizeof(ObjectAttributes);
    ObjectAttributes.ObjectName = &ObjectFilePath;
    ObjectAttributes.Attributes = 0x40;

    ret = _NtCreateFile(&hSocket, MAXIMUM_ALLOWED, &ObjectAttributes, &IoStatusBlock, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 1, 0, bExtendedAttributes, sizeof(bExtendedAttributes));

CVE-2023-21768 内核提权漏洞分析17
这里就是上述分析漏洞时得出的条件,hCompletion 为句柄,data1 data2 为两块内存空间,counter为1
len为1,以此来进行条件判断的绕过。
使用NtDeviceIoControlFile与AFD驱动程序通信,用触发到我们的函数

_NtDeviceIoControlFile(hSocket, hEvent, NULL, NULL, &IoStatusBlock, AFD_NOTIFYSOCK_IOCTL, &Data, 0x30, NULL, 0);
//AFD_NOTIFYSOCK_IOCTL 0x12127

这里的AFD_NOTIFYSOCK_IOCTL 就是上方我们计算得到的ioctl_code为12127,从而完成漏洞的触发。

I/O Ring

然后剩下的就是用于在Windows 11 22H2 独有的后利用原语 I/O Ring,原作写的非常细节易懂,这里俺就不过多叙述,简单陈述一下过程让整个漏洞利用串联起来。主要是 对I/O Ring逆向非常细致,以此他挖掘出一套利用I/O Ring 的读写机制从而达成漏洞利用原语。 它是一个异步 I/O 机制,该机制是仿照 Linux 的io_uring
CVE-2023-21768 内核提权漏洞分析18
这个东西是一个提交队列,而它是一个环形的结构,正好对应下图的Submission Queue

CVE-2023-21768 内核提权漏洞分析19
图中就是Submission Queue Entry的结构,而下图是准备提交给内核的提交队列。

CVE-2023-21768 内核提权漏洞分析20
这三个图就基本上含括了基本的核心。而当上述的情况发生会有如下的情况

  1. I/O ring->RegBuffers and IoRing->RegBuffersCount 设置为0
  2. 内核验证 Sqe->RegisterBuffers. 缓冲区 和 Sqe->RegisterBuffers. 计数都不为零。
  3. 如果请求来自User model,那么数组就可以验证它是否完全位于用户模式地址空间中。数组的大小也可以达到sizeof(ULONG)
  4. 如果环有一个预注册的缓冲区数组,并且新缓冲区的大小与旧缓冲区的大小相同,则旧缓冲区数组将被放回环中,而新缓冲区将被忽略。
  5. 如果前面的检查通过并且要使用新的缓冲数组,则会进行新的分页池分配,然后会从User model的数组复制数据,指向 I/O ring->RegBuffers。
  6. 如果I/O ring 以前指向过一个已注册的缓冲区数组,那么它将被复制到新的内核数组中。任何新的缓冲区都将添加到相同的分配中,在旧缓冲区之后。
  7. 然后就会去探测从用户模式发送的数组中的每个条目,以验证所请求的缓冲区完全处于用户模式,然后将其复制到内核数组中去。
  8. 旧的内核数组(如果存在的话)被释放,操作完成。上述的操作跟之前的漏洞原语其实都有相似之处,都有一部分是将数据从用户模式下copy到内核模式下,而用户模式则是被我们所控制,这样就代表进入内核的部分数据将由用户可操作。
    但是文章又提到数据只从用户模式读取一次,正确地探测和验证这样就避免内核地址的溢出和意外读写。将来对这些缓冲区的任何使用都将从内核缓冲区中获取它们。 这看起来已经扼杀了我们的想法。但是如果我们有一个任意的内核读写漏洞呢。
    IoRing->RegBuffers指向假的、用户控制的数组,我们就可以使用普通的I/O环操作来生成内核读和写到我们想要的地址,通过指定一个索引到我们的假数组作为缓冲区,内核就会将从我们选择的文件读到指定的内核地址,导致任意写入。
    那么最后实现漏洞原语的利用就是下边的步骤:
  9. 使用CreateNamedPipe创建两个命名管道:一个用于内核写入的输入,另一个用于内核读取的输出。至少应该用PIPE_ACCESS_DUPLEX 为标志创建作为输入的管道,以允许读和写。使用PIPE_ACCESS_DUPLEX创建这两个文件
  10. CreateFile打开两个管道的客户端句柄,且具有读和写权限。
  11. 创建 I/O ring: 使用CreateIoRing API
  12. 在堆中分配一个假缓冲区数组: 但是从22H2版本开始,注册的缓冲区数组不再是一个平面数组,而是一个IOP_MC_BUFFER_ENTRY结构的数组
  13. 查找新创建的 I/O ring 对象的地址: 由于 I/O ring 使用新的对象类型IORING_OBJECT,那么就需要使用SystemHandleInformation工具包里的NtQuerySystemInformation 泄漏对象的内核地址,包括我们的新 I/O ring 对象。而IORING_OBJECT 结构位于公共符号表中,所以我们就不需要查找RegBuffers的偏移量。将两者相加就获得了任意写入的目标。
  14. 使用任意写入,用伪用户模式数组的地址覆盖IoRing->RegBuffers。如果之前没有注册一个有效的缓冲区数组,那么还必须覆盖IoRing->RegBuffersCount,使其具有一个非零值。
  15. 用内核指针填充伪缓冲区数组,以便进行读或写操作: ,使用与前面相同的技术来查找内核模块的基地址(NtQuerySystemInformation)或者使用I/O环本身内部可用的指针,这些指针指向分页池中的数据结构。
  16. 通过BuildIoRingReadFile 和 BuildIoRingWriteFile 对 I/O ring中的读写操作进行排队。
  17. 这里说的只是一个大概和我自己觉得能读明白的地方,,,建议要搞懂还是去自己看一下原文理解一下,Yarden Shafir也提供了源代码,跟着调试一下效果会更好。
  18. 这个漏洞利用原语给我的感觉就跟之前Windows Notification Facility(WNF)来实现任意内存读写原语有异曲同工之妙。

最后漏洞复现截图

通过IoRing 的任意地址读写 获取system token 和 本进程 token,从而进行替换操作即可。
CVE-2023-21768 内核提权漏洞分析21
PS: 从看雪师傅那里的文章发现有一些细节的问题(如怎么完成这个函数的需求条件)问chatgpt也是很好的选择,但如果网上资料较少的gpt就很容易胡言乱语导致我理解错的一个东西,,,还是要多方面参考好一点
然后因为此漏洞影响的型号有限,tmd 期间拿Windows 11 装的VS 2022生成项目,出现的错误真是一堆屎一样。避坑! 先后改了无数个项目配置,
先是死活CreateIoRing(IORING_VERSION_3, ioRingFlags, 0x10000, 0x20000, &hIoRing); 这句代码有红色浪线,最后把IntelliSense禁用
又是 error C2065: “IORING_VERSION_3”: 未声明的标识符。明明头文件都引入了,最后我把<ioringapi.h>这个头文件放第一行竟然就好了。
error no target architecture winnt.h 然后又爆这个错误,查一下最后为为预处理器定义添加宏,最后竟然又回去了!!!神经病啊我曹。然后折腾了半小时突然感觉是不是傻逼win11的问题,毕竟win11有一些奇怪bug不止一次了,然后拿win10重新了安装了一下vs2022编译一下就好了。。。

CVE-2023-21768 内核提权漏洞分析22
只想说一句,去你*的win11
参考:
x86matthew
i-o-ring
exp
kanxue
patch-tuesday-exploit-wednesday-pwning-windows-ancillary-function-driver-winsock