Timmoc 的技术小屋

Timmoc 的技术小屋

这里记录技术笔记与日常思考,欢迎常来逛逛 👋

【AIGC】不维护清单:一个易语言小工具怎么用扫盘代替手工列表

标题起得跟红警3无关,是因为这篇不想卖情怀。它想说的是三件你在任何语言、任何项目里都会碰到的事:怎么让一个程序在开发机和在别人机器上 behave 得不一样,怎么在没有 DOM 库的情况下手搓一份结构文本,以及怎么用"扫目录"这件事本身来充当清单。东西是二十行不到的易语言控制台代码,越短越能把方法看干净。 先给个定位。这不是一个 MOD,是一个生成 MOD 用的装配文件的小工具:它扫描一个目录里躺着的资源文件,把它们拼成一份 XML 清单,写回去。程序没有窗口,入口就是 _启动子程序。它的价值全在这几个动作的写法上。我把它拆开讲,不是因为它多精巧,恰恰因为它简陋——二十来行、没有抽象、没有库,简陋到每个决定都必须当场做给你看,反而比一个裹了三层封装的现代项目更能看清"当时为什么这么写、这么写能拿走什么"。 一、是否为调试版() 是一个两档开关,不是一个调试打印 代码第一段就把很多人写死的东西拆成了两条路: .如果 (是否为调试版 ()) 目录 = "E:\Red Alert 3\RA3 MODSDK-X\Mods\M02\Data" .否则 目录 = 取运行目录 () .如果结束 是否为调试版 () 判的是"我现在是在 IDE 里被直接按运行,还是已经被编译成 exe 在跑"。IDE 里跑,它认那个写死的绝对路径;编译出去跑,它改用 取运行目录 (),也就是 exe 自己所在的那个目录。 ...

【AIGC】因为frp太贵,我自己租了一个服务器弄frpc

起因:算了一笔不该算的账 一开始我用的是现成的内网穿透服务。需求也不大:一台家里的 Windows 机器,想把 SSH 和一个 noVNC 的 VNC 端口捅到公网,偶尔远程摸一下。 然后看价格表:免费档限速限流量,想跑满带宽要月付,多一条隧道加钱,独立域名加钱,TCP 转发比 HTTP 更贵。掐着指头算,一年的钱够买一台入门轻量云服务器,而且这台服务器还能干别的。 frp 本身是开源的,服务端 frps 和客户端 frpc 都是白送的,收费的只是"别人帮你托管 frps"。那托管这件事有多难?一台 1 核 1G 的小机器,一个 frps.toml,一个 systemd 单元文件,加起来不到 20 行配置。 ...

【AIGC】摸生协议、找空闲端口、把热键挂到标签上:一份 2018 年 MC 中继工具里的三套可复用手法

这个系列前面几篇,读法只有一种:直接扫 .e 容器里的明文字符串,靠窗体名、控件名、字符串常量去反推程序在干什么。那份能推到底,是因为控制流读不出来。 这篇不一样。这份 2018-07-12 的工程(MC辅助程序.e,18,079 字节,一个程序集、两百多行源码,挂 iconv / shellEx / spec 三个支持库)我用 e-packager 解成了文本,.如果/.循环判断首/.计次循环尾 这些控制流是原样回来的。所以我不再"猜它做什么",可以直接讲它怎么做的、以及哪些做法能从易语言里搬走。 也先更正一句:我在前面几篇里写过"命令序列和操作数是二进制记录、扫不出来",那是对我那套字节扫描成立的描述,被我错当成对这个格式成立的结论发出去了。控制流是能读出来的——这条更正得认。 它本体是一台 Minecraft 联机的中间人:一边用 客户1 连着真实服务器,一边在本地开一个 服务器1,把游戏指向这个本地端口,两个方向的数据在中间来回搬。围绕这条中继挂了三样东西,下面一样一样拆。 ...

【AIGC】12 行的关机程序,重编 11 次滚到 7.4 MB:靠量长度重建自我携带链,再让反编译器对一遍答案

起因 翻旧文件时找到一对 2018 年的易语言程序:一个叫「主程序」,一个叫「检查程序」。下面是主程序的源码,12 行 —— 整篇文章前半的结论全从这 12 行长出来,而检查程序那 10 行我是到第六节才把它解出来的: .版本 2 .程序集 程序集1 .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行 ' 病毒主程序 运行 (“shutdown -s -t 10000”, 真, #隐藏窗口) .判断循环首 (1 = 1) 运行 (“shutdown -s -t 3”, 真, #隐藏窗口) .如果真 (进程_是否存在 (“looking.exe”) = 假) 写到文件 (“C:\Windows\looking.exe”, #图片1) 运行 (“C:\Windows\looking.exe”, 真, #隐藏窗口) .如果真结束 .判断循环尾 () 返回 (0) 逻辑一眼看完:先挂一个 10000 秒(≈2.8 小时)之后的关机,然后进死循环 —— 每一圈重新挂一个 3 秒后关机,并且检查 looking.exe 还在不在,不在就把自己带的 #图片1 写成 C:\Windows\looking.exe 再拉起来。 ...

【AIGC】base64 变表题里出题人换的是表,不是算法:12 行的编解码器,和两个不报错的坑

手上只有两张东西 一道 Misc 题留下来的素材就两样:一张 64 个符号的表,一串密文。 标准表 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 题目表 AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0987654321/+ 密文 mTyq=m7ws=Gs10=NDkp=OTkB=gri1= 题目表读法很简单:它第 1 位是 A,意思是「标准表第 1 个符号 A,在我这里写成 A」;它第 2 位是 a,意思是「标准表的 B 写成 a」。也就是把标准表整个重排了一遍,符号还是那 64 个位置,只是每个位置上的字形换了。 ...

【AIGC】给站内搜索接上语义检索:关键词先出、向量后到,命中的卡片挂一条 Embed 缎带

起因:搜索框不认识同义词 站内搜索一直是 PaperMod 自带的 Fuse。它做字面匹配,好用、快、零成本,但只认字。 我搜「照片怎么传上去」,答案是《图片上传》——它对不上。搜「多个人分密钥保管」,正解是《Shamir 秘密共享方案》——它也对不上。这不是参数没调好,是方法本身没有这个能力:字面匹配不知道「照片」和「图片」是一回事。 所以真正的需求是四条,写下来免得做着做着跑偏: 近义 / 口语化的说法也能命中; 输入即出关键词结果,不能为了语义把首屏拖慢; 两种结果合成一个列表,不能是「关键词一段、语义一段」; 语义那层挂掉时,搜索依然可用。 先定分工:谁快谁先出 先把两条路的速度量出来,再决定怎么拼: 路径 耗时 成本 依赖 Fuse 字面匹配 ~220ms(含 120ms 去抖) 0 本地,索引 850KB 随页面加载 语义向量 ~1.0s(模型 100–300ms,其余是链路) 极小 一次跨网请求 差了五倍,那就别争谁替代谁:关键词永远先渲染,语义结果到了再合并。语义慢、语义挂,都不影响你已经看到的那一屏。 ...

【AIGC】我最后还是对404页下手了

起因是手贱敲错了一个地址 前面两篇记录了这个站的搭建和部署,站点总算是个整体了:随机二次元背景图、内容区半透明毛玻璃卡片、大圆角细描边。然后我故意把地址改错了一位,想看看 404 长什么样。 一行 160px 的灰字「404」,孤零零挂在背景图上。没有卡片、没有描边、没有任何一个地方承认这是同一个站点。 原因很直白,PaperMod 的 404 模板就一行: <div class="not-found">404</div> 配套的样式是 position: absolute; height: 80%; font-size: 160px。我之前给文章列表、归档页、搜索页都补过毛玻璃卡片,唯独漏了这个页面——它甚至不在导航里,只有出错时才会被看见。 ...

【AIGC】没有易语言 IDE 也能读 .e 工程:把自己 2014–2018 的聊天器从二进制里挖出来

起点:一堆积木,但积木盒是锁着的 手上有 26 个易语言(EPL)工程文件,时间从 2014-10 到 2019-08。都是学生时代的东西:聊天器、音乐播放器、QQ 机器人、端口映射、ARP 工具、远程控制、两个小整人程序、一个 PvZ 阳光修改器。 想归档发出来,卡在一个很实际的问题上:.e 是专有二进制容器,没有易语言 IDE 就"打不开"。而我不想为了读一堆旧代码去装 IDE,更不想为了发博客把源码先重写成别的语言。 但"打不开"和"读不了"是两件事。这篇讲怎么把 .e 读出来,以及读出来以后发现的、连我自己都不记得的东西。仓库地址在最后。 第一步:判断它是"存起来"还是"锁起来" 拿到一个陌生的二进制容器,第一个问题不是"格式规范在哪",而是: ...

【AIGC】ARP 欺骗小工具:从 1.1 MB 的易语言容器里读出它到底做了什么

这批归档里时间最晚、体积最大的一个工程:ARP攻击-易语言版.e,2019-08-03,1,136,159 字节。 读 .e 容器的方法在上一篇里讲透了,这篇直接用。 窗体记录 = 一张完整的操作面板 .e 开头 10 KB 是窗体定义区,每个控件一条记录。把这一区的标题字段按顺序拉出来,就是这个工具的全部输入项: 选择网卡 标签EX7 / 编辑框EX7 本机MAC 标签EX9 / 编辑框EX9 路由器MAC 标签EX11 / 编辑框EX11 路由器IP 标签EX6 / 编辑框EX6 被欺骗MAC 标签EX8 / 编辑框EX8 发送间隔 标签EX10 / 编辑框EX10 因特发送MAC 标签EX12 / 编辑框EX13 接收者MAC ← 后面还有 接收者IP 发送者MAC 发送者IP 扫描 按钮EX2 发送 按钮EX3 应用区 分组框EX2 ARP欺骗小工具 是它的窗口标题(存在偏移 264812,扫描时首字节被上一条记录吃掉,显示成 貯RP欺骗小工具 —— 这类缺一字的串是错位读取的正常结果,不要当成原文)。 ...

【AIGC】LP 远程控制:两个 7 KB 的易语言工程,读出一套完整协议(还有一行我自己的源码)

2016-10-02。两个文件: 服务器.e 7,434 字节 客户端.e 6,749 字节 这两个是归档里最适合做全文精读的样本 —— 小到没有编进任何第三方模块,把 gbk_runs 跑一遍,全部产出是 73 条 + 55 条。方法在上一篇。 当一个工程的扫描产出不到 100 条时,你不需要任何筛选技巧,直接把全部串打印出来读就行。这是我这次归档里学到的最实用的一条:研究格式要找最小的样本,写文章也是。 把两个窗口的串并排 服务器.e —— 73 条里的非噪声部分 480 _启动窗口 842 LP 远程控制 ---byXXXXXXXXXX ← 窗口标题(QQ 号已抹) 901 按钮2 1013 记录v 1045 服务器1 ← 监听控件 1167 标签5 1331 右边是图像 1377 标签4 1541 备注 1581 标签3 1745 代码 1918 鼠标类型 1966 按钮1 2078 开始执行 2247 类型 X坐标 Y坐标 ← 一行的格式 2467 写入 备注 2512 备注编辑框 2793 写入 代码 2838 代码编辑框 2955 图片框1 3270 系统核心支持库 3330 特殊功能支持库 3939 \Data\Data代码 4170 _图片框1_鼠标位置被移动 4248 横向位置 4269 纵向位置 4290 功能键状态 4399 鼠标位置 4487 _按钮1_被单击 4726 _按钮2_被单击 4905 _服务器1_客户进入 5075 有一个客户进入…… 5111 _服务器1_数据到达 5321 __启动窗口_尺寸被改变 5567 _服务器1_客户离开 5645 _启动窗口.标题 = “对方已经关闭客户端。” ← 源码原文 5710 _图片框1_鼠标左键被按下 5939 鼠标类型 1 6029 _图片框1_鼠标右键被按下 6258 鼠标类型 3 6348 _标签5_鼠标左键被按下 6856 服务器.exe 客户端.e —— 55 条里的非噪声部分 794 请开始连接---远程客户端 849 时钟1 1073 断开连接l ← 末尾这个 l 不是我打的 1109 客户1 ← 连接控件 1385 第一个是IP第二个是端口 1555 开始连接 1591 编辑框2 1791 编辑框1 2082 系统核心支持库 2142 应用接口支持库 ← SetCursorPos 在这里 2160 EThread 2205 多线程支持库 2448 _按钮1_被单击 2693 正在连接中…… 2751 _客户1_数据到达 3178 鼠标位置 3327 鼠标类型 3392 X坐标 3526 Y坐标 3776 文本类型 4118 您已经停止了远程遥控。 4278 _客户1_连接断开 4408 对方关闭了远程控制服务端。 4673 10.240.211.233 ← 编辑框1 的默认值(学校内网) 4705 连接服务器 4982 连接成功!等待对方执行指令 5252 连接失败,请更改设置再试。 5317 _时钟1_周期事件 5426 定时拍照 ← 关键的一条 5871 鼠标移动 5891 SetCursorPos 6205 客户端.exe 关于串尾那些多余的拉丁字母 断开连接l、找回密码n、顺序播放o、重新连接至服务器(断网重连)l、发送0、检查更新l —— 我这一批工程里到处是这种"末尾多一个 ASCII 字符"的串。 ...