【AIGC】自建一个 CA,给自己的一堆内网服务签证书

起因:手上有一堆半死不活的服务 内网里跑着的东西越来越多了:NAS 的管理页、frp 的 dashboard、noVNC、几个自己写的小后台、偶尔起个文件服务。这些默认都是 HTTP,浏览器地址栏一片"不安全",而我又懒。 最直接的做法是每个服务自签一张: openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365 能用。但用着用着就会烦: 每张证书都要单独信任一次。同一个服务的证书一换(换 IP、换域名、重装),浏览器又红一次。 手机上是灾难。十张证书装十个描述文件,设置里翻半天。 没法验证链。每张都是自己签自己,出问题完全看不出来是证书错了还是服务挂了。 而"自己当 CA"这个选项,一开始听起来很重——好像要有 HSM、要有人管私钥、要有审计。实际上一个 CA 就是一张带 CA:TRUE 的证书加一把私钥,两个文件,一台电脑,半小时。 ...

【AIGC】隐藏文件骗的是眼睛,权限骗的是资源管理器:CLSID 目录、SUBST 藏盘,和 NTFS 那 13 个权限项

三份旧笔记 素材是三份放在一起的旧东西: 一份 NTFS 权限实验总结,全是「禁止某个权限项之后会发生什么」的经验条目; 一张 12 个 CLSID 的对照表,文件名写着「摸来的文件后缀」; 一个 .bat,用 SUBST 加 RECYCLED 目录,把一堆文件变成一台「O 盘」。 它们看起来是两件事,其实是同一个问题的两面:让某个文件「不被人随便碰到」。 而这两面经常被混着讲,一混就错。隐藏改的是「谁去看」,权限改的是「谁能动」。 前者全在显示层,后者在访问检查层——这个区别,我在复测的时候用一条命令就验证了。 ...

【AIGC】把文本当表达式:五个易语言计算小程序共享的一套手法

先看工具箱 五个程序按日期排:计算.e(2016-03-09)、计算无括号.e(2016-03-11)、简单的猜数字游戏(2016-03-29)、计算器 (2).e(2016-04-03)、XXX乘以XX23等于XX13计算.e(2018-07-26)。跨度两年多,但把源码并排放开,用到的命令翻来覆去就是那几个: 寻找文本:找子串第一次出现的位置,找不到返回 -1。这是全套程序里唯一的位置来源; 分割文本:按分隔符切成文本数组; 取文本左边 / 右边 / 中间:按位置和长度切片; 文本替换:按位置替换固定长度; 到整数 / 到数值:把文本拽回数字。 没有任何一个程序调用现成的求值接口——求值、解析、运算符分发,全部是这几个字符串原语手工搭出来的。下面按两个方向展开:把文本切出数字来算(求值器),和把数字写进文本里去试(填洞)。 值得先点破一件事:这套手法里唯一产出数字的命令是 寻找文本,而它在五个程序里同时扮演三种角色——跟 -1 比是存在性检查,位置互相比大小就是优先级表,相减就变成切片长度和扫描游标。所谓"手写求值器",剥到底就是把这一个返回位置的命令按不同形状组织起来。 ...

【AIGC】没有公网 IP 的聊天器,和它一点点长出来的协议

一个人从 2014 到 2018 断断续续写过八个聊天器,中间有一段他自己在归档时从没打开过。这次翻出来的就是那段里的一对:一个客户端、一个服务端,日期都是 2017-10-05。方法还是那套——易语言不用装 IDE 也能把 .e 读成文本,怎么读、读出来哪些是工具塞进去的噪音,另一篇讲容器的已经写了。这里只谈读出来的东西本身:一个很小的 IM 协议,是怎么在这个版本里成形,又跟前后差在哪。 协议的全部,就几行 客户端连上服务器,服务器第一件事是把这条连接的客户标识用一行 IP=<标识> 发回去。这个标识是服务器眼里这条连接本身(就是连接地址),不是什么令牌。从这一刻起,客户端往后发的每一行都以这个标识开头,格式就是空格隔开的 <标识> <命令> <参数…>。服务端拿空格一切,第二段是要干什么: /reg 用户名 密码 注册 /login 用户名 密码 登录 /w 对象 内容 发消息;对象写 all 就群发,否则私聊 /gxIP 用户名 把新地址重新绑回这个用户名之前那次登录 服务器往下只有三种东西:IP= 那种标识下发、登录成功 <用户名>、以及 /List 后面跟一串在线用户名。登录成功 回给客户端的同时,服务器把这对用户丢进两个平行数组,一个存标识、一个存显示名;客户端把收到的用户名当成显示名存下来,界面里发消息就从这个数组挑。注意这一版里显示名是被账号绑死的:登录回来是什么用户名,马甲就是什么,没有登录时临时选一个的余地。 ...

【AIGC】宿舍的灯不想下床关?一个15块的ESP8266加个舵机就替你按了

起因:一个开关的距离 宿舍的布局是这样:门边一面墙上有开关,然后是对面上铺,中间隔着两米多的过道和一地拖鞋。 白天这不叫事。但有两个时刻它非常要命: 熄灯之后。走廊还亮着,宿舍里一片黑,回来全靠手机屏幕那点光穿过去。 已经躺下了。冬天被子捂热了,突然想起来灯没关。 这两种情况下要做的事,本质上都是"站起来走两米,按一下"。人类在这个距离上的懒惰是无穷的,于是有了这个项目。 先排除掉"正经"方案 正常人会想到智能开关、智能灯泡。但宿舍有宿舍的规矩: 方案 为什么不行 换智能开关面板 要拆墙上的开关,属于改线路,宿管看见要说话 换智能灯泡 天花板上的灯管是公家的,换了别人也得用,而且断电后不亮 智能插座 开关控制的是灯管,不是插座的回路,插不上 宿舍整体改 想都别想 结论:不能动电。 那就只剩一条路——找个东西替我去按那个开关。 ...

【AIGC】身份证号第18位:一个把自己当校验器的生成器

先把算法本身讲清楚 这套东西是公开的国家标准,身份证最后一位的算法在任何一本教材里都查得到。抛开归属,它值得单独拎出来,是因为它是一个非常干净的「加权和取模再查表」的范式。 规则是这样:身份证号前 17 位是本体,第 18 位是校验码。对前 17 位逐位乘一个固定的权重,权重从第 1 位到第 17 位依次是 7 9 10 5 8 4 2 1 6 3 7 8 9 10 5 8 4 2 十七个乘积加起来,对 11 取余,余数是 0 到 10 里的某个整数,再用余数去查一张 11 格的映射表: ...

【AIGC】在外想连家里的电脑?但是又完全不想下载应用?那就看看这个novnc

起因:一台不让装软件的电脑 场景很具体:人不在家,需要摸一下家里那台一直开着的 Windows。 正常解法是装个 VNC 客户端,输 IP、输密码、连上。问题是: 别人的电脑不让装东西。公司机、网吧机、朋友的笔记本,装个 exe 要么没权限,要么心里过不去。 手机可以装,但换设备就得再装一遍。而且为了偶尔看一眼桌面,专门装一个常年后台的 App,权限还得给一堆。 有的环境只给你一个浏览器。就这样。 那浏览器能不能直接连 VNC?答案是"协议上不行,加一层就行",而这一层早就有人写好了,就是 noVNC。 为什么浏览器连不上 VNC VNC 用的协议叫 RFB(Remote Framebuffer),设计得非常省:服务端不传画面截图,只传"屏幕上哪个矩形变了、这块矩形的新像素是什么",客户端解码后自己画。所以它在窄带宽下也能动,这是它活了二十多年的原因。 ...

【AIGC】拿一个不存在的 MAC 去要 IP:用 scapy 手搓一个 DHCP Discover

起因 source\repos\新建文件夹\1.py,20 行,from scapy.all import *。 它做的事:构造一个 DHCP Discover 包,用本机 MAC 加 2 的地址当客户端 MAC,从 WLAN 网卡发出去,然后打印收到的回应。 这个脚本我第一次看的时候觉得平平无奇,直到注意到一行: client_mac = "02:00:00:00:00:5c" # 本机已经有IP了,为了模拟,所以我们随机产生一个MAC地址 02:00:00:00:00:5a 是那台机器的 MAC,...:5c 是它 +2。这不是随机,这是「保证不撞车」的伪随机。 ...

【AIGC】2018 年的批量文本改写器:锚点定位、GBK 字节、只弹一次的备份提醒

先说清楚这件东西是什么。2018 年 8 月 4 日,我用易语言写了一个 批量搜索修改文件内文本.e,51,699 字节,两个窗口程序集加起来约 11.5 KB 文本,是这一批旧工程里最大的一个实用工具——其他几个都是玩具,这个是当时真拿来干活的。窗口标题叫"批量搜索修改文件内文本小工具",署名 Lpyax(我当年混聊天室用的 ID),工程元数据里的作者邮箱带了我自己的旧 QQ 号,容器里已经等长替换成 XXXXXXXXXX@qq.com,文件总字节数不变。 它的替换单位是区域,不是字符串 普通 sed 是"找到 A 换成 B"。这个工具不是。界面上是一句完整的话: ...

【AIGC】一段 40 行的字符串打乱实验:把 memcpy 的 4 改成 1,它才肯还原

起因 source\repos 里有个 ConsoleApplication2,整个项目就一个 .cpp,40 行,没有头文件,没有第三方库。 它干的事:把字符串 upx!shell_1s_a_compression_she11 打乱一遍,打印;再拿原文重新打乱一遍(这次是反向的),打印。意思很明显——做个字符串混淆/还原的实验。 upx! 这个前缀不是随便选的。UPX 加壳后的节名叫 UPX0/UPX1,末尾还会留一段 UPX! 标记,分析工具靠它识别壳。这串东西看着像在模拟一个「壳留下的特征串」,然后琢磨怎么把它藏起来。 代码已整理到公开仓库:cnb.cool/t1mmoc/tspace/pwngore/net-reverse-snippets(string-shuffle/original.cpp 是原版,fixed.cpp 是改过一处的版本)。 我没打算跑它。我想知道它到底能不能还原。 一、代码长什么样 unsigned char Buffer[33]; unsigned char Dest[5] = {0}; unsigned char v6; int i, j; strcpy((char*)Buffer, "upx!shell_1s_a_compression_she11"); puts((char*)Buffer); for (i = 14; i > 0; i -= 2) { for (j = 12; j > 0; j -= 4) { memcpy(Dest, &Buffer[j - 4], 1); memcpy(&Buffer[j - 4], &Buffer[j], 1); memcpy(&Buffer[j], Dest, 4); // ← 这里 } v6 = Buffer[i - 2]; Buffer[i - 2] = Buffer[i - 1]; Buffer[i - 1] = v6; } puts((const char*)Buffer); 后面是同一套逻辑的镜像版本(i 从 2 递增、j 从 4 递增),末尾那三个 memcpy 全写成 1 字节。注释里还留着两个版本的痕迹: ...