[{"content":"前言 接上文，继续整理好玩的短代码~\n1️⃣ 卡片样式\n这里插入链接假装是卡片式链接。 好像不能插入图片？ 换行要写空标签。 代码：\nhtml 1#layouts\\shortcodes\\card.html 2{{- $raw := (markdownify .Inner | chomp) -}} {{- $block := findRE 3 \u0026#34;(?is)^\u0026lt;(?:address|article|aside|blockquote|canvas|dd|div|dl|dt|fieldset|figcaption|figure|footer|form|h(?:1|2|3|4|5|6)|header|hgroup|hr|li|main|nav|noscript|ol|output|p|pre|section|table|tfoot|ul|video)\\\\b\u0026#34; 4 $raw 1 -}} 5 \u0026lt;div class=\u0026#34;mycard\u0026#34;\u0026gt; 6 \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt;{{- if or $block (not $raw) }}{{ $raw }}{{ else }} {{ $raw }} {{ end -}}\u0026lt;/div\u0026gt; 7 \u0026lt;/div\u0026gt; css 1#assets\\scss\\custom.scss 2.mycard { 3 padding: 10px 20px; 4 margin: 20px 0; 5 border-radius: 4px; 6 word-break: break-all; 7 background: #d2e5eb14; 8 box-shadow: 0 6px 10px 0 #00000033; 9 .content { 10 line-height: 30px; 11 } 12} 使用：\n1{\u0026lt; card \u0026gt;} 2可以在这里插入链接假装是卡片式链接。 3\u0026lt;br\u0026gt; 4好像不能插入图片？ 5\u0026lt;br\u0026gt; 6换行需要空标签。实际使用需要双括号。 7{\u0026lt; /card \u0026gt;} 8# 实际使用{{ }} 2️⃣ 时间轴\n2026-05-16 blog 美化博客 重新开启博客写作 代码：\n1layouts\\shortcodes\\timeline.html 2{{- $date := .Get \u0026#34;date\u0026#34; -}} {{- $title := .Get \u0026#34;title\u0026#34; -}} {{- $description := .Get \u0026#34;description\u0026#34; -}} {{- $tags := .Get \u0026#34;tags\u0026#34; -}} 3 4\u0026lt;div class=\u0026#34;timeline__row\u0026#34;\u0026gt; 5 \u0026lt;div class=\u0026#34;timeline__time\u0026#34;\u0026gt; 6 \u0026lt;div class=\u0026#34;timeline__time\u0026#34;\u0026gt;{{ $date }}\u0026lt;/div\u0026gt; 7 \u0026lt;div class=\u0026#34;timeline__split-line\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; 8 \u0026lt;/div\u0026gt; 9 \u0026lt;div class=\u0026#34;timeline__content\u0026#34;\u0026gt; 10 \u0026lt;div class=\u0026#34;timeline__tags\u0026#34;\u0026gt; 11 {{- with split $tags \u0026#34;, \u0026#34; -}} {{- range . }}{{- if eq . \u0026#34;样式\u0026#34; }} 12 \u0026lt;span class=\u0026#34;timeline__tag timeline__tag-style\u0026#34;\u0026gt;{{ . }}\u0026lt;/span\u0026gt; {{- else if eq . \u0026#34;文章\u0026#34; }} 13 \u0026lt;span class=\u0026#34;timeline__tag timeline__tag-article\u0026#34;\u0026gt;{{ . }}\u0026lt;/span\u0026gt; {{- else if eq . \u0026#34;页面\u0026#34; }} 14 \u0026lt;span class=\u0026#34;timeline__tag timeline__tag-page\u0026#34;\u0026gt;{{ . }}\u0026lt;/span\u0026gt; {{- else }} 15 \u0026lt;span class=\u0026#34;timeline__tag\u0026#34;\u0026gt;{{ . }}\u0026lt;/span\u0026gt; {{- end }} {{- end }} {{- end }} 16 \u0026lt;/div\u0026gt; 17 \u0026lt;div class=\u0026#34;timeline__title\u0026#34;\u0026gt;{{ $title }}\u0026lt;/div\u0026gt; 18 \u0026lt;div class=\u0026#34;timeline__description\u0026#34;\u0026gt; 19 {{ $description }} 20 \u0026lt;/div\u0026gt; 21 \u0026lt;/div\u0026gt; 22\u0026lt;/div\u0026gt; 23 24\u0026lt;style\u0026gt; 25 .timeline { 26 display: flex; 27 flex-direction: column; 28 } 29 30 .timeline__row { 31 display: flex; 32 padding-left: 4%; 33 height: 90px; 34 } 35 36 .timeline__time { 37 flex: 0 0 110px; 38 color: #5d5d5d; 39 font-size: 17px; 40 text-transform: uppercase; 41 position: relative; 42 display: flex; 43 flex-direction: column; 44 align-items: center; 45 padding: 0.5rem 0; 46 } 47 48 .timeline__time-text { 49 margin: 0; 50 } 51 52 .timeline__split-line { 53 position: absolute; 54 top: 0.5rem; 55 right: -20px; 56 height: 100%; 57 width: 2px; 58 background-color: #84c4e240; 59 z-index: 0; 60 } 61 62 .timeline__split-line:before { 63 content: \u0026#34;\u0026#34;; 64 position: absolute; 65 top: 24%; 66 right: -4px; 67 transform: translateY(-50%); 68 width: 10px; 69 height: 10px; 70 background-color: #c9e5f2; 71 box-shadow: 0 0 0 4px var(--theme); 72 border-radius: 50%; 73 border: 0px solid #84c4e2; 74 z-index: -1; 75 } 76 77 .timeline__content { 78 flex: 1; 79 margin-left: 4.5rem; 80 padding: 0.5rem 0 1.2rem 0; 81 } 82 83 .timeline__title { 84 margin: 0; 85 margin-bottom: 2px; 86 padding-top: 3px; 87 margin-left: 0.5rem; 88 color: var(--content); 89 font-family: var(--font-family-teshu); 90 font-size: 19px; 91 font-weight: 600; 92 width: fit-content; 93 display: inline-block; 94 vertical-align: middle; 95 /* 垂直居中对齐 */ 96 } 97 98 .timeline__tags { 99 display: inline-block; 100 padding: 0; 101 margin-left: 0.3rem; 102 align-items: center; 103 gap: 0.3rem; 104 } 105 106 .timeline__tag { 107 display: inline-block; 108 color: var(--secondary); 109 background-color: #84c4e230; 110 border: 1.5px solid #84c4e230; 111 border-radius: 999px; 112 padding: 0rem 0.5rem; 113 font-size: 12px; 114 white-space: nowrap; 115 line-height: 1.4rem; 116 opacity: 0.8; 117 vertical-align: middle; 118 /* 垂直居中对齐 */ 119 } 120 121 .timeline__description { 122 font-size: 15px; 123 line-height: 1.6; 124 color: #5d5d5d; 125 overflow: hidden; 126 text-overflow: ellipsis; 127 margin: 0.5rem 0 0.4rem 1.5rem; 128 /* 添加 1.5rem 的左侧内边距 */ 129 } 130 /* 为类名为 \u0026#34;timeline__tag-style\u0026#34; 的标签定义颜色 */ 131 132 .timeline__tag-style { 133 background-color: #c581da; 134 /* 替换为你希望的颜色 */ 135 border-color: #c581da; 136 /* 与背景色相同或不同，根据需要自定义 */ 137 color: #FFFFFF; 138 /* 根据需要选择文本颜色 */ 139 } 140 /* 为类名为 \u0026#34;timeline__tag-article\u0026#34; 的标签定义颜色 */ 141 142 .timeline__tag-article { 143 background-color: #92d392; 144 /* 替换为你希望的颜色 */ 145 border-color: #92d392; 146 /* 与背景色相同或不同，根据需要自定义 */ 147 color: #000000; 148 /* 根据需要选择文本颜色 */ 149 } 150 /* 为类名为 \u0026#34;timeline__tag-page\u0026#34; 的标签定义颜色 */ 151 152 .timeline__tag-page { 153 background-color: #707070; 154 /* 替换为你希望的颜色 */ 155 border-color: #707070; 156 /* 与背景色相同或不同，根据需要自定义 */ 157 color: #FFFFFF; 158 /* 根据需要选择文本颜色 */ 159 } 160 161 @media screen and (max-width: 768px) { 162 .timeline__time { 163 font-size: 14px; 164 /* 在小屏幕上使用较小的字体大小 */ 165 } 166 .timeline__title { 167 font-size: 16px; 168 /* 在小屏幕上使用较小的字体大小 */ 169 } 170 .timeline__description { 171 font-size: 14px; 172 /* 在小屏幕上使用较小的字体大小 */ 173 } 174 } 175\u0026lt;/style\u0026gt; 使用：\n1# 实际 {{ }} 2{\u0026lt; timeline date=\u0026#34;\u0026#34; title=\u0026#34;\u0026#34; description=\u0026#34;\u0026#34; tags=\u0026#34;\u0026#34; \u0026gt;} 3️⃣ 图片轮播\n代码：\nhtml 1{{ if .Site.Params.enableimgloop }} 2 \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/css/swiper.min.css\u0026#34;\u0026gt; 3 \u0026lt;!-- Swiper --\u0026gt; 4 \u0026lt;div class=\u0026#34;swiper-container\u0026#34;\u0026gt; 5 \u0026lt;div class=\u0026#34;swiper-wrapper\u0026#34;\u0026gt; 6 {{$itItems := split (.Get 0) \u0026#34;,\u0026#34;}} 7 {{range $itItems }} 8 \u0026lt;div class=\u0026#34;swiper-slide\u0026#34;\u0026gt; 9 \u0026lt;img src=\u0026#34;{{.}}\u0026#34; alt=\u0026#34;\u0026#34;\u0026gt; 10 \u0026lt;/div\u0026gt; 11 {{end}} 12 \u0026lt;/div\u0026gt; 13 \u0026lt;!-- Add Pagination --\u0026gt; 14 \u0026lt;div class=\u0026#34;swiper-pagination\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; 15 \u0026lt;/div\u0026gt; 16 17 \u0026lt;script src=\u0026#34;https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/js/swiper.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 18 \u0026lt;!-- Initialize Swiper --\u0026gt; 19 \u0026lt;script\u0026gt; 20 var swiper = new Swiper(\u0026#39;.swiper-container\u0026#39;, { 21 pagination: \u0026#39;.swiper-pagination\u0026#39;, 22 paginationClickable: true, 23 //自动调节高度 24 autoHeight: true, 25 //键盘左右方向键控制 26 keyboardControl : true, 27 //鼠标滑轮控制 28 mousewheelControl : true, 29 //自动切换 30 //autoplay : 5000, 31 //懒加载 32 lazyLoading : true, 33\tlazyLoadingInPrevNext : true, 34\t//无限循环 35\tloop : true, 36 }); 37 \u0026lt;/script\u0026gt; 38{{ end }} css 1//图片轮播 2.swiper-container { 3 max-width: 820px; 4 margin: 2em auto; 5} 6.swiper-slide { 7 text-align: center; 8 font-size: 18px; 9 background-color: #fff; 10 /* Center slide text vertically */ 11 display: flex; 12 justify-content: center; 13 align-items: center; 14 img { 15 margin: 0 !important; 16 } 17} hugo.ymal/config.ymal/\u0026ndash;\u0026gt; params\u0026ndash;\u0026gt; 添加enableimgloop: true 使用：\n1//实际使用替换成双括号。 2{\u0026lt; imgloop \u0026#34;1.jpg,2.jpg,3.jpg\u0026#34; \u0026gt;} 下面的暂时用不到记录一下~\n4️⃣瀑布流相册\n代码：\n1//gallery.html 2{{ $baseURL := .Site.BaseURL }} 3{{- with (.Get 0) -}} 4{{- $files := readDir (print \u0026#34;/static/\u0026#34; .) }} 5\u0026lt;div class=\u0026#34;gallery-photos\u0026#34;\u0026gt; 6 {{- range (sort $files \u0026#34;Name\u0026#34; \u0026#34;asc\u0026#34;) -}} 7 {{- if ( .Name | findRE \u0026#34;\\\\.(gif|jpg|jpeg|tiff|png|bmp|webp|avif|jxl)\u0026#34;) }} 8 {{- $linkURL := print $baseURL \u0026#34;/\u0026#34; ($.Get 0) \u0026#34;/\u0026#34; .Name | absURL }} 9 \u0026lt;div class=\u0026#34;gallery-photo\u0026#34;\u0026gt; 10 \u0026lt;img class=\u0026#34;photo-img\u0026#34; loading=\u0026#39;lazy\u0026#39; decoding=\u0026#34;async\u0026#34; src=\u0026#34;{{ $linkURL }}\u0026#34; alt=\u0026#34;{{ .Name }}\u0026#34; /\u0026gt; 11 \u0026lt;span class=\u0026#34;photo-title\u0026#34;\u0026gt;{{ .Name | replaceRE \u0026#34;\\\\..*\u0026#34; \u0026#34;\u0026#34;}}\u0026lt;/span\u0026gt; 12 \u0026lt;/div\u0026gt; 13 {{- end }} 14 {{- end }} 15\u0026lt;/div\u0026gt; 16{{- end }} 在 layouts/partials/footer/custom.html 中插入:\n1\u0026lt;!-- 瀑布流相册 --\u0026gt; 2\u0026lt;script src=\u0026#34;https://immmmm.com/waterfall.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 3\u0026lt;script src=\u0026#34;https://immmmm.com/imgStatus.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 4\u0026lt;script\u0026gt; 5document.addEventListener(\u0026#39;DOMContentLoaded\u0026#39;, () =\u0026gt; { 6 //外链 gallery 标签相册瀑布流 7 var photosAll = document.getElementsByTagName(\u0026#39;gallery\u0026#39;) || \u0026#39;\u0026#39;; 8 if(photosAll){ 9 for(var i=0;i \u0026lt; photosAll.length;i++){ 10 photosAll[i].innerHTML = \u0026#39;\u0026lt;div class=\u0026#34;gallery-photos\u0026#34;\u0026gt;\u0026#39;+photosAll[i].innerHTML+\u0026#39;\u0026lt;/div\u0026gt;\u0026#39; 11 var photosIMG = photosAll[i].getElementsByTagName(\u0026#39;img\u0026#39;) 12 for(var j=0;j \u0026lt; photosIMG.length;j++){ 13 wrap(photosIMG[j], document.createElement(\u0026#39;div\u0026#39;)); 14 } 15 } 16 } 17 function wrap(el, wrapper) { 18 wrapper.className = \u0026#34;gallery-photo\u0026#34;; 19 el.parentNode.insertBefore(wrapper, el); 20 wrapper.appendChild(el); 21 } 22 //相册瀑布流 23 let galleryPhotos = document.querySelectorAll(\u0026#39;.gallery-photos\u0026#39;) || \u0026#39;\u0026#39; 24 if(galleryPhotos){ 25 imgStatus.watch(\u0026#39;.gallery-photo img\u0026#39;, function(imgs) { 26 if(imgs.isDone()){ 27 for(var i=0;i \u0026lt; galleryPhotos.length;i++){ 28 waterfall(galleryPhotos[i]); 29 let pagePhoto = galleryPhotos[i].querySelectorAll(\u0026#39;.gallery-photo\u0026#39;); 30 for(var j=0;j \u0026lt; pagePhoto.length;j++){pagePhoto[j].className += \u0026#34; visible\u0026#34;}; 31 } 32 } 33 }); 34 window.addEventListener(\u0026#39;resize\u0026#39;, function () { 35 for(var i=0;i \u0026lt; galleryPhotos.length;i++){ 36 waterfall(galleryPhotos[i]); 37 } 38 }); 39 } 40}); 41\u0026lt;/script\u0026gt; 使用：\n1\u0026lt;gallery\u0026gt;![](1.jpg)![](2.jpg)![](3.jpg)\u0026lt;/gallery\u0026gt; // markdown图片 2 3\u0026lt;gallery\u0026gt;// 外链图片 4 \u0026lt;img src=\u0026#34;https://xxxxx.jpg\u0026#34;\u0026gt; 5 \u0026lt;img src=\u0026#34;https://xxxxx.jpg\u0026#34;\u0026gt; 6 \u0026lt;img src=\u0026#34;https://xxxxx.jpg\u0026#34;\u0026gt; 7\u0026lt;/gallery\u0026gt; 5️⃣ 多图排版\n代码：\n1//custom.css 2.post-content p:has(\u0026gt; img:nth-child(2)){column-count:2;column-gap:8px;margin:6px 0;} 3.post-content p:has(\u0026gt; img:nth-child(3)){column-count:3;} 4.post-content p:has(\u0026gt; img:nth-child(4)){column-count:4;} 5.post-content p:has(\u0026gt; img:nth-child(5)){column-count:5;} 6.post-content p:has(\u0026gt; img:nth-child(6)){column-count:4;} 7.post-content p:has(\u0026gt; img:nth-child(2)) img{display:inherit;} 8.post-content p:has(\u0026gt; img:nth-child(6)) img{margin-bottom:8px;} 使用：\n1![1](1.jpg) 2![2](2.jpg) 3![3](3.jpg) 4 5![1](1.jpg) 6![2](2.jpg) 6️⃣ PPT/PDF 插入\n代码：\n1//pdf.html 2\u0026lt;div class=\u0026#34;pdf\u0026#34; style=\u0026#34; 3 padding-bottom: 66%; 4 position: relative; 5 display: block; 6 width: 100%; 7 border-bottom: 5px solid; 8\u0026#34;\u0026gt; 9 \u0026lt;iframe 10 width=\u0026#34;100%\u0026#34; 11 height=\u0026#34;100%\u0026#34; 12 src=\u0026#34;{{ .Get \u0026#34;src\u0026#34; }}\u0026#34; 13 frameborder=\u0026#34;0\u0026#34; 14 allowfullscreen=\u0026#34;\u0026#34; 15 style=\u0026#34; 16 position: absolute; 17 top: 0; 18 left: 0\u0026#34; \u0026gt; 19 \u0026lt;/iframe\u0026gt; 20\u0026lt;/div\u0026gt; 使用：\n1{\u0026lt; pdf src=\u0026#34;这里放pdf链接，本地文件当然也可以！跟md文件放在一个文件夹里就行。使用的时候请换成双括号。\u0026#34; \u0026gt;} 7️⃣ 哔哩哔哩\n代码：\n1// bilibili.html 2{{ $vid := (.Get 0) }} 3{{ $videopage := default 1 (.Get 1) }} 4{{ $basicQuery := querify \u0026#34;page\u0026#34; $videopage \u0026#34;high_quality\u0026#34; 1 \u0026#34;as_wide\u0026#34; 1 }} 5{{ $videoQuery := \u0026#34;\u0026#34; }} 6 7{{ if strings.HasPrefix (lower $vid) \u0026#34;av\u0026#34; }} 8 {{ $videoQuery = querify \u0026#34;aid\u0026#34; (strings.TrimPrefix \u0026#34;av\u0026#34; (lower $vid)) }} 9{{ else if strings.HasPrefix (lower $vid) \u0026#34;bv\u0026#34; }} 10 {{ $videoQuery = querify \u0026#34;bvid\u0026#34; $vid }} 11{{ else }} 12 \u0026lt;p\u0026gt;Bilibili 视频av号或BV号错误！请检查视频av号或BV号是否正确\u0026lt;/p\u0026gt; 13 \u0026lt;p\u0026gt;当前视频av或BV号：{{ $vid }}，视频分P：{{ $videopage }}\u0026lt;/p\u0026gt; 14{{ end }} 15 16\u0026lt;div class=\u0026#34;video-wrapper\u0026#34;\u0026gt; 17 \u0026lt;iframe src=\u0026#34;https://player.bilibili.com/player.html?{{ $basicQuery | safeURL }}\u0026amp;{{ $videoQuery | safeURL }}\u0026#34; 18 scrolling=\u0026#34;no\u0026#34; 19 frameborder=\u0026#34;no\u0026#34; 20 framespacing=\u0026#34;0\u0026#34; 21 allowfullscreen=\u0026#34;true\u0026#34; 22 \u0026gt; 23 \u0026lt;/iframe\u0026gt; 24\u0026lt;/div\u0026gt; 使用：\n1{\u0026lt; bilibili BV1V7411d7iW 0 1 \u0026gt;} //BV号，0/1为是否自动播放,分p数；使用记得双括号 截止，博客的装修告一段落，接下来要开始搞内容了。\n","date":"2026-05-17T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E5%8D%9A%E5%AE%A2%E7%BE%8E%E5%8C%963/1_hu_cd12862347af94f8.jpg","permalink":"https://mofei-blog.pages.dev/p/%E5%8D%9A%E5%AE%A2%E7%BE%8E%E5%8C%963/","title":"博客搭建 | Hugo Stack 主题装修笔记（3）"},{"content":"","date":"2026-05-17T00:00:00Z","permalink":"https://mofei-blog.pages.dev/p/%E8%AF%BB%E8%AE%BA%E6%96%87/","title":"论文研读"},{"content":"","date":"2026-05-17T00:00:00Z","permalink":"https://mofei-blog.pages.dev/p/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/","title":"年度总结"},{"content":"","date":"2026-05-17T00:00:00Z","permalink":"https://mofei-blog.pages.dev/p/%E4%B8%80%E4%BA%9B%E7%A2%8E%E7%A2%8E%E5%BF%B5/","title":"碎碎念"},{"content":"1.概述 学习目标： 1.描述有关机密性、完整性和可用性的关键安全要求 2.讨论安全威胁、安全攻击的类型，给出不同类型计算机和网络资产面临这几类威胁和攻击的例子 3.概述计算机安全的基本要求 4.解释基本安全设计原则 5.讨论攻击面和攻击树的用途 6.理解全面安全策略的主要方面 1.1计算机安全的概念 计算机安全：保证信息系统资产的机密性、完整性和可用性的措施和控制方法，其中资产包括硬件、软件、固件以及要处理、存储和通信的信息 CIA三元组：机密性(confidentiality)、完整性(integrity)和可用性(availability)\n机密性： 1.数据机密性 2.隐私性 完整性： 1. 2. 可用性： 1.1.1计算机安全的定义 1.1.2实例 1.1.3计算机安全面临的挑战 1.1.4一个计算机安全模型 1.2威胁、攻击和资产 1.2.1威胁和攻击 1.2.2威胁和资产 1.3安全功能要求 1.4基本安全设计原则 1.5攻击面和攻击树 1.5.1攻击面 1.5.2攻击树 1.6计算机安全策略 1.6.1安全策略 1.6.2安全实施 1.6.3保证和评估 1.7标准 2.密码编码工具 2.1用对称加密实现机密性 2.1.1对称加密 2.1.2对称分组加密算法 2.1.3流密码 2.2消息认证和散列函数 2.2.1利用对称加密实现认证 2.2.2无须加密的消息认证 2.2.3安全散列函数 2.2.4散列函数的其他应用 2.3公钥加密 2.3.1公钥加密的结构 2.3.2公钥密码体制的应用 2.3.3对公钥密码的要求 2.3.4非对称加密算法 2.4数字签名和密钥管理 2.4.1数字签名 2.4.2公钥证书 2.4.3利用公钥加密实现对称密钥交换 2.5随机数和伪随机数 2.5.1随机数的使用 2.5.2随机和伪随机 2.6实际应用：存储数据的加密 3.用户认证 3.1数字用户认证方法 3.1.1数字用户认证模型 3.1.2认证方法 3.1.3用户认证的风险评估 3.2基于口令的认证 3.2.1口令的脆弱性 3.2.2散列口令的使用 3.2.3破解“用户选择”口令 3.2.4口令文件访问控制 3.2.5 口令选择策略 3.3基于令牌的认证 3.3.1 存储卡 3.3.2 智能卡 3.3.3 电子身份证 3.4生物特征认证 3.4.1 用于生物特征认证应用的身体特征 3.4.2 生物特征认证系统的运行 3.4.3 生物特征认证的准确度 3.5远程用户认证 3.5.1口令协议 3.5.2 令牌协议 3.5.3静态生物特征认证协议 3.5.4动态生物特征认证协议 3.6 用户认证中的安全问题 3.7 实际应用：虹膜生物特征认证系统 3.8案例学习：ATM系统安全问题 4.访问控制 4.1 4.1.1 4.1.2 4.2 4.3 4.3.1 4.3.2 4.4 4.4.1 4.4.2 4.5 4.6 4.6.1 4.6.2 4.6.3 4.7 4.7.1 4.7.2 4.7.3 4.8 4.8.1 4.8.2 4.9 5.数据库与云安全 5.1 5.2 5.3 5.3.1 5.3.2 5.4 5.4.1 5.4.2 5.4.3 5.4.4 5.5 5.5.1 5.5.2 5.5.3 5.6 5.7 5.8 5.8.1 5.8.2 5.8.3 6.恶意软件 6.1 6.1.1 6.1.2 6.1.3 6.2 6.3 6.3.1 6.3.2 6.3.3 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.4.7 6.4.8 6.4.9 6.5 6.5.1 6.5.2 6.5.3 6.6 6.6.1 6.6.2 6.6.3 6.7 6.7.1 6.7.2 6.8 6.8.1 6.8.2 6.8.3 6.9 6.9.1 6.9.2 6.9.3 6.9.4 6.10 6.10.1 6.10.2 6.10.3 6.10.4 7.拒绝服务攻击 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.2 7.2.1 7.2.2 7.2.3 7.3 7.4 7.4.1 7.4.2 7.5 7.5.1 7.5.2 7.5.3 7.6 7.7 8.入侵检测 8.1 8.2 8.2.1 8.2.2 8.2.3 8.3 8.3.1 8.3.2 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.5 8.5.1 8.5.2 8.5.3 8.5.4 8.6 8.7 8.8 8.9 8.9.1 8.9.2 9.防火墙与入侵防御系统 9.1 9.2 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.4.5 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 10.缓存区溢出 10.1 10.1.1 10.1.2 10.1.3 10.2 10.2.1 10.2.2 10.3 10.3.1 10.3.2 10.3.3 10.3.4 10.3.5 11.软件安全 11.1 11.2 11.2.1 11.2.2 11.2.3 11.2.4 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.3.5 11.4 11.4.1 11.4.2 11.4.3 11.4.4 11.4.5 11.4.6 11.5 12.操作系统安全 12.1 12.2 12.3 12.3.1 12.3.2 12.3.3 12.3.4 12.3.5 12.3.6 12.4 12.4.1 12.4.2 12.5 12.5.1 12.5.2 12.6 12.6.1 12.6.2 12.6.3 12.6.4 12.6.5 12.6.6 12.6.7 12.7 12.7.1 12.7.2 12.7.3 12.7.4 12.7.5 12.8 12.8.1 12.8.2 12.8.3 12.8.4 12.8.5 13.云和IoT安全 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.3 13.3.1 13.3.2 13.3.3 13.3.4 13.3.5 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.5.2 13.5.3 13.5.4 22.Internet安全协议好标准 22.1 22.1.1 22.1.2 22.2 22.2.1 22.2.2 22.3 22.3.1 22.3.2 22.3.3 22.4 22.4.1 22.4.2 22.5 22.5.1 22.5.2 22.5.3 22.5.4 22.5.5 23.Internet认证应用 23.1 23.1.1 23.1.2 23.1.3 23.1.4 23.2 23.3 24.无线网络安全 24.1 24.1.1 24.1.2 24.2 24.2.1 24.2.2 24.3 24.3.1 24.3.2 24.3.3 24.3.4 24.4 24.4.1 24.4.2 24.4.3 24.4.4 24.4.5 24.4.6 24.4.7 ","date":"2025-11-26T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E7%AC%94%E8%AE%B0/1_hu_c15c78034f8ffe7e.jpg","permalink":"https://mofei-blog.pages.dev/p/%E7%AC%94%E8%AE%B0/","title":"计算机安全：原理与实践"},{"content":"渗透环境准备 渗透工具 Java JDK 8 python miniconda3虚拟环境中安装 VMware 虚拟机 Linux使用基础 kail Linux 1、下载Kail Linux 的iso镜像，使用VMWare虚拟机安装镜像，然后搭建一个kail Linux环境 2、配置Kail Lnux 虚拟靶场环境搭建 Docker 一个开源的应用容器引擎，让开发者可以打包应用及依赖包到一个可移植的容器中，然后发布到任何流行的Linux或Windows机器上，也可以实现虚拟化容器（使用沙箱机制） 组成部分 Docker Client ：客户端 Docker Daemon ：守护进程 Docker Image ：镜像 Docker Container ：容器 安装 1、下载docker(这里使用了脚本) 2、查看docker服务状态 [root@localhost ~]# systemctl status docker 3、启动docker服务 [root@localhost ~]# systemctl start docker 4、开启自动启动Docker服务 [root@localhost ~]# systemctl enable docker 5、安装docker-compose（虽然新版Docker自带了compose命令，但是不好用，还是自己安装一个docker-compose） 6、配置为国内镜像源 基本操作 镜像操作 1、查看镜像 [root@localhost ~]# docker images/docker image ls -a 2、拉取镜像 [root@localhost ~]# docker image pull +镜像名 3、删除镜像 [root@localhost ~]# docker image rm +镜像名/docker rmi +镜像名/镜像ID（正在运行的容器是无法删除的） 4、停止镜像[root@localhost ~]# docker ps 5、镜像保存[root@localhost ~]# docker save -o 保存的文件 镜像名 6、镜像加载[root@localhost ~]# docker load -i 镜像文件 容器操作 1、创建容器 [root@localhost ~]# docker run -it +镜像名 /bin/bash（交互式容器）/docker run -dit +镜像名 /bn/bash（守护式容器） 2、查看容器 [root@localhost ~]# docker ps /docker container ls/docker ps -a/docker container ls --all 3、启动容器 [root@localhost ~]# docker start +容器ID（容器名）/docker container start +容器ID（容器名） 4、停止容器 [root@localhost ~]# docker stop +容器ID（容器名）/docker container stop +容器ID（容器名） 5、删除容器 [root@localhost ~]# docker rm +容器ID（容器名）/docker container rm +容器ID（容器名）/docker container rm -f +容器ID（容器名） 6、容器保存为镜像 [root@localhost ~]# docker commit +容器名 镜像名 渗透测试基础 网络协议基础 分层网络协议（OSI七层、TCP四层、五层） 这里使用的是五层模型\n应用层 应用层关注于为用户提供应用功能，不用关心数据是如何传输的，工作在操作系统中的用户态。 应用层包含各种应用程序协议，如HTTP、FTP、STMP、POP3等 传输层 传输层负责为应用层提供网络支持，有两个传输协议TCP和UDP 1. TCP 传输层控制协议，具有流量控制、超时重传、拥塞控制等功能，可以保证数据包的可靠传输 TCP分段：TCP协议中将发送的数据包分块，这个分块称为一个TCP段，当数据包较大的时候，如果有一个分块丢失或损坏，只需要重新发送这个分块即可 端口：接受设备收到传输层发来的数据包时，需要编号将应用区分开，这个编号就是端口。 2. UDP 用户数据协议，只负责发送数据包，但不能保证数据包能否到达对方，但实时性相对更好，传输效率较高 UDP也可以实现可靠传输，将TCP的特性应用在UDP上就行，但代价较高 网络层 网络层最常见的协议是IP协议，IP协议会将传输层的报文作为数据部分，再加上IP包头组装成IP报文 IP协议的作用是寻址和路由： 1. 寻址:是告诉设备去往的下一个目的地该朝那个方向走，像是导航 2.路由:是根据下一个目的地址选择路径，像是操作方向盘 网络层需要IP地址对通信设备进行编号，IP地址是32位，IP地址的格式为：xxx.xxx.xxx.xxx IP地址由网络号和主机号组成，网络号负责识别IP地址属于哪个子网，主机号识别同一子网中不同的主机 在寻址过程中，先匹配到相同的网络号，才会去找对应的主机 还有个子网掩码的概念，结合子网掩码，可以算出IP地址的网络号和主机号 数据链路层 数据链路层专门识别网络中的设备，让数据子在一个链路中传输，主要为网络层提供链路级别传输的服务 数据链路层主要靠设备的MAC地址，它是用来唯一标识设备的，通过路由器计算出下一个目的地的IP地址，然后通过ARP协议找到该目的地的MAC地址，然后就知道IP地址是哪个设备的了 物理层 物理层主要是靠物理设备进行连接，如中继器、集线器、网桥、交换机、路由器 网关等 图解IP IP的作用是在复杂的网络环境中奖数据包发送给最终目的主机 每台设备都有一个IP和默认网关，IP通过路由器中的路由表进行寻址 路由协议：多个不相连的设备进行互通\nIP和MAC的关系：IP负责在没有直连的两个网络之间进行通信传输，MAC是实现两个直连设备之间的通信，在通信过程中，源IP和目的IP是不变的，而源MAC和目的MAC一直在变化 1、IP地址分类 A类：0+网络号（7位）+主机号（24位）0.0.0.0-127.255.255.255 B类：10+网络号（14位）+主机号（16位）120.0.0.0-191.255.255.255 C类：110+网络号（21位）+主机号（8位）192.0.0.0-223.255.255.255 [注：两个特殊IP地址： 主机号全为0：192.168.1.0,指定为某个网络 主机号全为1:192.168.1.255,指定某个网络下的所有主机用于广播 ] D类：1110+组播地址（28位） E类：11110+留待后用（27位） 2、子网划分 控制网络位来换分子网，可以借助主机位增加网络位，如127.0.0.0/7 3、子网掩码 网络号全为1，主机号全为0 Burpsuite burpsuite是一款集成化的渗透测试工具，集合了多种渗透测试组件，自动化或手动完成对web应用的渗透和攻击\n使用 proxy(代理) BP通过以拦截代理的方式，拦截所以通过代理的网络流量，如客户端的请求数据、服务端的返回信息等（主要拦截） 图解HTTP 信息收集 环境搭建 SQL注入 文件上传 命令执行 漏洞扫描 Linux反弹shell 漏洞攻击利用 渗透测试框架 内网信息收集 内往代理隧道搭建 权限提升 痕迹清除 绕过杀毒软件 ","date":"2025-11-24T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E6%95%B4%E7%90%86%E8%B8%A9%E5%9D%91%E6%97%A5%E8%AE%B0/1_hu_a37b49f727b13e1.jpg","permalink":"https://mofei-blog.pages.dev/p/%E6%95%B4%E7%90%86%E8%B8%A9%E5%9D%91%E6%97%A5%E8%AE%B0/","title":"渗透知识整理1"},{"content":"环境部署 windows搭建 upload-labs 一个专门用于学习和测试文件上传漏洞的开源靶场\nc0ny1/upload-labs:一个想帮你总结所有类型的上传漏洞的靶场 （github有时候国内访问慢）\nupload-labs(gitee.com) phpstudy2018 phpstdy2018 安装好phpstudy后，将解压后的upload-labs文件夹放到phpstyudy安装地址下的PHPTutorial\\WWW目录下 如果是小皮面板，放置在WWW目录下，同时要注意php的版本 Burpsuite 配合抓包使用\n验证 打开phpstudy,点击开启 在浏览器中输入localhost（或127.0.0.1），页面返回Hello world,证明phpstudy安装成功 访问 在浏览器中输入localhost/upload-labsd/(127.0.0.1/upload-labs),出现下面的页面，就证明upload-labs安装成功 常用的测试代码 一句话木马 1\u0026lt;?php @eval($_POST[\u0026#39;cmd\u0026#39;]);? \u0026gt; phpinfo 1\u0026lt;?php phpinfo();? \u0026gt; 关卡 Pass-01（JS绕过） (方法很多，这里使用burp抓包，修改后缀名)\n1、首先查看源码，允许上传.jpg/.png/.gif文件 2.上传一个伪装成正常图片的php文件，并通过burp抓包 显示已经上传一个文件，但是访问图片地址，访问不了 3.查看burp抓包内容 可以看见上传的内容，将抓包内容发送给Repeater ,然后修改文件名的后缀，点击发送，查看响应后的内容 （纠错把上传的内容改成phpinfo();再发送，一点小手误） 在img处有一个上传地址，复制这个地址到浏览器访问 会出现下面的页面 Pass-02(MIME验证) 方法一：上传图片文件，修改后缀 将php文件后缀名改为jpg上传，在burp中抓包进行后缀名修改 然后得到一个上传地址，将其复制到浏览器进行访问，得到以下内容： 方法二：上传php文件，修改content_type 先上传一张正常的图片，抓包看数据包的内容 可以看到Content-Type为image/jpeg 再上传一个php文件，Content-Type为application/octet-stream 就爱那个数据包发送到Repeater,将Content-Type改为image/jpeg，点击发送查看 得到一个上传地址，将其复制到浏览器查看器内容，内容如下： Pass-03（黑名单绕过-特殊后缀名） 查看第三关源码，对常用的绕过方法进行了严格的限制，那这个时候参考第一二关，可以进行后缀名进行修改 在特定环境中一些特殊后缀可以当做php文件解析，如php、php1、php2、php3、php4、php5、php6、php7、pht、phtm、phtml\n上传一个.php3文件尝试一下，发现可以上传成功，使用burp抓包看一下内容 得到一个上传地址，将其复制到浏览器访问，发现页面没有显示信息 需要修改Apache的配置文件，将php3文件解析成php文件 修改Apache的httpd.conf文件，在此行添加.php3,然后重启服务\n1 AddType application/x-httpd-php .php .phtml .php3 然后刷新网页，可以看到以下信息 Pass-04(黑名单绕过-.htaccess) 首先查看源代码 可以看到本关文件的限制类型特别多，但没有限制.htaccess文件。\n1 $deny_ext = array(\u0026#34;.php\u0026#34;,\u0026#34;.php5\u0026#34;,\u0026#34;.php4\u0026#34;,\u0026#34;.php3\u0026#34;,\u0026#34;.php2\u0026#34;,\u0026#34;.php1\u0026#34;,\u0026#34;.html\u0026#34;,\u0026#34;.htm\u0026#34;,\u0026#34;.phtml\u0026#34;,\u0026#34;.pht\u0026#34;,\u0026#34;.pHp\u0026#34;,\u0026#34;.pHp5\u0026#34;,\u0026#34;.pHp4\u0026#34;,\u0026#34;.pHp3\u0026#34;,\u0026#34;.pHp2\u0026#34;,\u0026#34;.pHp1\u0026#34;,\u0026#34;.Html\u0026#34;,\u0026#34;.Htm\u0026#34;,\u0026#34;.pHtml\u0026#34;,\u0026#34;.jsp\u0026#34;,\u0026#34;.jspa\u0026#34;,\u0026#34;.jspx\u0026#34;,\u0026#34;.jsw\u0026#34;,\u0026#34;.jsv\u0026#34;,\u0026#34;.jspf\u0026#34;,\u0026#34;.jtml\u0026#34;,\u0026#34;.jSp\u0026#34;,\u0026#34;.jSpx\u0026#34;,\u0026#34;.jSpa\u0026#34;,\u0026#34;.jSw\u0026#34;,\u0026#34;.jSv\u0026#34;,\u0026#34;.jSpf\u0026#34;,\u0026#34;.jHtml\u0026#34;,\u0026#34;.asp\u0026#34;,\u0026#34;.aspx\u0026#34;,\u0026#34;.asa\u0026#34;,\u0026#34;.asax\u0026#34;,\u0026#34;.ascx\u0026#34;,\u0026#34;.ashx\u0026#34;,\u0026#34;.asmx\u0026#34;,\u0026#34;.cer\u0026#34;,\u0026#34;.aSp\u0026#34;,\u0026#34;.aSpx\u0026#34;,\u0026#34;.aSa\u0026#34;,\u0026#34;.aSax\u0026#34;,\u0026#34;.aScx\u0026#34;,\u0026#34;.aShx\u0026#34;,\u0026#34;.aSmx\u0026#34;,\u0026#34;.cEr\u0026#34;,\u0026#34;.sWf\u0026#34;,\u0026#34;.swf\u0026#34;,\u0026#34;.ini\u0026#34;); 可以自定义一个.htaccess绕过检测。 上传一个.htaccess\n1\u0026lt;FilesMatch \u0026#34;3.jpg\u0026#34;\u0026gt; 2SetHandler application/x-httpd-php 3\u0026lt;/FilesMatch\u0026gt; 这个文件的内容是告诉Apache，当碰到3.jpg时，按照php去解析。\n准备好一个3.jpg(php文件改后缀名) 分别将.htaccess和3.jpg上传到服务器,查看本地文件，可以看到已经成功上传到服务器 然后复制照片地址进行访问，显示下列页面： Pass-05(黑名单绕过-.user.ini) 首先查看源代码： 这关的禁止上传文件中多了.htaccess\n1 $deny_ext = array(\u0026#34;.php\u0026#34;,\u0026#34;.php5\u0026#34;,\u0026#34;.php4\u0026#34;,\u0026#34;.php3\u0026#34;,\u0026#34;.php2\u0026#34;,\u0026#34;.html\u0026#34;,\u0026#34;.htm\u0026#34;,\u0026#34;.phtml\u0026#34;,\u0026#34;.pht\u0026#34;,\u0026#34;.pHp\u0026#34;,\u0026#34;.pHp5\u0026#34;,\u0026#34;.pHp4\u0026#34;,\u0026#34;.pHp3\u0026#34;,\u0026#34;.pHp2\u0026#34;,\u0026#34;.Html\u0026#34;,\u0026#34;.Htm\u0026#34;,\u0026#34;.pHtml\u0026#34;,\u0026#34;.jsp\u0026#34;,\u0026#34;.jspa\u0026#34;,\u0026#34;.jspx\u0026#34;,\u0026#34;.jsw\u0026#34;,\u0026#34;.jsv\u0026#34;,\u0026#34;.jspf\u0026#34;,\u0026#34;.jtml\u0026#34;,\u0026#34;.jSp\u0026#34;,\u0026#34;.jSpx\u0026#34;,\u0026#34;.jSpa\u0026#34;,\u0026#34;.jSw\u0026#34;,\u0026#34;.jSv\u0026#34;,\u0026#34;.jSpf\u0026#34;,\u0026#34;.jHtml\u0026#34;,\u0026#34;.asp\u0026#34;,\u0026#34;.aspx\u0026#34;,\u0026#34;.asa\u0026#34;,\u0026#34;.asax\u0026#34;,\u0026#34;.ascx\u0026#34;,\u0026#34;.ashx\u0026#34;,\u0026#34;.asmx\u0026#34;,\u0026#34;.cer\u0026#34;,\u0026#34;.aSp\u0026#34;,\u0026#34;.aSpx\u0026#34;,\u0026#34;.aSa\u0026#34;,\u0026#34;.aSax\u0026#34;,\u0026#34;.aScx\u0026#34;,\u0026#34;.aShx\u0026#34;,\u0026#34;.aSmx\u0026#34;,\u0026#34;.cEr\u0026#34;,\u0026#34;.sWf\u0026#34;,\u0026#34;.swf\u0026#34;,\u0026#34;.htaccess\u0026#34;); 对比第四关的限制类型，发现.ini没有被限制\n从PHP5.3.0开始，PHP支持每个目录使用.user.ini文件，这类似于.htaccess文件。除了php.ini，PHP还会再每个目录中查找.user.ini，。.user.ini文件中的配置会像php.ini中的配置一样被PHP处理 1、创建一个.user.ini文件，并把它上传\n1auto_prepend_file=4.jpg 此文件的意思是：所有的php文件中都自动包含4.jpg,.user.ini相当于一个自定义的php.ini文件\n然后上传4.jpg\n显示上传成功\n在浏览器访问之前上传的1.php，出现下列的页面： 这里有另一个思路的绕过方法，感觉很有意思 Pass-06 (黑名单绕过-大小写绕过) 首先查看源码，其限制条件如下：\n1 2 $deny_ext = array(\u0026#34;.php\u0026#34;,\u0026#34;.php5\u0026#34;,\u0026#34;.php4\u0026#34;,\u0026#34;.php3\u0026#34;,\u0026#34;.php2\u0026#34;,\u0026#34;.html\u0026#34;,\u0026#34;.htm\u0026#34;,\u0026#34;.phtml\u0026#34;,\u0026#34;.pht\u0026#34;,\u0026#34;.pHp\u0026#34;,\u0026#34;.pHp5\u0026#34;,\u0026#34;.pHp4\u0026#34;,\u0026#34;.pHp3\u0026#34;,\u0026#34;.pHp2\u0026#34;,\u0026#34;.Html\u0026#34;,\u0026#34;.Htm\u0026#34;,\u0026#34;.pHtml\u0026#34;,\u0026#34;.jsp\u0026#34;,\u0026#34;.jspa\u0026#34;,\u0026#34;.jspx\u0026#34;,\u0026#34;.jsw\u0026#34;,\u0026#34;.jsv\u0026#34;,\u0026#34;.jspf\u0026#34;,\u0026#34;.jtml\u0026#34;,\u0026#34;.jSp\u0026#34;,\u0026#34;.jSpx\u0026#34;,\u0026#34;.jSpa\u0026#34;,\u0026#34;.jSw\u0026#34;,\u0026#34;.jSv\u0026#34;,\u0026#34;.jSpf\u0026#34;,\u0026#34;.jHtml\u0026#34;,\u0026#34;.asp\u0026#34;,\u0026#34;.aspx\u0026#34;,\u0026#34;.asa\u0026#34;,\u0026#34;.asax\u0026#34;,\u0026#34;.ascx\u0026#34;,\u0026#34;.ashx\u0026#34;,\u0026#34;.asmx\u0026#34;,\u0026#34;.cer\u0026#34;,\u0026#34;.aSp\u0026#34;,\u0026#34;.aSpx\u0026#34;,\u0026#34;.aSa\u0026#34;,\u0026#34;.aSax\u0026#34;,\u0026#34;.aScx\u0026#34;,\u0026#34;.aShx\u0026#34;,\u0026#34;.aSmx\u0026#34;,\u0026#34;.cEr\u0026#34;,\u0026#34;.sWf\u0026#34;,\u0026#34;.swf\u0026#34;,\u0026#34;.htaccess\u0026#34;,\u0026#34;.ini\u0026#34;); 3 $file_name = trim($_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;]); 4 $file_name = deldot($file_name);//删除文件名末尾的点 5 $file_ext = strrchr($file_name, \u0026#39;.\u0026#39;); 6 $file_ext = str_ireplace(\u0026#39;::$DATA\u0026#39;, \u0026#39;\u0026#39;, $file_ext);//去除字符串::$DATA 7 $file_ext = trim($file_ext); //首尾去空 对比前几关的限制条件，本关少了转换为小写的条件。 首先上传一个php文件，使用burp将1.php修改为1.Php(结合限制的文件类型，第一个字母大写没被限制) 访问其上传地址，得到下列画面：\n【只能在Windows下使用，因为Windows大小写不敏感】\nPass-07(黑名单验证-空格绕过) 首先查看源代码：\n1$deny_ext = array(\u0026#34;.php\u0026#34;,\u0026#34;.php5\u0026#34;,\u0026#34;.php4\u0026#34;,\u0026#34;.php3\u0026#34;,\u0026#34;.php2\u0026#34;,\u0026#34;.html\u0026#34;,\u0026#34;.htm\u0026#34;,\u0026#34;.phtml\u0026#34;,\u0026#34;.pht\u0026#34;,\u0026#34;.pHp\u0026#34;,\u0026#34;.pHp5\u0026#34;,\u0026#34;.pHp4\u0026#34;,\u0026#34;.pHp3\u0026#34;,\u0026#34;.pHp2\u0026#34;,\u0026#34;.Html\u0026#34;,\u0026#34;.Htm\u0026#34;,\u0026#34;.pHtml\u0026#34;,\u0026#34;.jsp\u0026#34;,\u0026#34;.jspa\u0026#34;,\u0026#34;.jspx\u0026#34;,\u0026#34;.jsw\u0026#34;,\u0026#34;.jsv\u0026#34;,\u0026#34;.jspf\u0026#34;,\u0026#34;.jtml\u0026#34;,\u0026#34;.jSp\u0026#34;,\u0026#34;.jSpx\u0026#34;,\u0026#34;.jSpa\u0026#34;,\u0026#34;.jSw\u0026#34;,\u0026#34;.jSv\u0026#34;,\u0026#34;.jSpf\u0026#34;,\u0026#34;.jHtml\u0026#34;,\u0026#34;.asp\u0026#34;,\u0026#34;.aspx\u0026#34;,\u0026#34;.asa\u0026#34;,\u0026#34;.asax\u0026#34;,\u0026#34;.ascx\u0026#34;,\u0026#34;.ashx\u0026#34;,\u0026#34;.asmx\u0026#34;,\u0026#34;.cer\u0026#34;,\u0026#34;.aSp\u0026#34;,\u0026#34;.aSpx\u0026#34;,\u0026#34;.aSa\u0026#34;,\u0026#34;.aSax\u0026#34;,\u0026#34;.aScx\u0026#34;,\u0026#34;.aShx\u0026#34;,\u0026#34;.aSmx\u0026#34;,\u0026#34;.cEr\u0026#34;,\u0026#34;.sWf\u0026#34;,\u0026#34;.swf\u0026#34;,\u0026#34;.htaccess\u0026#34;,\u0026#34;.ini\u0026#34;); 2 $file_name = $_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;]; 3 $file_name = deldot($file_name);//删除文件名末尾的点 4 $file_ext = strrchr($file_name, \u0026#39;.\u0026#39;); 5 $file_ext = strtolower($file_ext); //转换为小写 6 $file_ext = str_ireplace(\u0026#39;::$DATA\u0026#39;, \u0026#39;\u0026#39;, $file_ext);//去除字符串::$DATA 对比上一关的条件，少了首尾去空。所以尝试空格绕过，首先上传一个php文件，使用burp抓包看一下内容 在文件名后加个空格，重新发包，得到一个上传地址，将其复制到浏览器进行访问 使用HackBar进行访问得到下面的页面： Pass-08(黑名单绕过-点号绕过) 首先查看源代码：\n1 $deny_ext = array(\u0026#34;.php\u0026#34;,\u0026#34;.php5\u0026#34;,\u0026#34;.php4\u0026#34;,\u0026#34;.php3\u0026#34;,\u0026#34;.php2\u0026#34;,\u0026#34;.html\u0026#34;,\u0026#34;.htm\u0026#34;,\u0026#34;.phtml\u0026#34;,\u0026#34;.pht\u0026#34;,\u0026#34;.pHp\u0026#34;,\u0026#34;.pHp5\u0026#34;,\u0026#34;.pHp4\u0026#34;,\u0026#34;.pHp3\u0026#34;,\u0026#34;.pHp2\u0026#34;,\u0026#34;.Html\u0026#34;,\u0026#34;.Htm\u0026#34;,\u0026#34;.pHtml\u0026#34;,\u0026#34;.jsp\u0026#34;,\u0026#34;.jspa\u0026#34;,\u0026#34;.jspx\u0026#34;,\u0026#34;.jsw\u0026#34;,\u0026#34;.jsv\u0026#34;,\u0026#34;.jspf\u0026#34;,\u0026#34;.jtml\u0026#34;,\u0026#34;.jSp\u0026#34;,\u0026#34;.jSpx\u0026#34;,\u0026#34;.jSpa\u0026#34;,\u0026#34;.jSw\u0026#34;,\u0026#34;.jSv\u0026#34;,\u0026#34;.jSpf\u0026#34;,\u0026#34;.jHtml\u0026#34;,\u0026#34;.asp\u0026#34;,\u0026#34;.aspx\u0026#34;,\u0026#34;.asa\u0026#34;,\u0026#34;.asax\u0026#34;,\u0026#34;.ascx\u0026#34;,\u0026#34;.ashx\u0026#34;,\u0026#34;.asmx\u0026#34;,\u0026#34;.cer\u0026#34;,\u0026#34;.aSp\u0026#34;,\u0026#34;.aSpx\u0026#34;,\u0026#34;.aSa\u0026#34;,\u0026#34;.aSax\u0026#34;,\u0026#34;.aScx\u0026#34;,\u0026#34;.aShx\u0026#34;,\u0026#34;.aSmx\u0026#34;,\u0026#34;.cEr\u0026#34;,\u0026#34;.sWf\u0026#34;,\u0026#34;.swf\u0026#34;,\u0026#34;.htaccess\u0026#34;,\u0026#34;.ini\u0026#34;); 2 $file_name = trim($_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;]); 3 $file_ext = strrchr($file_name, \u0026#39;.\u0026#39;); 4 $file_ext = strtolower($file_ext); //转换为小写 5 $file_ext = str_ireplace(\u0026#39;::$DATA\u0026#39;, \u0026#39;\u0026#39;, $file_ext);//去除字符串::$DATA 6 $file_ext = trim($file_ext); //首尾去空 对比上一关，这关没有使用deldot删除文件名末尾的点，所以可以使用点号绕过\n查看提示如下： burp抓包看一下内容 使用burp将5.php修改为5.php.，得到一个文件上传路径 使用HackBar访问其路径，并执行命令，得到下列页面： Pass-09(黑名单绕过-特殊字符::$DATA绕过) 首先查看源代码：\n1 $deny_ext = array(\u0026#34;.php\u0026#34;,\u0026#34;.php5\u0026#34;,\u0026#34;.php4\u0026#34;,\u0026#34;.php3\u0026#34;,\u0026#34;.php2\u0026#34;,\u0026#34;.html\u0026#34;,\u0026#34;.htm\u0026#34;,\u0026#34;.phtml\u0026#34;,\u0026#34;.pht\u0026#34;,\u0026#34;.pHp\u0026#34;,\u0026#34;.pHp5\u0026#34;,\u0026#34;.pHp4\u0026#34;,\u0026#34;.pHp3\u0026#34;,\u0026#34;.pHp2\u0026#34;,\u0026#34;.Html\u0026#34;,\u0026#34;.Htm\u0026#34;,\u0026#34;.pHtml\u0026#34;,\u0026#34;.jsp\u0026#34;,\u0026#34;.jspa\u0026#34;,\u0026#34;.jspx\u0026#34;,\u0026#34;.jsw\u0026#34;,\u0026#34;.jsv\u0026#34;,\u0026#34;.jspf\u0026#34;,\u0026#34;.jtml\u0026#34;,\u0026#34;.jSp\u0026#34;,\u0026#34;.jSpx\u0026#34;,\u0026#34;.jSpa\u0026#34;,\u0026#34;.jSw\u0026#34;,\u0026#34;.jSv\u0026#34;,\u0026#34;.jSpf\u0026#34;,\u0026#34;.jHtml\u0026#34;,\u0026#34;.asp\u0026#34;,\u0026#34;.aspx\u0026#34;,\u0026#34;.asa\u0026#34;,\u0026#34;.asax\u0026#34;,\u0026#34;.ascx\u0026#34;,\u0026#34;.ashx\u0026#34;,\u0026#34;.asmx\u0026#34;,\u0026#34;.cer\u0026#34;,\u0026#34;.aSp\u0026#34;,\u0026#34;.aSpx\u0026#34;,\u0026#34;.aSa\u0026#34;,\u0026#34;.aSax\u0026#34;,\u0026#34;.aScx\u0026#34;,\u0026#34;.aShx\u0026#34;,\u0026#34;.aSmx\u0026#34;,\u0026#34;.cEr\u0026#34;,\u0026#34;.sWf\u0026#34;,\u0026#34;.swf\u0026#34;,\u0026#34;.htaccess\u0026#34;,\u0026#34;.ini\u0026#34;); 2 $file_name = trim($_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;]); 3 $file_name = deldot($file_name);//删除文件名末尾的点 4 $file_ext = strrchr($file_name, \u0026#39;.\u0026#39;); 5 $file_ext = strtolower($file_ext); //转换为小写 6 $file_ext = trim($file_ext); //首尾去空 对比上一关，这一个没有对::$DATA进行过滤，所以可以使用::$DATA进行绕过 使用burp抓包，将5.php修改为5.php::$DATA，得到一个文件上传地址 删掉::$DATA后,使用HackBar访问其上传地址，得到下列页面： Pass-10（黑名单绕过-） 首先查看源代码：\n1 $deny_ext = array(\u0026#34;.php\u0026#34;,\u0026#34;.php5\u0026#34;,\u0026#34;.php4\u0026#34;,\u0026#34;.php3\u0026#34;,\u0026#34;.php2\u0026#34;,\u0026#34;.html\u0026#34;,\u0026#34;.htm\u0026#34;,\u0026#34;.phtml\u0026#34;,\u0026#34;.pht\u0026#34;,\u0026#34;.pHp\u0026#34;,\u0026#34;.pHp5\u0026#34;,\u0026#34;.pHp4\u0026#34;,\u0026#34;.pHp3\u0026#34;,\u0026#34;.pHp2\u0026#34;,\u0026#34;.Html\u0026#34;,\u0026#34;.Htm\u0026#34;,\u0026#34;.pHtml\u0026#34;,\u0026#34;.jsp\u0026#34;,\u0026#34;.jspa\u0026#34;,\u0026#34;.jspx\u0026#34;,\u0026#34;.jsw\u0026#34;,\u0026#34;.jsv\u0026#34;,\u0026#34;.jspf\u0026#34;,\u0026#34;.jtml\u0026#34;,\u0026#34;.jSp\u0026#34;,\u0026#34;.jSpx\u0026#34;,\u0026#34;.jSpa\u0026#34;,\u0026#34;.jSw\u0026#34;,\u0026#34;.jSv\u0026#34;,\u0026#34;.jSpf\u0026#34;,\u0026#34;.jHtml\u0026#34;,\u0026#34;.asp\u0026#34;,\u0026#34;.aspx\u0026#34;,\u0026#34;.asa\u0026#34;,\u0026#34;.asax\u0026#34;,\u0026#34;.ascx\u0026#34;,\u0026#34;.ashx\u0026#34;,\u0026#34;.asmx\u0026#34;,\u0026#34;.cer\u0026#34;,\u0026#34;.aSp\u0026#34;,\u0026#34;.aSpx\u0026#34;,\u0026#34;.aSa\u0026#34;,\u0026#34;.aSax\u0026#34;,\u0026#34;.aScx\u0026#34;,\u0026#34;.aShx\u0026#34;,\u0026#34;.aSmx\u0026#34;,\u0026#34;.cEr\u0026#34;,\u0026#34;.sWf\u0026#34;,\u0026#34;.swf\u0026#34;,\u0026#34;.htaccess\u0026#34;,\u0026#34;.ini\u0026#34;); 2 $file_name = trim($_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;]); 3 $file_name = deldot($file_name);//删除文件名末尾的点 4 $file_ext = strrchr($file_name, \u0026#39;.\u0026#39;); 5 $file_ext = strtolower($file_ext); //转换为小写 6 $file_ext = str_ireplace(\u0026#39;::$DATA\u0026#39;, \u0026#39;\u0026#39;, $file_ext);//去除字符串::$DATA 7 $file_ext = trim($file_ext); //首尾去空 Pass-11 首先查看源代码：\n1$is_upload = false; 2$msg = null; 3if (isset($_POST[\u0026#39;submit\u0026#39;])) { 4 if (file_exists(UPLOAD_PATH)) { 5 $deny_ext = array(\u0026#34;php\u0026#34;,\u0026#34;php5\u0026#34;,\u0026#34;php4\u0026#34;,\u0026#34;php3\u0026#34;,\u0026#34;php2\u0026#34;,\u0026#34;html\u0026#34;,\u0026#34;htm\u0026#34;,\u0026#34;phtml\u0026#34;,\u0026#34;pht\u0026#34;,\u0026#34;jsp\u0026#34;,\u0026#34;jspa\u0026#34;,\u0026#34;jspx\u0026#34;,\u0026#34;jsw\u0026#34;,\u0026#34;jsv\u0026#34;,\u0026#34;jspf\u0026#34;,\u0026#34;jtml\u0026#34;,\u0026#34;asp\u0026#34;,\u0026#34;aspx\u0026#34;,\u0026#34;asa\u0026#34;,\u0026#34;asax\u0026#34;,\u0026#34;ascx\u0026#34;,\u0026#34;ashx\u0026#34;,\u0026#34;asmx\u0026#34;,\u0026#34;cer\u0026#34;,\u0026#34;swf\u0026#34;,\u0026#34;htaccess\u0026#34;,\u0026#34;ini\u0026#34;); 6 7 $file_name = trim($_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;]); 8 $file_name = str_ireplace($deny_ext,\u0026#34;\u0026#34;, $file_name); 9 $temp_file = $_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;tmp_name\u0026#39;]; 10 $img_path = UPLOAD_PATH.\u0026#39;/\u0026#39;.$file_name; 11 if (move_uploaded_file($temp_file, $img_path)) { 12 $is_upload = true; 13 } else { 14 $msg = \u0026#39;上传出错！\u0026#39;; 15 } 16 } else { 17 $msg = UPLOAD_PATH . \u0026#39;文件夹不存在,请手工创建！\u0026#39;; 18 } 19} 本关提示: Pass-12 首先查看源代码：\n1is_upload = false; 2$msg = null; 3if(isset($_POST[\u0026#39;submit\u0026#39;])){ 4 $ext_arr = array(\u0026#39;jpg\u0026#39;,\u0026#39;png\u0026#39;,\u0026#39;gif\u0026#39;); 5 $file_ext = substr($_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;],strrpos($_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;],\u0026#34;.\u0026#34;)+1); 6 if(in_array($file_ext,$ext_arr)){ 7 $temp_file = $_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;tmp_name\u0026#39;]; 8 $img_path = $_GET[\u0026#39;save_path\u0026#39;].\u0026#34;/\u0026#34;.rand(10, 99).date(\u0026#34;YmdHis\u0026#34;).\u0026#34;.\u0026#34;.$file_ext; 9 10 if(move_uploaded_file($temp_file,$img_path)){ 11 $is_upload = true; 12 } else { 13 $msg = \u0026#39;上传出错！\u0026#39;; 14 } 15 } else{ 16 $msg = \u0026#34;只允许上传.jpg|.png|.gif类型文件！\u0026#34;; 17 } 18} 提示如下： Pass-13 查看源代码：\n1$is_upload = false; 2$msg = null; 3if(isset($_POST[\u0026#39;submit\u0026#39;])){ 4 $ext_arr = array(\u0026#39;jpg\u0026#39;,\u0026#39;png\u0026#39;,\u0026#39;gif\u0026#39;); 5 $file_ext = substr($_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;],strrpos($_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;name\u0026#39;],\u0026#34;.\u0026#34;)+1); 6 if(in_array($file_ext,$ext_arr)){ 7 $temp_file = $_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;tmp_name\u0026#39;]; 8 $img_path = $_POST[\u0026#39;save_path\u0026#39;].\u0026#34;/\u0026#34;.rand(10, 99).date(\u0026#34;YmdHis\u0026#34;).\u0026#34;.\u0026#34;.$file_ext; 9 10 if(move_uploaded_file($temp_file,$img_path)){ 11 $is_upload = true; 12 } else { 13 $msg = \u0026#34;上传失败\u0026#34;; 14 } 15 } else { 16 $msg = \u0026#34;只允许上传.jpg|.png|.gif类型文件！\u0026#34;; 17 } 18} Pass-14 查看源代码：\n1function getReailFileType($filename){ 2 $file = fopen($filename, \u0026#34;rb\u0026#34;); 3 $bin = fread($file, 2); //只读2字节 4 fclose($file); 5 $strInfo = @unpack(\u0026#34;C2chars\u0026#34;, $bin); 6 $typeCode = intval($strInfo[\u0026#39;chars1\u0026#39;].$strInfo[\u0026#39;chars2\u0026#39;]); 7 $fileType = \u0026#39;\u0026#39;; 8 switch($typeCode){ 9 case 255216: 10 $fileType = \u0026#39;jpg\u0026#39;; 11 break; 12 case 13780: 13 $fileType = \u0026#39;png\u0026#39;; 14 break; 15 case 7173: 16 $fileType = \u0026#39;gif\u0026#39;; 17 break; 18 default: 19 $fileType = \u0026#39;unknown\u0026#39;; 20 } 21 return $fileType; 22} 23 24$is_upload = false; 25$msg = null; 26if(isset($_POST[\u0026#39;submit\u0026#39;])){ 27 $temp_file = $_FILES[\u0026#39;upload_file\u0026#39;][\u0026#39;tmp_name\u0026#39;]; 28 $file_type = getReailFileType($temp_file); 29 30 if($file_type == \u0026#39;unknown\u0026#39;){ 31 $msg = \u0026#34;文件未知，上传失败！\u0026#34;; 32 }else{ 33 $img_path = UPLOAD_PATH.\u0026#34;/\u0026#34;.rand(10, 99).date(\u0026#34;YmdHis\u0026#34;).\u0026#34;.\u0026#34;.$file_type; 34 if(move_uploaded_file($temp_file,$img_path)){ 35 $is_upload = true; 36 } else { 37 $msg = \u0026#34;上传出错！\u0026#34;; 38 } 39 } 40} 本关提示： Pass-15 Pass-16 Pass-17 Pass-18 Pass-19 Pass-20 Pass-21 ","date":"2025-11-04T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E8%AE%B0%E5%BD%95%E8%87%AA%E5%B7%B1%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%92%8C%E8%B8%A9%E5%9D%91%E7%BB%8F%E5%8E%86/1_hu_ffbd609d864a79fe.jpg","permalink":"https://mofei-blog.pages.dev/p/%E8%AE%B0%E5%BD%95%E8%87%AA%E5%B7%B1%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%92%8C%E8%B8%A9%E5%9D%91%E7%BB%8F%E5%8E%86/","title":"upload-labs通关记录（1-21关）"},{"content":"导语 二进制安全 二进制安全是一盒比较偏向底层的方向，对计算机基础要求较高\nC/C++ Python 汇编语言 计算机组成原理 操作系统 编译原理 二进制安全可以细分为逆向工程和漏洞挖掘与利用等方向\n学习书籍推荐（中文）：\n程序员的自我修养\u0026ndash;链接、装载与库 加密和解密（第四版） 学完之后，就可以进行软件漏洞的学习了，分析真实环境中的漏洞和恶意样本，推荐资料：\n漏洞战争“软件漏洞分析精要 有了实践基础之后，可以学习一些理论分析：\n数据流分析（Soot） 值集分析（BAP） 可满足性（Z3） 动态二进制插桩 符号执行 模糊测试 二进制文件 源文件\u0026ndash;\u0026gt;可执行文件 一个C语言程序从源文件开始，这种高级语言的形式更容易被人理解。但是程序运行，每条C语句都必须翻译为一系列的低级机器语言指令。最后，这些指令按照可执行目标文件的格式打包，并以二进制的形式存放起来\n编译原理 编程语言\u0026ndash;\u0026gt;编译器\u0026mdash;\u0026gt;目标语言\nGCC编译过程 预处理（hello.c\u0026ndash;\u0026gt;hello.i） 处理源代码中以“#”开始的预处理指令，如#include、#define，将其转换后直接插入程序文本中，得到另一个C程序hello.i 在命令中添加编译选-E 可以单独执行预处理 一些预处理规则 #include：将对应文件的内容复制到该指令的位置（换行后的内容原封不动的出现在下面） #define 删除，并且在被引用的位置递归地扩展所有的宏定义（即原本文件中的数据使用的是宏，但之后会变成数字） 处理所有条件预处理指令：if、ifdef、elif、else、endif等 删除所有注释 添加行号和文件名标识 编译(hello.i\u0026ndash;\u0026gt;hello.s) 此过程将预处理文件进行一系列的词法分析、语法分析、语义分析以及优化，最终生成汇编代码 在命令中添加编译选项-S,操作对象可以是源代码 hello.c，也可以是hello.i 注：生成的汇编代码中函数printf()被替换为puts(),因为当printf()只有单一参数时，与puts()功能类似 汇编(hello.s\u0026ndash;\u0026gt;hello.o) 汇编器根据汇编指令与机器指令的对照表进行翻译，将hello.s汇编成目标文件hello.o hello.o是一个可重定位文件，可以使用objdump命令来查看其内容 链接(hello.o\u0026ndash;\u0026gt;hello) 链接器collect2是对ld命令的封装，用于将C语言运行时库（CRT）中的目标文件(crt1.o,crti.o,crtbegin.o,crtend.o,crtn,o)以及所需的动态链接库链接到可执行hello 分类 静态链接\u0026mdash; 添加编译选项-static即可指定使用静态链接 动态链接（默认） 此阶段将目标文件及其依赖库进行链接，生成可执行文件，主要包括地址和空间分配、符号绑定和重定位等操作 链接操作由链接器（ld.so）完成，得到hello文件，这是一个静态链接的可执行文件，包含大量的库文件 通过链接操作，对象文件中无法确定的符号地址已经被修正为实际的符号地址，程序就可以被加载到内存中正常执行了 ELF文件格式 ELF（Executable and Linkable Format）:可执行可链接格式\nELF分类：\n可执行文件（.exec） 经过链接的、可执行的目标文件，通常称为程序 可重定位文件（.rel） 由源文件编译而成尚未链接的目标文件，通常以“.o”作为扩展名。通常是一段位置独立的代码 共享目标文件（.dyn） 动态链接库文件 核心转储文件（core dump file） 作为进程意外终止时进程地址空间的转储，也是ELF文件的一种，使用gdb读取这类文件可以辅助调试和查找程序崩溃的原因（在Linux中遇到过核心转储问题） 注：ELF文件被统称为Object file，所以ELF可以认定为目标文件，而“.o”文件可以称为重定位文件\nELF文件的结构：\n审视目标文件的两种视角\n链接视角 通过节（Section）来进行划分\n目标文件中包含的节\n代码（.text）:保存可执行的机器指令\n.text的数据是十六制形式，共0x4e个字节 偏移量（最左一列） 内容（中间四列） ASCII码（最右一列） 数据（.data）：保存已初始化的全局变量和局部静态变量\n.data中是源代码中的变量 .rodata 保存只读数据（只读变量和字符串常量） BSS（.bss）：保存未初始化的全局变量和局部静态变量\n其他常见的节：\n.strtab(字符串表) 包含了以null结尾的字符序列，用来表示符合和节名，引用字符串时只需给出字符序列在表中的偏移即可 symtab(符号表) 记录目标文件中所有用到的所有符号信息，通常分为.dynsym和.symtab，前者是后者的子集 .dynsym：保存了引用自外部文件的符号，只能在运行时被解析 .symtab：还保存了本地符号，用于调试和链接 目标文件通过一个符号在表中的索引值来使用该符号 （重定位）：链接符号定义与符号引用的过程 可重定位文件在构建可执行文件或共享目标文件时，需要把节中的符号引用换成这些符号在进程空间中的虚拟地址 ELF文件头：位于目标文件最开始的位置，包含描述整个文件的一些基本信息\nELF文件类型 版本/应用程序二进制接口ABI版本 目标机器 程序入口 段表和节表的位置和长度等 节头表：存储目标文件中各个节的信息 表的每一项都是一个Elf64_Shdr结构体（节描述符），记录节的名字、长度、偏移、读写权限等信息 节头表的位置记录在文件头的e_shoff域中 在运行时节头表不是必须的，所以常有程序去除节头表，以增加反编译器的分析难度 文件头存在魔术字符（7f 45 4c 46）,即字符“\\177ELF”,当文件被映射到内存时，可以通过搜索该字符确定映射地址，在dump内存时非常有用\n指令和数据分别存放的好处：防止程序指令被改写和利用\n运行视角 通过段（Segment）来进行划分 运行可执行文件时，首先需要将该文件和动态链接库装载到进程空间中，形成进程镜像 每个进程拥有独立的虚拟地址空间，这个空间布局由记录在段头表中的程序头决定的 段表头位置：ELF文件头的e_phoof域已给出 静态链接 动态链接 ","date":"2025-09-08T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%AE%89%E5%85%A8/2_hu_7c9cde716e733b77.jpg","permalink":"https://mofei-blog.pages.dev/p/%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%AE%89%E5%85%A8/","title":"前置知识整理（2）| 二进制"},{"content":"导语 我没有经过系统的训练，记录一下在小红书学到的知识\n摄影眼提高方法 看照片 刷优秀摄影作品，思考以下问题：\n1.构图\n2.光线（如何使用）\n3.画面（画面想呈现给观众什么内容）\n模拟\n模拟是一切的开始，寻找自己的视觉框架，这个过程可能会持续一段时间，但会悄悄提高你对画面感的捕捉力\n针对同意主题，连续的训练，通过这种方法提高你对元素的敏感度\n很喜欢这句话：摄影眼不是灵感爆发，而是你看过很多、练过很多 拍过很多之后，眼镜自然就会变成镜头感知器，这也对应了现在正在看的书《刻意练习》，所有的才华都是可以通过练习获得的，前提是你要坚持和努力\n摄影要做减法\n基础的构图知识 经典构图框架 ","date":"2025-09-07T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E5%AD%A6%E4%B9%A0%E6%91%84%E5%BD%B1%E6%8A%80%E5%B7%A7%E5%AD%A6%E4%BC%9A%E6%8B%8D%E7%85%A7/1_hu_8daa40e89b7eb96.jpg","permalink":"https://mofei-blog.pages.dev/p/%E5%AD%A6%E4%B9%A0%E6%91%84%E5%BD%B1%E6%8A%80%E5%B7%A7%E5%AD%A6%E4%BC%9A%E6%8B%8D%E7%85%A7/","title":"摄影 | 摄影眼的养成"},{"content":"导读 放弃一切错误方法，开始“刻意练习”\n重点内容 ","date":"2025-09-04T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E8%AF%BB%E4%B8%80%E6%9C%AC%E5%A5%BD%E4%B9%A6%E5%9C%A8%E4%B9%A6%E4%B8%AD%E4%B8%B0%E5%AF%8C%E8%87%AA%E5%B7%B1%E7%9A%84%E7%9F%A5%E8%AF%86/1_hu_68aca28ecd46e5b3.jpg","permalink":"https://mofei-blog.pages.dev/p/%E8%AF%BB%E4%B8%80%E6%9C%AC%E5%A5%BD%E4%B9%A6%E5%9C%A8%E4%B9%A6%E4%B8%AD%E4%B8%B0%E5%AF%8C%E8%87%AA%E5%B7%B1%E7%9A%84%E7%9F%A5%E8%AF%86/","title":"好书阅读| 刻意练习"},{"content":"","date":"2025-08-26T00:00:00Z","permalink":"https://mofei-blog.pages.dev/p/%E5%BF%85%E5%AD%A6%E7%9F%A5%E8%AF%86/","title":"小白整理必学知识1"},{"content":"导语 最近发现自己的知识体系有点混乱，感觉什么都学了，但是什么都没学会。借这篇文章整理下自己的思路，顺便系统学习一下什么是CTF\nCTF CTF（Capture The Flag），夺旗赛。参赛方通过攻防对抗、程序分析等形式，率先从主办方的给出的比赛环境中得到一串具有一定格式的字符串或其他内容，并提交给主办方，从而夺得分数。这串内容为Flag\nflag一般拥有固定的格式，如flag{xxxxx},利用固定格式来反推flag也是一种常见的解题思路\n通常来说CTF是以团队为单位进行参赛。每个团队3-5人(具体根据主办方要求决定)，在整个比赛过程中既要每个选手拥有某个方向的漏洞挖掘能力，也要同队选手之间的相互配合\n竞赛模式 Jeopardy-解题 参赛队伍可以通过互联网或者现场网络参与，参数队伍通过与在线环境交互或文件离线分析，解决网络安全技术挑战获取相应分值，类似于 ACM 编程竞赛、信息学奥林匹克赛，根据总分和时间来进行排名\n最常规的CTF比赛形式\nAwD-攻防模式 Attack with Defense(AwD)全称攻防模式，在攻防模式CTF赛制中，参赛队伍连接到同一个网络空间。主办方为每支队伍分配防守主机，每个队伍需要防护自己的主机不被攻击的同时挖掘漏洞并攻击对手服务来的分\nAwD通常仅包含Web及Pwn两种类型的题目\n比赛内容 Reverse（逆向类）：对软件的结构、流程、算法等进行逆向破解 要求：较强的反汇编、反编译的能力 所需知识：汇编语言、加密与解密、常见的反编译工具 Pwn（溢出类） 常见的类型：整数溢出u、栈溢出、堆溢出等 要求：考查对漏洞的利用能力 所需知识：C、OD+IDA、数据机构、操作系统 Web（Web漏洞类） 常见类型： XSS、文件包含、代码执行、上传漏洞、SQL注入等，也有些简单的关于网络基础知识的考察：如返回包、TCP/IP、数据包内容和构造 所需知识：PHP、Python、TCP/IP、SQL Crypto（加密类）：考察这种加解密技术 要求：考查密码学相关知识点 所需知识： 矩阵、数论、密码学 Mobile 要求：涉及Android和iOS两个平台，主要是Android逆向，破解APK并提交正确flag 所需知识： Java、Android开发、常用工具 Misc（杂项） 常见题目：隐写术、电子取证、人肉搜索、数据分析、大数据统计等 所需知识: 常见隐写术工具、Wireshark等流量审查工具、编码知识 ","date":"2025-08-19T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E5%BB%BA%E7%AB%8B%E8%87%AA%E5%B7%B1%E7%9A%84%E7%9F%A5%E8%AF%86%E5%BA%93%E4%BD%93%E7%B3%BB/1_hu_15f9b051f0ac136f.jpg","permalink":"https://mofei-blog.pages.dev/p/%E5%BB%BA%E7%AB%8B%E8%87%AA%E5%B7%B1%E7%9A%84%E7%9F%A5%E8%AF%86%E5%BA%93%E4%BD%93%E7%B3%BB/","title":"前置知识整理（1）| CTF是什么"},{"content":"导语 玩了这个游戏很久了，想要记录一下。\n开始的时候来源于朋友的推荐，自己没有好好了解过这个游戏，玩的都是稀里糊涂的。现在想深度了解下这个游戏\n官方简介 《桃源深处有人家》是一款悠然治愈的国风山水田园经营手游。回到心中的故乡，远离尘世，过一份安静恬淡的小生活。在这里，有活泼淘气的妹妹陪伴在身边；有可爱神奇的萝卜山灵与你一同生活；有迷失在幻境中寻求解忧的灵魂；还有那居住在山下似曾相识的故人们……\n归来的人，终会发现最美的风景。\n耕作经营——建设专属于你的世外桃源 归园田居——享受安静恬淡的山居生活 古韵悠然——品味青绿山水的国风画卷 萌物陪伴——邂逅性格迥异的可爱萝卜 桃源一梦——探索动人心弦的神秘故事\n在这里，你将伴随哥哥妹妹，一同回到童年的小茅屋 你可以和小萝卜们一起耕地种植，建设自己温馨的田园小家 也可以在清风明月下备一桌好菜，和村民们聊聊温暖的故事 在这里，你可以放下心中杂念 看山中花开花谢，品云间星月流转 洗去繁华与浮躁，偷得浮生半日闲 在恬淡悠然的山居生活中 重拾内心的那份安宁与平静\n总结：一款治愈系的模拟经营游戏，偏向治愈系。借用开发者的话：在玩过之后可以退回到当初的样子，像游戏里的小萝卜一样，对这个世界充满好奇心和童真 萝萝山大赏 萝萝农场 扶光和陶陶居所的所在地\n博物山 仙女湖 萝萝古镇 介绍游戏有点复杂，还是接着做壁纸吧\n","date":"2025-08-17T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E6%A1%83%E6%BA%90%E6%B7%B1%E5%A4%84%E6%9C%89%E4%BA%BA%E5%AE%B6%E6%B8%B8%E6%88%8F%E8%AE%B0%E5%BD%95/1_hu_1c67d55725d25302.jpg","permalink":"https://mofei-blog.pages.dev/p/%E6%A1%83%E6%BA%90%E6%B7%B1%E5%A4%84%E6%9C%89%E4%BA%BA%E5%AE%B6%E6%B8%B8%E6%88%8F%E8%AE%B0%E5%BD%95/","title":"【游戏专区】| 桃源深处有人家（1）"},{"content":"导语 最近看到很多好看的分区壁纸，想要自己做一下，那桃源的图片练了下手，感觉做的还可以，在博客里面贴一下，如果想要的话可以在小红书@莫非领取\n展示成果 ","date":"2025-08-17T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E6%A1%83%E6%BA%90%E6%B7%B1%E5%A4%84%E6%9C%89%E4%BA%BA%E5%AE%B6%E7%94%B5%E8%84%91%E5%88%86%E5%8C%BA%E5%A3%81%E7%BA%B8%E5%8F%AF%E5%9C%A8%E5%B0%8F%E7%BA%A2%E4%B9%A6@%E8%8E%AB%E9%9D%9E%E9%A2%86%E5%8F%96/swiper3-img4_hu_a7bbfead1c6490a6.webp","permalink":"https://mofei-blog.pages.dev/p/%E6%A1%83%E6%BA%90%E6%B7%B1%E5%A4%84%E6%9C%89%E4%BA%BA%E5%AE%B6%E7%94%B5%E8%84%91%E5%88%86%E5%8C%BA%E5%A3%81%E7%BA%B8%E5%8F%AF%E5%9C%A8%E5%B0%8F%E7%BA%A2%E4%B9%A6@%E8%8E%AB%E9%9D%9E%E9%A2%86%E5%8F%96/","title":"【游戏专区】| 桃源深处有人家（2）"},{"content":"导语 网络爬虫作为一种自动采集数据的技术，凭借吱声强大的自动抓取网页数据的能力，成为当下互联网高效、灵活的解决方法之一\n什么是网络爬虫 网络爬虫（Web Crawler）是一种按照一定规则，自动请求网站并提取网页数据的程序和脚本\n按照系统结构和实现即时可以分为以下几种类型：\n通用网络爬虫\n搜索引擎抓取系统的重要组成部分，在本地形成一个互联网网页的镜像备份、 数量巨大且范围广泛 爬行速度和存储空间要求高，但对抓取网页的顺序的要求相对较低 聚焦网络爬虫\n针对特定目标，有选择性的访问与目标主题相关的网页 减少了访问和保存的页面数量，提高网页的更新速度 增量式网络爬虫\n抓取已下载的网页中新产生或内容变化的网页 减少网页的下载量和访问时间，以及减少存储空间的耗费 增加了网页抓取算法的复杂度和实现难度 深层网络爬虫\n抓取网页层次较深，需要通过一定的附加策略才能自动抓取，实现难度大 表层网页和深层网页\n","date":"2025-08-16T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E7%AC%94%E8%AE%B0/OIP-C_hu_7497c38f10f77ec9.webp","permalink":"https://mofei-blog.pages.dev/p/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E7%AC%94%E8%AE%B0/","title":"【网络爬虫】| python 爬虫"},{"content":"动态分析技术中最重要的工具是调试器，分为用户模式和内核模式两种类型：\n用户模式调试器:用来调试用户模式应用程序的调试器，工作在Ring3级。例如，OllyDbg、x64dbg、VC++等编译器自带的调试器 内核模式调试器：能调试操作系统内核的调试器。例如，WinDbg Ring3级\nOllyDbg OllyDbg(OD)是一款具有可视化界面的用户模式调试器，可以运行在各个版本的Windows上，但NT架构更加稳定。它结合了动态调试和静态分析，具有GUI界面，非常容易上手，对异常的跟踪处理相当灵活。\nx64dbg MDebug WinDbg ","date":"2025-08-15T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E5%8A%A0%E5%AF%86%E5%92%8C%E8%A7%A3%E5%AF%86-%E5%8A%A8%E6%80%81%E5%88%86%E6%9E%90%E6%8A%80%E6%9C%AF/2_hu_5fe8a17fbe587ac8.png","permalink":"https://mofei-blog.pages.dev/p/%E5%8A%A0%E5%AF%86%E5%92%8C%E8%A7%A3%E5%AF%86-%E5%8A%A8%E6%80%81%E5%88%86%E6%9E%90%E6%8A%80%E6%9C%AF/","title":"【加密和解密】| 动态分析技术"},{"content":"一、基础配置 hugo.yaml 1baseurl: 网站根目录,部署后需要修改为你的实际网站地址/域名 2languageCode: 语言代码，默认值为en-us，可以修改为中文简体zh-cn 3theme: 主题名称，默认值为hugo-theme-stack 4title: 网站标题 5copyright: 版权所有者信息 6DefaultContentLanguage:默认内容语言，可修改为zh-cn 7hasCJKLanguage: 是否包含中文(影响字数统计) 8languages: 多语言设置 网站icon、时间格式、博客头像、License 1favicon:网站icon,存储地址 /static/favicon.ico 2dateFormat: Go语言时间格式，2006不可以更改 3avatar: 博客头像，存储地址 /assets/img/avatar.png 4license: 公共版权许可协议声明 评论系统 目前使用的是 utterances 评论系统，参考了 Hugo博客使用utterances作为评论系统 社交功能 添加个人社交平台的链接 icon路径：站点目录下的/assets/icons,所有用到的icon都放在这里，格式为.svg 二、个性化修改 整体布局 参考文章：\nHugo Stack 魔改美化 Hugo Stack主题装修笔记 1.将要修改的文件复制到站点目录下，然后开始个性化修改\n2.没有目录的自己创建一个同名目录\n一些细节 左侧栏ID修改 在layouts\\partials\\sidebar\\left.html中找到以下代码：\n1 \u0026lt;div class=\u0026#34;site-meta\u0026#34;\u0026gt; 2 \u0026lt;h1 class=\u0026#34;site-name\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;{{ .Site.BaseURL | relLangURL }}\u0026#34;\u0026gt;{{ .Site.Title }}\u0026lt;/a\u0026gt;\u0026lt;/h1\u0026gt; 3 \u0026lt;h2 class=\u0026#34;site-description\u0026#34;\u0026gt;{{ .Site.Params.sidebar.subtitle }}\u0026lt;/h2\u0026gt; 4 \u0026lt;/div\u0026gt; 修改为：\n1 \u0026lt;div class=\u0026#34;site-meta\u0026#34;\u0026gt; 2 \u0026lt;h1 class=\u0026#34;site-name\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;{{ .Site.BaseURL | relLangURL }}\u0026#34;\u0026gt;\u0026lt;span\u0026gt;Mofei\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/h1\u0026gt; 3 \u0026lt;h2 class=\u0026#34;site-description\u0026#34;\u0026gt;{{ .Site.Params.sidebar.subtitle }}\u0026lt;/h2\u0026gt; 4 \u0026lt;/div\u0026gt; 字体修改 原来的字体看着有点别扭，所以把全站的字体改为了思源宋体，参考了 Hugo|月球基地开发历程 中的修改全站字体\n在layouts/partials/head/custom.html（没有就新建或者在主题目录下修改）中添加下列代码：\n1\u0026lt;style\u0026gt; 2 :root { 3 --sys-font-family: \u0026#34;Noto Serif SC\u0026#34;; 4 --zh-font-family: \u0026#34;Noto Serif SC\u0026#34;; 5 --base-font-family: \u0026#34;Noto Serif SC\u0026#34;; 6 --code-font-family: \u0026#34;Noto Serif SC\u0026#34;; 7 --article-font-family: \u0026#34;Noto Serif SC\u0026#34;; 8 } 9\u0026lt;/style\u0026gt; 10 11\u0026lt;script\u0026gt; 12 (function () { 13 const customFont = document.createElement(\u0026#34;link\u0026#34;); 14 customFont.href = 15 \u0026#34;https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;700\u0026amp;display=swap\u0026#34;; 16 17 customFont.type = \u0026#34;text/css\u0026#34;; 18 customFont.rel = \u0026#34;stylesheet\u0026#34;; 19 20 document.head.appendChild(customFont); 21 })(); 22\u0026lt;/script\u0026gt; 汉语和英语之间自动添加空格 在主题目录中的layouts/partials/footer/footer.html中写入以下内容:\n1\u0026lt;script\u0026gt; 2 (function(u, c) { 3 var d = document, t = \u0026#39;script\u0026#39;, o = d.createElement(t), 4 s = d.getElementsByTagName(t)[0]; 5 o.src = u; 6 if (c) { o.addEventListener(\u0026#39;load\u0026#39;, function(e) { c(e); }); } 7 s.parentNode.insertBefore(o, s); 8 })(\u0026#39;//cdn.bootcss.com/pangu/4.0.7/pangu.min.js\u0026#39;, function() { 9 pangu.spacingPage(); 10 }); 11\u0026lt;/script\u0026gt; 给博客添加heatmap 代码来源： hugostack装修 页面加载进度条 layouts\\partials\\footer\\custom.html添加以下代码：\n1\u0026lt;!-- 页面加载进度条显示 --\u0026gt; 2\u0026lt;!-- layouts/partials/footer/custom.html --\u0026gt; 3\u0026lt;script 4 src=\u0026#34;https://cdn.jsdelivr.net/gh/zhixuan2333/gh-blog@v0.1.0/js/nprogress.min.js\u0026#34; 5 integrity=\u0026#34;sha384-bHDlAEUFxsRI7JfULv3DTpL2IXbbgn4JHQJibgo5iiXSK6Iu8muwqHANhun74Cqg\u0026#34; 6 crossorigin=\u0026#34;anonymous\u0026#34; 7\u0026gt;\u0026lt;/script\u0026gt; 8\u0026lt;link 9 rel=\u0026#34;stylesheet\u0026#34; 10 href=\u0026#34;https://cdn.jsdelivr.net/gh/zhixuan2333/gh-blog@v0.1.0/css/nprogress.css\u0026#34; 11 integrity=\u0026#34;sha384-KJyhr2syt5+4M9Pz5dipCvTrtvOmLk/olWVdfhAp858UCa64Ia5GFpTN7+G4BWpE\u0026#34; 12 crossorigin=\u0026#34;anonymous\u0026#34; 13/\u0026gt; 14\u0026lt;script\u0026gt; 15 NProgress.start(); 16 document.addEventListener(\u0026#34;readystatechange\u0026#34;, () =\u0026gt; { 17 if (document.readyState === \u0026#34;interactive\u0026#34;) NProgress.inc(0.8); 18 if (document.readyState === \u0026#34;complete\u0026#34;) NProgress.done(); 19 }); 20\u0026lt;/script\u0026gt; 看板娘 参考教程： 【Hugo】博客引入moc3类型的live2d模型 目前用了这个博主的看板娘，后续会继续摸索做自己的看板娘\n鼠标点击特效 在layouts\\partials\\footer\\文件夹下新建 mouse-click.html文件，写入以下代码：\n1\u0026lt;!-- 鼠标点击特效 --\u0026gt; 2\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; 3 ! function (e, t, a) { 4 function r() { 5 for (var e = 0; e \u0026lt; s.length; e++) s[e].alpha \u0026lt;= 0 ? (t.body.removeChild(s[e].el), s.splice(e, 1)) : (s[ 6 e].y--, s[e].scale += .004, s[e].alpha -= .013, s[e].el.style.cssText = \u0026#34;left:\u0026#34; + s[e].x + 7 \u0026#34;px;top:\u0026#34; + s[e].y + \u0026#34;px;opacity:\u0026#34; + s[e].alpha + \u0026#34;;transform:scale(\u0026#34; + s[e].scale + \u0026#34;,\u0026#34; + s[e] 8 .scale + \u0026#34;) rotate(45deg);background:\u0026#34; + s[e].color + \u0026#34;;z-index:99999\u0026#34;); 9 requestAnimationFrame(r) 10 } 11 12 function n() { 13 var t = \u0026#34;function\u0026#34; == typeof e.onclick \u0026amp;\u0026amp; e.onclick; 14 e.onclick = function (e) { 15 t \u0026amp;\u0026amp; t(), o(e) 16 } 17 } 18 19 function o(e) { 20 var a = t.createElement(\u0026#34;div\u0026#34;); 21 a.className = \u0026#34;heart\u0026#34;, s.push({ 22 el: a, 23 x: e.clientX - 5, 24 y: e.clientY - 5, 25 scale: 1, 26 alpha: 1, 27 color: c() 28 }), t.body.appendChild(a) 29 } 30 31 function i(e) { 32 var a = t.createElement(\u0026#34;style\u0026#34;); 33 a.type = \u0026#34;text/css\u0026#34;; 34 try { 35 a.appendChild(t.createTextNode(e)) 36 } catch (t) { 37 a.styleSheet.cssText = e 38 } 39 t.getElementsByTagName(\u0026#34;head\u0026#34;)[0].appendChild(a) 40 } 41 42 function c() { 43 return \u0026#34;rgb(\u0026#34; + ~~(255 * Math.random()) + \u0026#34;,\u0026#34; + ~~(255 * Math.random()) + \u0026#34;,\u0026#34; + ~~(255 * Math 44 .random()) + \u0026#34;)\u0026#34; 45 } 46 var s = []; 47 e.requestAnimationFrame = e.requestAnimationFrame || e.webkitRequestAnimationFrame || e 48 .mozRequestAnimationFrame || e.oRequestAnimationFrame || e.msRequestAnimationFrame || function (e) { 49 setTimeout(e, 1e3 / 60) 50 }, i( 51 \u0026#34;.heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: \u0026#39;\u0026#39;;width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}\u0026#34; 52 ), n(), r() 53 }(window, document); 54\u0026lt;/script\u0026gt; 然后再在layouts\\_default\\baseof.html中的{{ partial \u0026quot;footer/include.html\u0026quot; . }}下添加以下代码：\n1{{ partial \u0026#34;footer/mouse-click.html\u0026#34; . }} 鼠标轨迹蜘蛛特效 单独的背景有点单调，感觉添加一些线条更有灵动的美感\n原代码(我放到了上面创建的mouse-click.html里，也可以单独创建文件夹或者直接放到baseof.html中)：\n1\u0026lt;style\u0026gt; 2!function () { 3 function n(n, e, t) { 4 return n.getAttribute(e) || t 5 } 6 7 function e(n) { 8 return document.getElementsByTagName(n) 9 } 10 11 function t() { 12 var t = e(\u0026#34;script\u0026#34;), o = t.length, i = t[o - 1]; 13 return {l: o, z: n(i, \u0026#34;zIndex\u0026#34;, -1), o: n(i, \u0026#34;opacity\u0026#34;, .5), c: n(i, \u0026#34;color\u0026#34;, \u0026#34;0,0,0\u0026#34;), n: n(i, \u0026#34;count\u0026#34;, 99)} 14 } 15 16 function o() { 17 a = m.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, c = m.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight 18 } 19 20 function i() { 21 r.clearRect(0, 0, a, c); 22 var n, e, t, o, m, l; 23 s.forEach(function (i, x) { 24 for (i.x += i.xa, i.y += i.ya, i.xa *= i.x \u0026gt; a || i.x \u0026lt; 0 ? -1 : 1, i.ya *= i.y \u0026gt; c || i.y \u0026lt; 0 ? -1 : 1, r.fillRect(i.x - .5, i.y - .5, 1, 1), e = x + 1; e \u0026lt; u.length; e++) n = u[e], null !== n.x \u0026amp;\u0026amp; null !== n.y \u0026amp;\u0026amp; (o = i.x - n.x, m = i.y - n.y, l = o * o + m * m, l \u0026lt; n.max \u0026amp;\u0026amp; (n === y \u0026amp;\u0026amp; l \u0026gt;= n.max / 2 \u0026amp;\u0026amp; (i.x -= .03 * o, i.y -= .03 * m), t = (n.max - l) / n.max, r.beginPath(), r.lineWidth = t / 2, r.strokeStyle = \u0026#34;rgba(\u0026#34; + d.c + \u0026#34;,\u0026#34; + (t + .2) + \u0026#34;)\u0026#34;, r.moveTo(i.x, i.y), r.lineTo(n.x, n.y), r.stroke())) 25 }), x(i) 26 } 27 28 var a, c, u, m = document.createElement(\u0026#34;canvas\u0026#34;), d = t(), l = \u0026#34;c_n\u0026#34; + d.l, r = m.getContext(\u0026#34;2d\u0026#34;), 29 x = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (n) { 30 window.setTimeout(n, 1e3 / 45) 31 }, w = Math.random, y = {x: null, y: null, max: 2e4}; 32 m.id = l, m.style.cssText = \u0026#34;position:fixed;top:0;left:0;z-index:\u0026#34; + d.z + \u0026#34;;opacity:\u0026#34; + d.o, e(\u0026#34;body\u0026#34;)[0].appendChild(m), o(), window.onresize = o, window.onmousemove = function (n) { 33 n = n || window.event, y.x = n.clientX, y.y = n.clientY 34 }, window.onmouseout = function () { 35 y.x = null, y.y = null 36 }; 37 for (var s = [], f = 0; d.n \u0026gt; f; f++) { 38 var h = w() * a, g = w() * c, v = 2 * w() - 1, p = 2 * w() - 1; 39 s.push({x: h, y: g, xa: v, ya: p, max: 6e3}) 40 } 41 u = s.concat([y]), setTimeout(function () { 42 i() 43 }, 100) 44}(); 45\u0026lt;/style\u0026gt; 下面这段代码中的color可以更改蛛丝的颜色（rgb格式）\n1function t() { 2 var t = e(\u0026#34;script\u0026#34;), o = t.length, i = t[o - 1]; 3 return {l: o, z: n(i, \u0026#34;zIndex\u0026#34;, -1), o: n(i, \u0026#34;opacity\u0026#34;, .5), c: n(i, \u0026#34;color\u0026#34;, \u0026#34;0,0,0\u0026#34;), n: n(i, \u0026#34;count\u0026#34;, 99)} 4} 由于我添加了背景图片，所以对代码做了一些修改，修改后的代码为：\n1\u0026lt;!-- 鼠标蜘蛛网特效 --\u0026gt; 2\u0026lt;script\u0026gt; 3 !function () { 4 // 1. 获取配置与颜色 5 function getConfig() { 6 var isDark = document.body.getAttribute(\u0026#39;data-scheme\u0026#39;) === \u0026#39;dark\u0026#39;; 7 // 深色模式：淡蓝色 (173, 216, 230)；浅色模式：深灰色/蓝色 (50, 50, 50) 8 var colorRGB = isDark ? \u0026#34;173, 216, 230\u0026#34; : \u0026#34;100, 100, 100\u0026#34;; 9 return { 10 zIndex: -1, // 层级 11 opacity: 0.6, // 透明度 12 color: colorRGB, // 颜色 13 count: 80, // 粒子数量 (太多会卡，太少不明显) 14 distance: 150 // 连线最大距离 15 }; 16 } 17 18 var config = getConfig(); 19 var canvas = document.createElement(\u0026#34;canvas\u0026#34;); 20 var ctx = canvas.getContext(\u0026#34;2d\u0026#34;); 21 var width, height; 22 var particles = []; 23 24 // 鼠标对象 25 var mouse = { x: null, y: null, maxDistance: config.distance * config.distance }; 26 27 // 初始化 Canvas 28 canvas.style.cssText = \u0026#34;position:fixed;top:0;left:0;z-index:\u0026#34; + config.zIndex + \u0026#34;;opacity:\u0026#34; + config.opacity + \u0026#34;;pointer-events:none;\u0026#34;; // pointer-events:none 确保不阻挡点击 29 document.body.appendChild(canvas); 30 31 // 调整大小 32 function resize() { 33 width = canvas.width = window.innerWidth; 34 height = canvas.height = window.innerHeight; 35 } 36 window.addEventListener(\u0026#39;resize\u0026#39;, resize); 37 resize(); 38 39 // 粒子类 40 class Particle { 41 constructor() { 42 this.x = Math.random() * width; 43 this.y = Math.random() * height; 44 this.vx = (Math.random() - 0.5) * 1.5; // 速度稍快一点 45 this.vy = (Math.random() - 0.5) * 1.5; 46 this.size = Math.random() * 2 + 1; 47 } 48 49 update() { 50 this.x += this.vx; 51 this.y += this.vy; 52 53 // 边界反弹 54 if (this.x \u0026lt; 0 || this.x \u0026gt; width) this.vx *= -1; 55 if (this.y \u0026lt; 0 || this.y \u0026gt; height) this.vy *= -1; 56 57 // 鼠标互动：如果鼠标在附近，稍微被吸引 58 if (mouse.x != null) { 59 var dx = mouse.x - this.x; 60 var dy = mouse.y - this.y; 61 var distance = Math.sqrt(dx*dx + dy*dy); 62 if (distance \u0026lt; 200) { 63 var forceDirectionX = dx / distance; 64 var forceDirectionY = dy / distance; 65 var force = (200 - distance) / 200; 66 var directionX = forceDirectionX * force * 0.5; // 吸引力强度 67 var directionY = forceDirectionY * force * 0.5; 68 this.x += directionX; 69 this.y += directionY; 70 } 71 } 72 } 73 74 draw() { 75 ctx.beginPath(); 76 ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); 77 ctx.fillStyle = \u0026#34;rgba(\u0026#34; + config.color + \u0026#34;, 0.5)\u0026#34;; 78 ctx.fill(); 79 } 80 } 81 82 // 初始化粒子 83 function initParticles() { 84 particles = []; 85 for (var i = 0; i \u0026lt; config.count; i++) { 86 particles.push(new Particle()); 87 } 88 } 89 90 // 动画循环 91 function animate() { 92 ctx.clearRect(0, 0, width, height); 93 94 for (var i = 0; i \u0026lt; particles.length; i++) { 95 particles[i].update(); 96 particles[i].draw(); 97 98 // 绘制连线 99 for (var j = i; j \u0026lt; particles.length; j++) { 100 var dx = particles[i].x - particles[j].x; 101 var dy = particles[i].y - particles[j].y; 102 var distance = dx*dx + dy*dy; 103 104 if (distance \u0026lt; mouse.maxDistance) { 105 ctx.beginPath(); 106 // 距离越近线越粗/越不透明 107 var opacity = 1 - (distance / mouse.maxDistance); 108 ctx.strokeStyle = \u0026#34;rgba(\u0026#34; + config.color + \u0026#34;,\u0026#34; + opacity + \u0026#34;)\u0026#34;; 109 ctx.lineWidth = 1; 110 ctx.moveTo(particles[i].x, particles[i].y); 111 ctx.lineTo(particles[j].x, particles[j].y); 112 ctx.stroke(); 113 } 114 } 115 116 // 绘制鼠标连线 117 if (mouse.x != null) { 118 var dx = particles[i].x - mouse.x; 119 var dy = particles[i].y - mouse.y; 120 var distance = dx*dx + dy*dy; 121 if (distance \u0026lt; mouse.maxDistance) { 122 ctx.beginPath(); 123 var opacity = 1 - (distance / mouse.maxDistance); 124 ctx.strokeStyle = \u0026#34;rgba(\u0026#34; + config.color + \u0026#34;,\u0026#34; + opacity + \u0026#34;)\u0026#34;; 125 ctx.lineWidth = 1.5; // 鼠标连线稍粗 126 ctx.moveTo(particles[i].x, particles[i].y); 127 ctx.lineTo(mouse.x, mouse.y); 128 ctx.stroke(); 129 } 130 } 131 } 132 requestAnimationFrame(animate); 133 } 134 135 // 监听鼠标 136 window.addEventListener(\u0026#39;mousemove\u0026#39;, function(e) { 137 mouse.x = e.x; 138 mouse.y = e.y; 139 }); 140 141 window.addEventListener(\u0026#39;mouseout\u0026#39;, function() { 142 mouse.x = null; 143 mouse.y = null; 144 }); 145 146 // 监听主题切换以更新颜色 147 var observer = new MutationObserver(function(mutations) { 148 mutations.forEach(function(mutation) { 149 if (mutation.attributeName === \u0026#39;data-scheme\u0026#39;) { 150 config = getConfig(); 151 mouse.maxDistance = config.distance * config.distance; 152 } 153 }); 154 }); 155 observer.observe(document.body, { attributes: true, attributeFilter: [\u0026#39;data-scheme\u0026#39;] }); 156 157 initParticles(); 158 animate(); 159 }(); 160\u0026lt;/script\u0026gt; 下面这段代码可以按自己的喜好修改蛛丝的效果，颜色可跟随主题的明暗变化修改，需要rgb值。\n1 function getConfig() { 2 var isDark = document.body.getAttribute(\u0026#39;data-scheme\u0026#39;) === \u0026#39;dark\u0026#39;; 3 // 深色模式：淡蓝色 (173, 216, 230)；浅色模式：深灰色/蓝色 (50, 50, 50) 4 var colorRGB = isDark ? \u0026#34;173, 216, 230\u0026#34; : \u0026#34;100, 100, 100\u0026#34;; 5 return { 6 zIndex: -1, // 层级 7 opacity: 0.6, // 透明度 8 color: colorRGB, // 颜色 9 count: 80, // 粒子数量 (太多会卡，太少不明显) 10 distance: 150 // 连线最大距离 11 }; 12 } 小巧思 | Shortcoeds 整理了一些有趣的短代码，归档整理一下，便于使用~\n1️⃣animated-text 动态文字 Hugo Stack Hugo Stack Hugo Stack Hugo Stack Hugo Stack Hugo Stack Hugo Stack Hugo Stack Hugo Stack Hugo Stack Hugo Stack Hugo Stack 代码 ：\n1#layouts\\shortcodes\\animated-text.html（没有就新建，做了明暗主题适配，可自定义颜色） 2{{ $text := .Get \u0026#34;text\u0026#34; | default \u0026#34;L a p h e l\u0026#34; }} 3{{ $align := .Get \u0026#34;align\u0026#34; | default \u0026#34;center\u0026#34; }} 4{{ $fontSize := .Get \u0026#34;font-size\u0026#34; | default \u0026#34;90\u0026#34; }} 5 6\u0026lt;!-- 定义 CSS 变量，根据主题切换颜色 --\u0026gt; 7\u0026lt;style\u0026gt; 8 :root { 9 /* 10 明亮模式配色：护眼莫兰迪黄绿系 11 特点：低饱和度，低对比度，柔和自然 12 */ 13 --stroke-color-1: #6b8c70; /* 灰橄榄绿 */ 14 --stroke-color-2: #8da386; /* 鼠尾草绿 */ 15 --stroke-color-3: #b8c99e; /* 淡芽绿 */ 16 --stroke-color-4: #579b1b; /* 米白绿 (高光) */ 17 } 18 19 /* 20 暗色模式配色：保持之前的霓虹/荧光感 21 因为暗色模式下需要高亮度才能看清，所以保留高饱和度 22 */ 23 [data-scheme=\u0026#34;dark\u0026#34;] { 24 --stroke-color-1: #2e4a2e; 25 --stroke-color-2: #558b2f; 26 --stroke-color-3: #76b041; 27 --stroke-color-4: #ccff00; 28 } 29\u0026lt;/style\u0026gt; 30 31\u0026lt;div class=\u0026#34;\u0026#34; style=\u0026#34;text-align: {{ $align }}; width: 100%; max-width: 100%;\u0026#34;\u0026gt; 32 \u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;name\u0026#34; font-size=\u0026#34;{{ $fontSize }}\u0026#34; viewBox=\u0026#34;0 0 1000 200\u0026#34; preserveAspectRatio=\u0026#34;xMidYMid meet\u0026#34;\u0026gt; 33 {{ $textAnchor := \u0026#34;middle\u0026#34; }} 34 {{ $xPosition := \u0026#34;50%\u0026#34; }} 35 {{ if eq $align \u0026#34;left\u0026#34; }} 36 {{ $textAnchor = \u0026#34;start\u0026#34; }} 37 {{ $xPosition = \u0026#34;0%\u0026#34; }} 38 {{ else if eq $align \u0026#34;right\u0026#34; }} 39 {{ $textAnchor = \u0026#34;end\u0026#34; }} 40 {{ $xPosition = \u0026#34;100%\u0026#34; }} 41 {{ end }} 42 43 \u0026lt;!-- 第一层：基础轮廓色 --\u0026gt; 44 \u0026lt;text text-anchor=\u0026#34;{{ $textAnchor }}\u0026#34; x=\u0026#34;{{ $xPosition }}\u0026#34; y=\u0026#34;66%\u0026#34; text-transform=\u0026#34;uppercase\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;var(--stroke-color-1)\u0026#34; stroke-width=\u0026#34;1px\u0026#34; stroke-dasharray=\u0026#34;90 310\u0026#34;\u0026gt; 45 {{ $text }} 46 \u0026lt;animate attributeName=\u0026#34;stroke-dashoffset\u0026#34; begin=\u0026#34;-1.5s\u0026#34; dur=\u0026#34;6s\u0026#34; from=\u0026#34;0\u0026#34; to=\u0026#34;-400\u0026#34; repeatCount=\u0026#34;indefinite\u0026#34;\u0026gt;\u0026lt;/animate\u0026gt; 47 \u0026lt;/text\u0026gt; 48 49 \u0026lt;!-- 第二层：过渡色 --\u0026gt; 50 \u0026lt;text text-anchor=\u0026#34;{{ $textAnchor }}\u0026#34; x=\u0026#34;{{ $xPosition }}\u0026#34; y=\u0026#34;66%\u0026#34; text-transform=\u0026#34;uppercase\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;var(--stroke-color-2)\u0026#34; stroke-width=\u0026#34;1px\u0026#34; stroke-dasharray=\u0026#34;90 310\u0026#34;\u0026gt; 51 {{ $text }} 52 \u0026lt;animate attributeName=\u0026#34;stroke-dashoffset\u0026#34; begin=\u0026#34;-3s\u0026#34; dur=\u0026#34;6s\u0026#34; from=\u0026#34;0\u0026#34; to=\u0026#34;-400\u0026#34; repeatCount=\u0026#34;indefinite\u0026#34;\u0026gt;\u0026lt;/animate\u0026gt; 53 \u0026lt;/text\u0026gt; 54 55 \u0026lt;!-- 第三层：亮色 --\u0026gt; 56 \u0026lt;text text-anchor=\u0026#34;{{ $textAnchor }}\u0026#34; x=\u0026#34;{{ $xPosition }}\u0026#34; y=\u0026#34;66%\u0026#34; text-transform=\u0026#34;uppercase\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;var(--stroke-color-3)\u0026#34; stroke-width=\u0026#34;1px\u0026#34; stroke-dasharray=\u0026#34;90 310\u0026#34;\u0026gt; 57 {{ $text }} 58 \u0026lt;animate attributeName=\u0026#34;stroke-dashoffset\u0026#34; begin=\u0026#34;-4.5s\u0026#34; dur=\u0026#34;6s\u0026#34; from=\u0026#34;0\u0026#34; to=\u0026#34;-400\u0026#34; repeatCount=\u0026#34;indefinite\u0026#34;\u0026gt;\u0026lt;/animate\u0026gt; 59 \u0026lt;/text\u0026gt; 60 61 \u0026lt;!-- 第四层：高光/柔和色 --\u0026gt; 62 \u0026lt;text text-anchor=\u0026#34;{{ $textAnchor }}\u0026#34; x=\u0026#34;{{ $xPosition }}\u0026#34; y=\u0026#34;66%\u0026#34; text-transform=\u0026#34;uppercase\u0026#34; fill=\u0026#34;none\u0026#34; stroke=\u0026#34;var(--stroke-color-4)\u0026#34; stroke-width=\u0026#34;1px\u0026#34; stroke-dasharray=\u0026#34;90 310\u0026#34;\u0026gt; 63 {{ $text }} 64 \u0026lt;animate attributeName=\u0026#34;stroke-dashoffset\u0026#34; begin=\u0026#34;-6s\u0026#34; dur=\u0026#34;6s\u0026#34; from=\u0026#34;0\u0026#34; to=\u0026#34;-400\u0026#34; repeatCount=\u0026#34;indefinite\u0026#34;\u0026gt;\u0026lt;/animate\u0026gt; 65 \u0026lt;/text\u0026gt; 66 \u0026lt;/svg\u0026gt; 67\u0026lt;/div\u0026gt; 使用方式：\n1{\u0026lt; animated-text text=\u0026#34;Hugo Stack\u0026#34; font-size=\u0026#34;\u0026#34;\u0026gt; align=\u0026#34;\u0026#34;\u0026gt;} 2# align=\u0026#34;left\u0026#34; | \u0026#34;right\u0026#34; | \u0026#34;center\u0026#34; 默认center 3# font-size 按自己的需求填写，默认90px 4# 使用的时候要用{{ }} 2️⃣ 重点标记\nHugo Stack 代码：\nhtml 1#layouts\\shortcodes\\mark.html(没有就新建) 2\u0026lt;mark\u0026gt;{{ .Get \u0026#34;text\u0026#34; }}\u0026lt;/mark\u0026gt; css 1#assets\\scss\\custom.scss 2mark{ 3 background: hsla(165, 64%, 63%, 0.696); 4} 使用方式：\n1{\u0026lt; mark text=\u0026#34;Hugo Stack\u0026#34; \u0026gt;}//实际为{{ }} 3️⃣ 文本折叠\n叠叠叠叠 “嘿，兄弟，我们好久不见你在哪里；嘿，朋友，如果真的是你请打招呼……\n“爱情，是激情和柔情的混合体，是超脱于理智之外的感情。”\n代码：\n1#layouts\\shortcodes\\detail.html 2\u0026lt;details\u0026gt; 3 \u0026lt;summary\u0026gt;{{ (.Get 0) | markdownify }}\u0026lt;/summary\u0026gt; 4 {{ .Inner | markdownify }} 5\u0026lt;/details\u0026gt; 使用：\n1{\u0026lt; detail \u0026#34;叠叠乐\u0026#34; \u0026gt;} // 实际 {{ }} 2\u0026lt;p\u0026gt;“嘿，兄弟，我们好久不见你在哪里；嘿，朋友，如果真的是你请打招呼……\u0026lt;/p\u0026gt; 3 4\u0026lt;p\u0026gt;“爱情，是激情和柔情的混合体，是超脱于理智之外的感情。”\u0026lt;/p\u0026gt; 5{\u0026lt; /detail \u0026gt;} //实际 {{ }} 4️⃣ 文本高斯模糊\n代码：\n1#assets\\scss\\custom.scss 2.blur { 3 color: transparent; 4 text-shadow:0px 0px 8px var(--card-text-color-main) 5} 6 7.blur:hover { 8 color: transparent; 9 text-shadow:0px 0px 0px var(--card-text-color-main) 10 11} 使用：\n1\u0026lt;span class=\u0026#34;blur\u0026#34;\u0026gt;谁是七侠镇一妈啊？\u0026lt;br\u0026gt;换行加空标签\u0026lt;/span\u0026gt; 5️⃣ 文字渐变\n这世界有太多不如意,\n可是你的生活还是要继续。\n太阳每天依旧要升起，希望永远种在你心里。\n代码：\n1//文字颜色渐变 2.colorfulfont { 3 background: linear-gradient(to right, rgb(25, 221, 238), #ed4588); //第一个颜色代码是渐变起始色，第二个颜色代码是渐变结束色； 4 -webkit-background-clip: text; 5 background-clip: text; 6 color: transparent; 7} 使用：\n1\u0026lt;font class=\u0026#34;colorfulfont\u0026#34;\u0026gt; 这世界有太多不如意,\u0026lt;br\u0026gt;可是你的生活还是要继续。\u0026lt;br\u0026gt; 太阳每天依旧要升起，希望永远种在你心里。\u0026lt;/font\u0026gt; 6️⃣ 文本位置\n文字居左\n文字居中\n文字居右\n代码：\nhtml 1layouts\\shortcodes\\align.html 2\u0026lt;p style=\u0026#34;text-align:{{ index .Params 0 }}\u0026#34;\u0026gt;{{ index .Params 1 | markdownify }}\u0026lt;/p\u0026gt; 使用：\n1{\u0026lt; align left \u0026#34;文字居左\u0026#34; \u0026gt;} 2{\u0026lt; align center \u0026#34;文字居中\u0026#34; \u0026gt;} 3{\u0026lt; align right \u0026#34;文字居右\u0026#34; \u0026gt;} 4//实际使用记得换成双括号。 7️⃣ 摘录引用\n“感觉只是一瞬间的事，感情才是一辈子的事”\n宁财神 武林外传 代码：\n1#layouts\\shortcodes\\quote.html 2\u0026lt;!-- reset scratch variables at the start --\u0026gt; 3{{ $.Scratch.Set \u0026#34;bl_author\u0026#34; false }} 4{{ $.Scratch.Set \u0026#34;bl_source\u0026#34; false }} 5{{ $.Scratch.Set \u0026#34;bl_link\u0026#34; false }} 6{{ $.Scratch.Set \u0026#34;bl_title\u0026#34; false }} 7 8{{ if .IsNamedParams }} 9 {{ $.Scratch.Set \u0026#34;bl_author\u0026#34; (.Get \u0026#34;author\u0026#34;) }} 10 {{ $.Scratch.Set \u0026#34;bl_source\u0026#34; (.Get \u0026#34;source\u0026#34;) }} 11 {{ $.Scratch.Set \u0026#34;bl_link\u0026#34; (.Get \u0026#34;link\u0026#34;) }} 12 {{ $.Scratch.Set \u0026#34;bl_title\u0026#34; (.Get \u0026#34;title\u0026#34;) }} 13{{ else }} 14 \u0026lt;!-- for the positional version if any --\u0026gt; 15{{ end }} 16 17\u0026lt;!-- if title is not set explicitly then we need to beautify the link 18 if length of link is more than 32 chars, we will cut it off by 32 and 19 then drop everything after the last / if any and put it in into title --\u0026gt; 20 21{{ with $.Scratch.Get \u0026#34;bl_title\u0026#34; }} 22 \u0026lt;!-- do nothing --\u0026gt; 23{{ else }} 24 {{ with $.Scratch.Get \u0026#34;bl_link\u0026#34; }} \u0026lt;!-- if link is given --\u0026gt; 25 {{ range last 1 (split ($.Scratch.Get \u0026#34;bl_link\u0026#34; ) \u0026#34;://\u0026#34;) }} \u0026lt;!-- split by :// and then only take the items after it to remove protocol:// --\u0026gt; 26 {{ $.Scratch.Set \u0026#34;title_without_protocol\u0026#34; . }} 27 {{ end }} 28 {{ range last 1 (split ($.Scratch.Get \u0026#34;title_without_protocol\u0026#34; ) \u0026#34;www.\u0026#34;) }} \u0026lt;!-- also remove the www. at the start if any. we are using a second split because all URLS may not start with it --\u0026gt; 29 {{ $.Scratch.Set \u0026#34;title_without_protocol\u0026#34; . }} 30 {{ end }} 31 {{ $.Scratch.Set \u0026#34;bl_title\u0026#34; ($.Scratch.Get \u0026#34;title_without_protocol\u0026#34;) }} 32 33 \u0026lt;!-- if link is longer than 32 bytes we should trim it --\u0026gt; 34 {{ if (gt (len ($.Scratch.Get \u0026#34;title_without_protocol\u0026#34;) ) 32) }} 35 {{ $title := (slicestr ($.Scratch.Get \u0026#34;title_without_protocol\u0026#34;) 0 32) }} \u0026lt;!-- get the first 32 characters of title_without_protocol --\u0026gt; 36 {{ $split_by_fw_slash := split $title \u0026#34;/\u0026#34; }} \u0026lt;!-- now split on / because we want to stop after the last forward slash --\u0026gt; 37 {{ $count := (sub (len $split_by_fw_slash) 1) }} \u0026lt;!-- we want everything but the last part so we adjust the count accordingly --\u0026gt; 38 39 {{ $.Scratch.Set \u0026#34;tempstring\u0026#34; \u0026#34;\u0026#34; }} \u0026lt;!-- temp variable to hold the concatinated string --\u0026gt; 40 {{ range first $count $split_by_fw_slash }} \u0026lt;!-- loop through all parts except last and concat them (add / between halves) --\u0026gt; 41 {{ $.Scratch.Set \u0026#34;tempstring\u0026#34; ( . | printf \u0026#34;%s%s/\u0026#34; ($.Scratch.Get \u0026#34;tempstring\u0026#34;) | printf \u0026#34;%s\u0026#34; ) }} 42 {{ end }} 43 {{ $.Scratch.Set \u0026#34;bl_title\u0026#34; ( printf \u0026#34;%s...\u0026#34; ($.Scratch.Get \u0026#34;tempstring\u0026#34;) | printf \u0026#34;%s\u0026#34; ) }} 44 {{ end }} 45 {{ end }} 46{{ end }} 47 48\u0026lt;blockquote\u0026gt; 49 \u0026lt;p\u0026gt;{{ .Inner | markdownify }}\u0026lt;/p\u0026gt; 50 \u0026lt;footer style=\u0026#34;text-align:right\u0026#34;\u0026gt; 51 \u0026lt;strong\u0026gt;{{ with $.Scratch.Get \u0026#34;bl_author\u0026#34; }}{{ . }}{{ end }}\u0026lt;/strong\u0026gt; 52 {{ with $.Scratch.Get \u0026#34;bl_source\u0026#34; }} 53 \u0026lt;cite\u0026gt;{{ . }}\u0026lt;/cite\u0026gt; 54 {{ else }} 55 {{ with $.Scratch.Get \u0026#34;bl_link\u0026#34; }} 56 \u0026lt;cite\u0026gt; 57 \u0026lt;a href=\u0026#34;{{ . }}\u0026#34; title=\u0026#34;{{ . }}\u0026#34; rel=\u0026#34;noopener noreferrer\u0026#34;\u0026gt;{{ $.Scratch.Get \u0026#34;bl_title\u0026#34; }}\u0026lt;/a\u0026gt; \u0026lt;!-- can\u0026#39;t have new lines here --\u0026gt; 58 \u0026lt;/cite\u0026gt; 59 {{ else }} 60 {{ with $.Scratch.Get \u0026#34;bl_title\u0026#34; }} 61 \u0026lt;cite\u0026gt; 62 {{ $.Scratch.Get \u0026#34;bl_title\u0026#34; }}\u0026lt;/a\u0026gt; 63 \u0026lt;/cite\u0026gt; 64 {{ end }} 65 {{ end }} 66 {{ end }} 67 \u0026lt;/footer\u0026gt; 68\u0026lt;/blockquote\u0026gt; 使用：\n1{\u0026lt; quote author=\u0026#34;作者\u0026#34; link=\u0026#34;可不加\u0026#34; title=\u0026#34;作品名\u0026#34; \u0026gt;} 2这里写引用内容，实际使用记得换成双括号。 3{\u0026lt; /quote \u0026gt;} 8️⃣ 居中引用\n我生从何来？\n死往何处？\n我为何要出现在这个世界上？ 代码：\nhtml 1#layouts\\shortcodes\\quote-center.html 2{{- $content := .Inner | markdownify -}} 3 4\u0026lt;blockquote class=\u0026#34;quote-center\u0026#34;\u0026gt; 5 {{- $content | safeHTML -}} 6\u0026lt;/blockquote\u0026gt; css 1#assets\\scss\\custom.scss 2// 居中引用格式 3blockquote.quote-center { 4 position: relative; 5 border: none; 6 padding: 2rem 0; 7 text-align: center; // 直接在这里居中，继承给子元素 8 9 p { 10 margin: 0; 11 position: relative; 12 z-index: 1; // 确保文字在装饰线之上 13 } 14 15 \u0026amp;::before, 16 \u0026amp;::after { 17 position: absolute; 18 top: 50%; 19 transform: translateY(-50%); // 垂直居中 20 font-size: 2rem; 21 color: #6496c880; 22 width: 30%; // 限制装饰线宽度 23 height: 1px; 24 background: #6496c880; // 使用背景色画线，比 content 更可控 25 content: \u0026#39;\u0026#39;; 26 } 27 28 \u0026amp;::before { 29 left: 0; 30 background: linear-gradient(to right, transparent, #6496c880); 31 } 32 33 \u0026amp;::after { 34 right: 0; 35 background: linear-gradient(to left, transparent, #6496c880); 36 } 37 38 // 如果还要加引号 39 .quote-icon { 40 font-size: 3em; 41 color: #6496c880; 42 display: block; 43 margin-bottom: 10px; 44 } 45} 使用：\n1{\u0026lt; quote-center \u0026gt;} 2我生从何来？\u0026lt;br\u0026gt;死往何处？\u0026lt;br\u0026gt;我为何要出现在这个世界上？ 3{\u0026lt; /quote-center \u0026gt;} 4//实际是 {{ }} 9️⃣ 仿Github样式\n莫非 保留自己的真诚~ 可以当标签用？ 代码：\nhtml 1\u0026lt;div class=\u0026#34;github\u0026#34;\u0026gt; 2 \u0026lt;div class=\u0026#34;logo\u0026#34;\u0026gt; 3 {{ replace $.Site.Data.SVG.repository \u0026#34;icon\u0026#34; \u0026#34;icon github-icon\u0026#34; | safeHTML }} 4 \u0026lt;a class=\u0026#34;name\u0026#34; href={{ .Get \u0026#34;link\u0026#34; }} target=\u0026#34;_blank\u0026#34;\u0026gt;{{ .Get \u0026#34;name\u0026#34; }}\u0026lt;/a\u0026gt; 5 \u0026lt;/div\u0026gt; 6 \u0026lt;div class=\u0026#34;description\u0026#34;\u0026gt;{{ .Get \u0026#34;description\u0026#34; }}\u0026lt;/div\u0026gt; 7 \u0026lt;div class=\u0026#34;language\u0026#34;\u0026gt; 8 \u0026lt;span class=\u0026#34;language-color\u0026#34; style=\u0026#34;background-color: {{ .Get \u0026#34;color\u0026#34; }}\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; 9 \u0026lt;span class=\u0026#34;language-name\u0026#34;\u0026gt;{{ .Get \u0026#34;language\u0026#34; }}\u0026lt;/span\u0026gt; 10 \u0026lt;/div\u0026gt; 11\u0026lt;/div\u0026gt; css 1//github样式 2.github { 3 border: 1px solid var(--card-text-color-main); 4 border-radius: 3px; 5 margin: 0 auto; 6 margin-bottom: 1em; 7 padding: 1em; 8 .github-icon { 9 width: 1.2em; 10 height: 1.2em; 11 margin-right: 0.5em; 12 margin-bottom: 0.2em; 13 fill: var(--card-text-color-main); 14 transition: all 0.5s; 15 } 16 .name { 17 font-weight: bold; 18 color: #2e97d9; 19 text-decoration: underline; 20 margin-left: 0.5em; 21 position: relative; 22 top: -5px; //加这个属性是因为我的图标和名称无法对齐，实际使用的时候要根据自己的网站修改 23 } 24 .description { 25 margin-top: 0.5em; 26 margin-bottom: 0.5em; 27 color: var(--card-text-color-main); 28 text-align: justify; 29 font-size: 90%; 30 transition: all 0.5s; 31 } 32 .language-color { 33 position: relative; 34 top: 1px; 35 display: inline-block; 36 width: 0.75em; 37 height: 0.75em; 38 border-radius: 50%; 39 } 40 .language-name { 41 color: var(--card-text-color-main); 42 font-size: 90%; 43 margin-left: 0.5em; 44 transition: all 0.5s; 45 } 46} 图标(Github原始图标，可替换):\n1# data\\SVG.toml 2repository = \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon\u0026#34; viewBox=\u0026#34;0 0 16 16\u0026#34;\u0026gt;\u0026lt;path fill-rule=\u0026#34;evenodd\u0026#34; clip-rule=\u0026#34;evenodd\u0026#34; d=\u0026#34;M2 2.5C2 1.83696 2.26339 1.20107 2.73223 0.732233C3.20108 0.263392 3.83696 0 4.5 0L13.25 0C13.4489 0 13.6397 0.0790176 13.7803 0.21967C13.921 0.360322 14 0.551088 14 0.75V13.25C14 13.4489 13.921 13.6397 13.7803 13.7803C13.6397 13.921 13.4489 14 13.25 14H10.75C10.5511 14 10.3603 13.921 10.2197 13.7803C10.079 13.6397 10 13.4489 10 13.25C10 13.0511 10.079 12.8603 10.2197 12.7197C10.3603 12.579 10.5511 12.5 10.75 12.5H12.5V10.5H4.5C4.30308 10.5 4.11056 10.5582 3.94657 10.6672C3.78257 10.7762 3.65442 10.9312 3.57816 11.1128C3.50191 11.2943 3.48096 11.4943 3.51793 11.6878C3.5549 11.8812 3.64816 12.0594 3.786 12.2C3.92524 12.3422 4.0023 12.5338 4.00024 12.7328C3.99818 12.9318 3.91716 13.1218 3.775 13.261C3.63285 13.4002 3.4412 13.4773 3.24222 13.4752C3.04325 13.4732 2.85324 13.3922 2.714 13.25C2.25571 12.7829 1.99929 12.1544 2 11.5V2.5ZM12.5 1.5V9H4.5C4.144 9 3.806 9.074 3.5 9.208V2.5C3.5 2.23478 3.60536 1.98043 3.79289 1.79289C3.98043 1.60536 4.23478 1.5 4.5 1.5H12.5ZM5 12.25V15.5C5 15.5464 5.01293 15.5919 5.03734 15.6314C5.06175 15.6709 5.09667 15.7028 5.1382 15.7236C5.17972 15.7444 5.22621 15.7532 5.27245 15.749C5.31869 15.7448 5.36286 15.7279 5.4 15.7L6.85 14.613C6.89328 14.5805 6.94591 14.563 7 14.563C7.05409 14.563 7.10673 14.5805 7.15 14.613L8.6 15.7C8.63714 15.7279 8.68131 15.7448 8.72755 15.749C8.77379 15.7532 8.82028 15.7444 8.8618 15.7236C8.90333 15.7028 8.93826 15.6709 8.96266 15.6314C8.98707 15.5919 9 15.5464 9 15.5V12.25C9 12.1837 8.97366 12.1201 8.92678 12.0732C8.87989 12.0263 8.81631 12 8.75 12H5.25C5.1837 12 5.12011 12.0263 5.07322 12.0732C5.02634 12.1201 5 12.1837 5 12.25Z\u0026#34;/\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39; 使用：\n1{\u0026lt; github 2 name=\u0026#34;链接标题\u0026#34; 3 link=\u0026#34;https://链接本体\u0026#34; 4 description=\u0026#34;链接内容描述\u0026#34; 5 color=\u0026#34;#小圆点颜色\u0026#34; 6 language=\u0026#34;可以当标签用？\u0026#34;//实际使用需要双括号 7\u0026gt;} 🔟 标签快样式\nWarning：需要双括号。\ninfo：这是一条信息。\nnote：可以标注一下，但是没必要。\ntip：在示例里胡说八道会使观看者会心一笑。\n代码：\nhtml 1\u0026lt;!-- /layouts/shortcodes/notice.html --\u0026gt; 2 3{{- $noticeType := .Get 0 -}} 4 5{{- $raw := (markdownify .Inner | chomp) -}} 6 7{{- $block := findRE \u0026#34;(?is)^\u0026lt;(?:address|article|aside|blockquote|canvas|dd|div|dl|dt|fieldset|figcaption|figure|footer|form|h(?:1|2|3|4|5|6)|header|hgroup|hr|li|main|nav|noscript|ol|output|p|pre|section|table|tfoot|ul|video)\\\\b\u0026#34; $raw 1 -}} 8 9{{ $icon := (replace (index $.Site.Data.SVG $noticeType) \u0026#34;icon\u0026#34; \u0026#34;icon notice-icon\u0026#34;) }} 10\u0026lt;div class=\u0026#34;notice {{ $noticeType }}\u0026#34; {{ if len .Params | eq 2 }} id=\u0026#34;{{ .Get 1 }}\u0026#34; {{ end }}\u0026gt; 11 \u0026lt;div class=\u0026#34;notice-title\u0026#34;\u0026gt;{{ $icon | safeHTML }}\u0026lt;/div\u0026gt; 12 {{- if or $block (not $raw) }}{{ $raw }}{{ else }}\u0026lt;p\u0026gt;{{ $raw }}\u0026lt;/p\u0026gt;{{ end -}} 13\u0026lt;/div\u0026gt; css 1#assets\\scss\\custom.scss 2//增加notice短代码 3.notice { 4 position:relative; 5 padding: 1em 1em 1em 2.5em; 6 margin-bottom: 1em; 7 border-radius: 4px; 8 p:last-child { 9 margin-bottom: 0; 10 } 11 .notice-title { 12 position: absolute; 13 left: 0.8em; 14 .notice-icon { 15 width: 1.2em; 16 height: 1.2em; 17 } 18 } 19 \u0026amp;.notice-warning { 20 background: hsla(0, 65%, 65%, 0.15); 21 border-left: 5px solid hsl(0, 65%, 65%); 22 .notice-title { 23 color: hsl(0, 65%, 65%); 24 } 25 } 26 \u0026amp;.notice-info { 27 background: hsla(30, 80%, 70%, 0.15); 28 border-left: 5px solid hsl(30, 80%, 70%); 29 .notice-title { 30 color: hsl(30, 80%, 70%); 31 } 32 } 33 \u0026amp;.notice-note { 34 background: hsla(200, 65%, 65%, 0.15); 35 border-left: 5px solid hsl(200, 65%, 65%); 36 .notice-title { 37 color: hsl(200, 65%, 65%); 38 } 39 } 40 \u0026amp;.notice-tip { 41 background: hsla(140, 65%, 65%, 0.15); 42 border-left: 5px solid hsl(140, 65%, 65%); 43 .notice-title { 44 color: hsl(140, 65%, 65%); 45 } 46 } 47} 48 49[data-theme=\u0026#34;dark\u0026#34;] .notice { 50 \u0026amp;.notice-warning { 51 background: hsla(0, 25%, 35%, 0.15); 52 border-left: 5px solid hsl(0, 25%, 35%); 53 .notice-title { 54 color: rgba(224, 108, 108, 0.5); 55 } 56 } 57 \u0026amp;.notice-info { 58 background: hsla(30, 25%, 35%, 0.15); 59 border-left: 5px solid hsl(30, 25%, 35%); 60 .notice-title { 61 color: rgba(240, 178, 117, 0.5); 62 } 63 } 64 \u0026amp;.notice-note { 65 background: hsla(200, 25%, 35%, 0.15); 66 border-left: 5px solid hsl(200, 25%, 35%); 67 .notice-title { 68 color: rgba(108, 185, 224, 0.5); 69 } 70 } 71 \u0026amp;.notice-tip { 72 background: hsla(140, 25%, 35%, 0.15); 73 border-left: 5px solid hsl(140, 25%, 35%); 74 .notice-title { 75 color: rgba(108, 224, 147, 0.5); 76 } 77 } 78} 图标：\n1# data\\SVG.toml 2# Notice Icon 3notice-warning = \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon\u0026#34; viewBox=\u0026#34;0 0 576 512\u0026#34; fill=\u0026#34;hsl(0, 65%, 65%)\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zM124 296c-6.6.0-12-5.4-12-12v-56c0-6.6 5.4-12 12-12h264c6.6.0 12 5.4 12 12v56c0 6.6-5.4 12-12 12H124z\u0026#34;/\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39; 4notice-info = \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon\u0026#34; viewBox=\u0026#34;0 0 512 512\u0026#34; fill=\u0026#34;hsl(30, 80%, 70%)\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M256 8a248 248 0 100 496 248 248 0 000-496zm0 110a42 42 0 110 84 42 42 0 010-84zm56 254c0 7-5 12-12 12h-88c-7 0-12-5-12-12v-24c0-7 5-12 12-12h12v-64h-12c-7 0-12-5-12-12v-24c0-7 5-12 12-12h64c7 0 12 5 12 12v100h12c7 0 12 5 12 12v24z\u0026#34;/\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39; 5notice-note = \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon\u0026#34; viewBox=\u0026#34;0 0 512 512\u0026#34; fill=\u0026#34;hsl(200, 65%, 65%)\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M504 256a248 248 0 11-496 0 248 248 0 01496 0zm-248 50a46 46 0 100 92 46 46 0 000-92zm-44-165l8 136c0 6 5 11 12 11h48c7 0 12-5 12-11l8-136c0-7-5-13-12-13h-64c-7 0-12 6-12 13z\u0026#34;/\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39; 6notice-tip = \u0026#39;\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; class=\u0026#34;icon\u0026#34; viewBox=\u0026#34;0 0 512 512\u0026#34; fill=\u0026#34;hsl(140, 65%, 65%)\u0026#34;\u0026gt;\u0026lt;path d=\u0026#34;M504 256a248 248 0 11-496 0 248 248 0 01496 0zM227 387l184-184c7-6 7-16 0-22l-22-23c-7-6-17-6-23 0L216 308l-70-70c-6-6-16-6-23 0l-22 23c-7 6-7 16 0 22l104 104c6 7 16 7 22 0z\u0026#34;/\u0026gt;\u0026lt;/svg\u0026gt;\u0026#39; 使用：\n1{\u0026lt; notice notice-warning \u0026gt;} 2Warning：需要双括号。 3{\u0026lt; /notice \u0026gt;} 4 5{\u0026lt; notice notice-info \u0026gt;} 6info：这是一条信息。 7{\u0026lt; /notice \u0026gt;} 8 9{\u0026lt; notice notice-note \u0026gt;} 10note：可以标注一下，但是没必要。 11{\u0026lt; /notice \u0026gt;} 12 13{\u0026lt; notice notice-tip \u0026gt;} 14tip：在示例里胡说八道会使观看者会心一笑。 15{\u0026lt; /notice \u0026gt;} ","date":"2025-08-14T00:00:00Z","image":"https://mofei-blog.pages.dev/1.jpeg","permalink":"https://mofei-blog.pages.dev/p/%E5%8D%9A%E5%AE%A2%E7%BE%8E%E5%8C%962/","title":"博客搭建 | Hugo Stack 主题装修笔记（2）"},{"content":"本书基于Windows操作系统\n软件的加密和解密 随着技术的发展，软件加密和解密的研究很有必要。\n软件加密对于开发人员来说，可以保护自己的成果，不轻易被人“借鉴”，但随着技术的不断发展，加密技术也要不断地改进；同时，解密手段也在不断升级。所以，加密和解密是相互促进又相互斗争的关系\n理论上，没有不能破解的加密技术\n所以，作为程序员，研究解密技术可以有助于自己的提升\n逆向分析 逆向工程（Reverse Engineering）是指根据已有的产物和结果，通过分析来推导出具体的实现方法\n逆向工程：可执行程序\u0026ndash;\u0026gt;反编译\u0026ndash;\u0026gt;源代码\n逆向工程的内容分类：\n软件使用的限制的去除或软件功能的天际 软件源代码的再获得 硬件的复现和模拟 逆向分析技术 软件汉化和解密首先要对软件进行分析，对他们的分析可以遵循下面几种方法：\n1、通过软件格式使用说明和操作格式分析软件 分析一个软件，需要先学会这个软件。通过阅读软件的使用手册，学习软件操作并了解软件的功能。经验丰富的程序分析师，能够通过软件的使用说明和操作推测出软件的设计思想和编程思路\n2、静态分析技术 静态分析指根据反汇编得到的程序清单进行分析，常用方法从提示信息入手进行分析。\n原因：现在大多数软件采用人机对话方式设计\n人机对话：软件运行时出现需要用户操作的提示信息，并且在执行某段程序之后显示提示信息来反映该段程序的运行状态或者是提示下一步操作\n因此，阅读通过静态反汇编得到的程序清单，根据包含提示信息的程序片段，可以知道提示信息前后的程序片段所完成的功能，从而宏观了解软件的编程思维\n常用的静态分析工具 IDA\n3、动态分析技术 静态分析可以了解各个模块的功能，以及整个软件的编程思路，但是不能了解软件中各个模块的技术细节\n对于软件分析来说，静态分析只是第一步，动态跟踪才是分析软件的关键。\n动态跟踪主要是指利用OllyDbg或WinDbg等调试工具，一步步跟踪分析\n为什么要对软件进行动态分析 一般软件要分解成若干个模块来实现，后一个模块的执行依赖于前一个模块处理的结果，这个结果也称为中间结果。如果只进行静态分析，很难获得这个中间结果，只有跟踪前一个模块，才能看到这些结果。另外，触发程序执行的条件有多个分支，如果不动态跟踪，很难的得知程序的执行路径 许多软件运行时，最初执行的一段程序需要对后面的各个模块进行一些初始化工作，并不依赖系统的重定位 ？？这个地方有点不懂\n加密程序在运行时会采用逐块解密、逐块执行的方法。仅对软件的密码部分进行返回百年，而不对该软件进行动态跟踪分析，是根本不可能进行解密的 如何有效进行动态分析 动态分析主要包括两点：\n对软件进行粗跟踪 粗跟踪是指在跟踪时要大块大块地跟踪。\n在遇到调用指令（CALL）、重复操作指令（REP）、循环操作指令（LOOP）等时一般不要跟踪，而要根据执行结果分析该段程序的功能\n粗跟踪的原因：\n一般软件划分为若干模块，在分析一个软件时，主要分析的是软件中所关心的部分，然而软件最初执行的模块通常不是我们所关心的 这里涉及合理设置断点，需要了解Win32 API函数，根据当时的情况选择合适的断点\n对关键部分进行细跟踪 对软件进行一定程度的粗跟踪之后，就能获取软件中我们所关心的模块或程序段了，这样就可以有针对性地对该模块进行具体而详细的跟踪结果。一般，可以要进行对此关键代码分析，并将每次关键的中间结果或指令地址记录下来（养成良好的操作习惯）\nWindows操作系统 Windows x86系列CPU采用的是小端序字节存储位置，即低位字节存放在低位地址，高位字节存放在高位地址\nWin32 API函数 API(Application Programming Interface,应用程序编程接口)\n早期，Windows程序设计只能使用API函数进行编程，这些函数提供应用程序运行所需要的窗口管理、图形设备接口、内存管理等服务功能，这些服务以函数库库的形式组织在一起，形成了Win API\n也可以认为API函数是整个Windows框架的基石，下面是Windows操作系统核心，上面是Windows应用程序： Win16: 16位Windows的API\nWin32: 32位Windows的API, 64位Windows API的名称和功能基本没有变化，还是使用Win32的函数名，只是用64位代码实现的\nWindows运转的核心是动态链接库（DLL）\n早期，Windows的主要部分只需要在3个动态链接库中实现：\nKernel(KERNEL32.DLL实现)：操作系统核心功能服务，包括进程和线程控制、内存管理、文件访问等 User（USER32.DLL实现）：负责处理用户接口，包括键盘和鼠标输入、窗口和菜单管理等 GDI（GDI32.DLL实现）：图形设备接口，允许程序在屏幕和打印机上显示文本和图形 除了上述模块，Windows提供了其他DLL以支持更多的功能：\n对象安全性 注册表操作（ADVAPI32.DLL） 通用控件（COMCTL32.DLL） 公共对话框（COMDLG32.DLL） 用户界面外壳（SHELL32.DLL） 网络（NETAPI32.DLL） Win API是基于C语言的接口，但可以由不同语言编写的程序调用，只要遵循调用规范即可\n在NT结构下，Win32 API 接受Unicode和ASCII两种字符集，而其内核只能使用Unicode字符集\nASCII字符集\nUnicode字符集\n在Win32　API函数字符集中，A表示ANSI（即ASCII），W表示Widechars(即nicode)\nANSI 使用单字节方式\nUnicode是宽字节方式，以便处理双字节字符\n每个以字节为参数的Win32 函数在操作系统中都有着两种方式的版本\n例如：MessageBox函数(此函数用于在USER32.DLL用户模块中创建和显示信息框)\n函数原型：\n1int MessageBox( 2 HWND hWnd, //父窗口句柄 3 LPCTSTR lpText, //消息框文本地址 4 LPCTSTR lpCaption, //消息框标题地址 5 UINT uType //消息框样式 6); Windows 2000中的MessageBoxA函数的内部结构：\n1int MessageBoxA( 2 MessageBoxExA{ //调用MessageBoxExA函数 3 MBToWCSEx() //将MessageBoxA消息框的主体文字转换成Unicode字符串 4 MBT0WCSEx() //将将MessageBoxA消息框标题栏上的文字转换成Unicode字符串 5 MessageBoxExW() //调用MessageBoxExW函数 6 HeapFree() //释放内存 7 8 } 9); 上面的结果表明，MessageBoxExA函数其实是一个替换翻译层，用于分配内存，并将ANSI字符串转换成Unicode字符串，系统最终调用Unicode版的MessageBoxExW函数执行。当MessageBoxExW函数返回时，它便释放内存缓存\nwin32 API程序大量调用系统提供的API函数，而Win32平台上的调试器（OllyDbg等）恰好有针对API函数设置断点的强大功能\nWOW64 WOW64(Windows-on-Windows 64-bit)是64位Windows操作系统的子系统，可以使大多数32位应用程序在不进行修改的情况下运行在64位操作系统上\n64位Windows（包含64位操作系统应有的系统文件和32位操作系统应用的系统文件）：\nSystem32文件夹\u0026ndash;包含原生的64位映像文件 SysWOW64文件夹\u0026ndash;存储32位的系统文件 64位应用程序会加载System32目录下64位的kernel32.dll、user32.dll、ntdll.dll\n32位应用程序加载时，WOW64建立32位ntdll.dll所要求的启动环境，将CPU模式切换为32位，并开始执行32位加载器，像运行在32位机器上一样\nWOW64会对32位ntdll.dll的调用重定向ntdll.dll(64位)，而不是发出原生的32位系统调用指令\nWOW64转换到原生的64位模式，捕获与系统调用有关的参数，发出对应的原生64位系统调用。当原生的系统调用返回时，WOW64在返回32位模式之前将所有输出参数从64位转换成32位\nWOW64进程只能加载32为的DLL，不能加载原生的64位DLL\n类似，原生的64位进程不能加载32为的DLL\nWindows 消息机制 Windows是一个消息（Message）驱动式系统,Windows消息提供在应用程序与应用程序之间、应用程序与Windows系统之间进行通信的手段\n应用程序想要实现的功能需要由消息触发，通过对消息的响应和处理完成\nWindows系统的两种消息队列：\n系统消息队列 应用程序消息队列 计算机的所有输入设备由Windows监控\n一个事件从发生到到达处理它的窗口函数的过程：\n当一个事件发生时，Windows先将输入的消息放入系统消息队列，再将输入的消息复制到相应的应用程序队列中，应用程序中的消息循环在它的消息队列中检索每个消息并发给相应的窗口函数\n注：消息的非抢先性，即事件不论轻重缓急，总是按达到的先后排队，而这会导致一些外部实时事件得不到及时的处理\nWindows常用的消息函数：\nSendMessage 函数 调用一个窗口的窗口函数，将一天消息发给那个窗口。除非消息处理完毕，否则该函数不会返回。 函数示例： 1LRESULT SendMessage( 2 HWND hWnd, 3 UNIT Msg, 4 WPARAM wParam, 5 LAPRAM lParam 6); 返回值由具体的消息决定。如果消息传递成功，则返回True WM_COMMAND消息 WM_DESTROY消息 WM_GETTEXT消息 WM_QUIT消息 WM_LBUTTONDOWN消息 虚拟内存 虚拟内存（Virtual Memory）不是真正的内存，它通过映射（Map）的方法使用可用虚拟地址（Virtual Address）达到4GB（默认情况下，32位Windows操作系统的地址空间在4GB以内），每个应用程序可以获得2GB的虚拟地址，剩下的2GB留给操作系统自用\nWIndows操作系统是一个分时的多任务操作系统，CPU时间在被分成一个个时间片后分配给不同的程序。在一个时间片里，与这个程序的执行无关的内容不会映射到线性地址中。因此，每个程序都有自己的4GB寻址空间，互不干扰。\n虚拟内存的实现方法：\n一个应用程序启动时，操作系统就创建一个进程，并给该进程分配2GB的虚拟地址（不是内存，只是地址） 虚拟内存管理器将应用程序的代码映射到那个应用程序的虚拟地址中的某个位置，并把当前需要的代码读入物理地址 虚拟地址与应用程序代码在屋里内存中的位置是没有关系的\n如果使用DLL，DLL也会被映射到进程的虚拟地址空间中，在需要的时候才会被读入物理内存 其他项目（数据、堆栈等）的空间也是从物理内存中分配的，并被映射到虚拟地址空间中 应用程序通过使用其他虚拟地址空间中的地址开始执行。然后，虚拟内存内管理器把每次内存访问映射到物理位置 注：\n应用程序不会直接访问物理地址 虚拟内存管理器通过虚拟地址的访问请求来控制所有的物理地址访问 每个应用程序都有独立的4GB寻址空间，不同的应用程序的地址空间相互不影响 DLL总是被映射到其他应用程序的地址空间中，作为其他应用程序的一部分（原因：如果DLL不与其他程序处于同一地址空间，应用程序就无法调用） 使用虚拟内存可以简化内存的管理，弥补物理内存的不足，可以防止多任务环境相爱应用程序之间的冲突】\n64位 CPU的最大寻址空间为 2^64 byte,即16TB\n实际应用中,64位版本的Win7支持8Gb-192GB内存；64位版本的Win10支持128GB~2IB内存\n","date":"2025-08-13T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E5%8A%A0%E5%AF%86%E5%92%8C%E8%A7%A3%E5%AF%86%E5%A4%8D%E7%9B%98%E7%AC%94%E8%AE%B0/1_hu_5fe8a17fbe587ac8.png","permalink":"https://mofei-blog.pages.dev/p/%E5%8A%A0%E5%AF%86%E5%92%8C%E8%A7%A3%E5%AF%86%E5%A4%8D%E7%9B%98%E7%AC%94%E8%AE%B0/","title":"【加密和解密】| 基础篇"},{"content":"前言 很早就想找个平台记录一下自己学习或写的东西，但是由于懒或者是操作不方便都放弃了。最近几个月开始萌生了自己搭建一个博客的想法，所以开始着手搜集这方面的知识，看到了很多炫酷的博客，但是考虑到上手问题，最终选择了hugo，通过挑选，选择了stack这个主题。经历了N多次推倒重建，这个博客终于快装修好了。\n下面记录了我的折腾过程。\n2026/05/17 更新： 时隔几个月的时间终于想起来把博客再重新再利用起来了，这次重新梳理了一下hugo stack 的结构，更新了很多内容，那就重新开始再写一下装修记录了。这次有了些新的认识，可以借此整理记录一些学到的知识。\n为什么是Hugo？ Hugo 是一个静态网站生成器，与动态网站不同，在内容创建或更新时生成页面，而不是每次访问时动态构建页面。其特点如下：\n快速构建 简单易用 主题丰富 自定义 多语言 响应式设计 一、工具准备（Windows） hugo git github仓库 hugo 安装 hugo官网提供了多种下载方法，我直接使用的是在github上下载的extended版本 ❗️注：扩展板支持SCSS处理\n1️⃣下载Hugo扩展\n下载地址: https://github.com/gohugoio/hugo 选择名字中带有-extended的版本进行下载，解压到指定目录下（如 D:\\hugo\\bin）\n2️⃣配置环境\n环境变量 -\u0026gt; 系统变量 -\u0026gt; Path -\u0026gt; 新建 -\u0026gt; 添加hugo放置路径（如 D:\\hugo\\bin）\n3️⃣验证Hugo安装\n1# Ctrl+Win+R启动cmd 2hugo version 输出如下： 安装成功\nGit 安装 下载地址：https://git-scm.com/install/windows 1️⃣安装方式：\nGit for Windows（选择适合的版本 X64/ARM64） winget tool winget install --id Git.Git -e --source winget 2️⃣验证Git安装\n1# Ctrl+Win+R启动cmd 2git --version 二、安装与配置 主题的选择 Hugo 主题库：https://themes.gohugo.io/ 推荐主题 ：\nblowfish LoveIt stack PaperMod even yinyang ananke terminal coder book paper meme toha hugo 提供了多种主题，我选择了stack主题（简单、好看）\n创建Hugo站点 1# Ctrl+Win+R启动cmd 2# 进入Hugo 安装目录 3cd D:\\hugo 4#创建博客站点 5hugo new site 站点名称 6# 进入博客站点目录 7cd 站点名称 主题安装 1️⃣ 安装方式：\nGit 1cd D:\\hugo\\站点名称 2git submodule add https://github.com/CaiJimmy/hugo-theme-stack.git themes/stack 手动下载 从 Stack主题Github仓库 下载最新版本 解压到themes/目录下，将文件名命名为stack（若没有themes文件夹，手动创建） 2️⃣ 站点预览\n将stack/下的exampleSite目录下的文件复制到站点目录下\n1# Ctrl+Win+R启动cmd 2cd D:\\hugo\\站点名称 3hugo server -D 4# ctrl+单击 http://localhost:1313/ 访问 出现以下页面，即表示主题应用成功 3️⃣ 站点配置文件：hugo.yaml,根据的需求进行修改\n三、部署 经过安装、配置主题、编写博客，一个本地博客就搭建好了，为了公开访问，结合GitHub Pages进行部署\n1️⃣ 创建Github仓库 https://github.com/new 仓库名称：用户名.github.io 2️⃣ 将文件推送到Github仓库\n打开Git终端，进入站点名称/public/，执行以下命令：\n1git add . 2git commit -m \u0026#34;Initial commit\u0026#34; 3git branch -M main 4git remote add origin https://github.com/你的GitHub用户名/你用于存放网站的仓库名.git 5git push -u origin main 之后每次想要更新网站时，运行:\n1git add . 2git commit -m \u0026#34;Update\u0026#34; 3git push origin main 目前还没有部署到服务器，依赖于github访问，没有科学上网的话，访问会很慢甚至访问失败。\n至此，个人博客就搭建好了，后续就可以发布文章了。\n接下来，可以按照自己的喜好对主题进行美化，当然也可以选择不修改。看着那么多个性化的博客，我也想装修一个属于自己的赛博空间。\n","date":"2025-08-13T00:00:00Z","image":"https://mofei-blog.pages.dev/p/%E5%8D%9A%E5%AE%A2%E7%BE%8E%E5%8C%961/1_hu_cd12862347af94f8.jpg","permalink":"https://mofei-blog.pages.dev/p/%E5%8D%9A%E5%AE%A2%E7%BE%8E%E5%8C%961/","title":"博客搭建 | Hugo Stack 主题装修笔记（1）"}]