Pea Soft 博客
我会在这里发布我开发的一些小工具哦!
https://peasoft.github.io//
Fri, 19 Dec 2025 15:51:21 +0000
Fri, 19 Dec 2025 15:51:21 +0000
Jekyll v4.4.1
-
[全网首发] 123 盘提取带中文提取码的文件
<p>曾经,123 盘允许设置中文提取码,一些分享者会把提取码设置成如“投币自取”这样来求投币。但是,现在 123 盘不再允许设置这样的提取码,也不能在提取文件页面输入中文,导致这些文件无法被提取。本文将对网站进行逆向来去除这个限制。注意:本文所做的逆向工作旨在解决 123 盘的一个设计漏洞,所有内容仅供学习交流使用。</p>
<p>本文同时发布于吾爱破解论坛和我在 GitHub 上的博客。<a href="https://www.52pojie.cn/thread-2078001-1-1.html">论坛文章</a></p>
<p>我们以 <a href="https://www.123pan.com/s/OmFkTd-AVMN">刷机包“DotOS5.2_R15X_K1_DianJi.zip”</a> 为例,其提取码是 <code class="language-plaintext highlighter-rouge">点赞投币</code>。如有需要,你可以直接到文末获取我转存的该文件,分享链接不设提取码。</p>
<h2 id="1-使用解析站">1. 使用解析站</h2>
<p>解析站没有提取码输入限制。但是现在解析站解析完文件不能下载(因为要登录计费),因此此方法无效。</p>
<h2 id="2-修改请求包cookie">2. 修改请求包+Cookie</h2>
<p>浏览器打开提取页,打开 DevTools,转到网络页面,输入提取码并确认。网站发出请求 <code class="language-plaintext highlighter-rouge">/api/validateSharePwd</code>,负载中的 <code class="language-plaintext highlighter-rouge">sharePwd</code> 就是提取码。使用 Burp Suite 拦截这个包并修改请求中的提取码,服务器返回成功,但浏览器页面变为空白。转到 DevTools 的“应用程序”页,选择“Cookie”,发现有一个字段就是 <code class="language-plaintext highlighter-rouge">sharePwd_XXXXXX</code>,说明服务器最终是通过前端设置的 Cookie 来授权显示提取页面的。考虑修改此 Cookie。将 <code class="language-plaintext highlighter-rouge">点赞投币</code> 进行 URL 编码后填入,然后……</p>
<p><del>我也不知道会发生什么因为我当时没进行 URL 编码然后得到了 400(逃</del></p>
<h2 id="3-调试前端源码">3. 调试前端源码</h2>
<p>在记事本中输入 <code class="language-plaintext highlighter-rouge">点赞投币</code> 然后粘贴进输入框。页面直接开始验证提取码并弹出“提取码不能为空”,并且提取码消失了。在撰写本文时,粘贴操作不再触发验证但是仍然无法粘贴进去。</p>
<p>用 DevTools 的“审查元素”功能找到输入框然后在控制台执行 <code class="language-plaintext highlighter-rouge">$0.value="点赞投币"</code>,成功填入。但是点击“提取文件”时再次出现上述情况。由此说明网页不是简单的增加在输入框处进行了输入限制。</p>
<p>我们在“网络”选项卡中找到 <code class="language-plaintext highlighter-rouge">validateSharePwd</code> 请求,检查其发起程序,如图:</p>
<p><img src="https://cdn.jsdelivr.net/gh/peasoft/picx-images-hosting@master/123PanCnPwd/Pic1.45i454rgcl.webp" alt="发起程序" /></p>
<p>一般来说网络请求函数才需要 <code class="language-plaintext highlighter-rouge">await</code>,因此我们进入 <code class="language-plaintext highlighter-rouge">await</code> 前的函数,也就是 <code class="language-plaintext highlighter-rouge">J</code>,这个函数应该负责生成请求,其中就会读取提取码。如图:</p>
<p><img src="https://cdn.jsdelivr.net/gh/peasoft/picx-images-hosting@master/123PanCnPwd/Pic2.64eavgwyo8.webp" alt="代码1" /></p>
<p>其中变量 <code class="language-plaintext highlighter-rouge">t</code> 就是我们需要的提取码,同时下方的 Cookie 相关代码验证了第 2 点中设置 Cookie 的猜想。按下 Ctrl+F 搜索,输入 <code class="language-plaintext highlighter-rouge">t</code>,勾选“全词匹配”,向上查找,我们在上面几行发现了如下代码:</p>
<p><img src="https://cdn.jsdelivr.net/gh/peasoft/picx-images-hosting@master/123PanCnPwd/Pic3.7zqvo39ea3.webp" alt="代码2" /></p>
<p>此时真相大白:验证码中的中文被正则过滤掉了。我们决定使用调试器强制修改变量值。在图示位置,也就是提取码长度校验之后下断点。输入提取码 <code class="language-plaintext highlighter-rouge">1111</code> 提取,发现断点在输入文本时被触发了。这解释了上方强制修改文本框 <code class="language-plaintext highlighter-rouge">value</code> 失败的原因:提取码是在输入时被存入变量的,而不是点击提取按钮时读取,直接修改文本框不会触发这个函数,即使触发,中文也会被过滤。将中文字粘贴进去同样会被过滤。此时在调试器中双击变量 <code class="language-plaintext highlighter-rouge">t</code> 的值,将其改为 <code class="language-plaintext highlighter-rouge">"点赞投币"</code>,继续运行程序,然后点击提取按钮。然后提取成功!</p>
<p><img src="https://cdn.jsdelivr.net/gh/peasoft/picx-images-hosting@master/123PanCnPwd/Pic4.9o08l9zogf.webp" alt="代码3" /></p>
<h2 id="4-结语">4. 结语</h2>
<p>虽然可以使用技术漏洞绕过限制,但网站的设计错误始终存在:任何人都无法再提取那些设置了中文提取码的文件。而有些文件的分享者已经永久失联了,不可能再回来把提取码改成“合法”的提取码了。我们敦促 123 盘工作人员在看到本文后尽快合理解决此问题。</p>
<p>下面,我将提取并转存的文件以<strong>无提取码</strong>方式分享出来,也许正好能帮到一些有缘人:<a href="https://www.123865.com/s/j2GITd-OXSAH">DotOS5.2_R15X_K1_DianJi.zip</a></p>
<h2 id="5-神秘大佬的指点">5. 神秘大佬的指点</h2>
<p>来自涛之雨大佬:其实只要在链接后面加上 <code class="language-plaintext highlighter-rouge">?pwd=点赞投币</code> 就可以了。</p>
<p>(以后会不会修不知道)</p>
Fri, 05 Dec 2025 00:00:00 +0000
https://peasoft.github.io/2025/12/05/123pan-cn-pwd.html
https://peasoft.github.io/2025/12/05/123pan-cn-pwd.html
破解
逆向
漏洞
吾爱破解论坛
技术
-
去除新版 SanDisk PrivateAccess 设备限制和自动更新并打包回原版格式
<p>本文同时发布于吾爱破解论坛和我在 GitHub 上的博客。<a href="https://www.52pojie.cn/thread-2049710-1-1.html">论坛文章</a></p>
<p>去除 SanDisk PrivateAccess 6.4.13 设备限制和自动更新并打包回原版格式。过程细节与旧版稍有不同故开贴记录,方便新手学习。</p>
<h2 id="准备工作">准备工作</h2>
<p>访问 <a href="https://support-cn.sandisk.com/app/products/downloads/softwaredownloads">https://support-cn.sandisk.com/app/products/downloads/softwaredownloads</a>,下载 SanDisk PrivateAccess,得到 <code class="language-plaintext highlighter-rouge">privateaccess-win.exe</code></p>
<h2 id="使用工具">使用工具</h2>
<ol>
<li>x32dbg</li>
<li>Detect It Easy (DIE)</li>
<li>010 Editor 或其它十六进制编辑器</li>
<li>Resource Hacker</li>
</ol>
<h2 id="1-寻找主程序">1. 寻找主程序</h2>
<p>打开 <code class="language-plaintext highlighter-rouge">privateaccess-win.exe</code>,跳出提示 <code class="language-plaintext highlighter-rouge">This application only runs on a SanDisk flash drive</code>。用 DIE 查壳可知这个程序嵌套有两个资源文件。同时运行目录下多了一个 <code class="language-plaintext highlighter-rouge">WDPA</code> 文件夹,里面有一个 241 KB 的文件 <code class="language-plaintext highlighter-rouge">PrivateAccessMonitor.exe</code>。由此判断这可能是一个自解压文件。还有可能有一个文件夹叫做 <code class="language-plaintext highlighter-rouge">Temp</code>,里面有个文件 <code class="language-plaintext highlighter-rouge">PrivateAccess_win.exe</code>,这显然就是真正的主程序。如果没有也没关系,我们直接用 DIE 提取,如图:</p>
<p><img src="https://cdn.jsdelivr.net/gh/peasoft/picx-images-hosting@master/SanDiskPrivateAccess/1.7pqoh2jhd.webp" alt="DIE 提取主程序" /></p>
<p>提取可知第一个 PE32 文件就是主程序。</p>
<h2 id="2-脱壳">2. 脱壳</h2>
<p>这个程序加了原版 UPX 壳,理论上直接用 <code class="language-plaintext highlighter-rouge">upx -d</code> 脱壳即可……</p>
<p>然后脱出来的程序打不开,原因是我自己的 upx 版本太老导致入口点改不回去……</p>
<p>更新一下就能正常脱壳了,程序也能正常启动。</p>
<p>打开 x32dbg。把 xAnalyzer 插件或者别的什么分析插件的 <strong>自动分析 (Automatic analysis)</strong> 关掉,否则无法开始调试。原因是这个程序小函数很多,分析时间巨长无比(IDA 8.3 分析了半个小时),并且 xAnalyzer 自动分析完成前无法开始调试。</p>
<p>拖入程序,但是 x32dbg 提示无法启动程序!错误原因是“访问无效的地址”……</p>
<p>所以我们还是要动用我们在吾爱破解第一课中学习的 ESP 定律手工脱壳大法!</p>
<p>拖入原始程序,按 F7 单步运行,在寄存器区找到 ESP 右击,选择“在内存窗口中转到”,在内存窗口右击左边的地址,选择断点、硬件访问、4 字节,F9 运行,此时 CPU 窗口跳转到另一处代码。再次右击刚才的地址,断点,删除硬件断点。在 CPU 窗口中选中下面的 jmp 指令,按 F4 运行到此,再按 F7 单步。此时就来到了 OEP。选择 Scylla(在工具栏上),看图脱壳(图中的 Scylla 是我汉化的,英文原版的看按钮位置一样就对了):</p>
<p><img src="https://cdn.jsdelivr.net/gh/peasoft/picx-images-hosting@master/SanDiskPrivateAccess/2.5j4n96om5h.webp" alt="用 Scylla 脱壳" /></p>
<p>最终得到 <code class="language-plaintext highlighter-rouge">PrivateAccess_win_dump_SCY.exe</code>,脱壳完成,结束程序。</p>
<h2 id="3-破解">3. 破解</h2>
<p>特别感谢 <a href="https://www.52pojie.cn/thread-1925640-1-1.html">https://www.52pojie.cn/thread-1925640-1-1.html</a> 给的思路!</p>
<p>将脱壳得到的最终程序拖入运行,出现弹窗后点击暂停。在 CPU 窗口右击,搜索,所有用户模块,字符串。在搜索页最下面的过滤框中输入 SanDisk 即可找到提示字符串。双击提示字符串转到 CPU 窗口,选中上面的 <code class="language-plaintext highlighter-rouge">jne</code> 语句,按 F2 下断点,重启程序。此时可以看到 <code class="language-plaintext highlighter-rouge">jne</code> 下面就是那句报错,且此时“跳转不会执行”,因此按空格修改,将 <code class="language-plaintext highlighter-rouge">jnz</code> (<code class="language-plaintext highlighter-rouge">jnz</code>=<code class="language-plaintext highlighter-rouge">jne</code>) 改成 <code class="language-plaintext highlighter-rouge">jmp</code> 强制跳转,剩余字节是否以 NOP 填充其实无所谓,反正已经跳转了,不过为了下面指令好看我还是勾了。</p>
<p><img src="https://cdn.jsdelivr.net/gh/peasoft/picx-images-hosting@master/SanDiskPrivateAccess/3.102m67j57s.webp" alt="修改指令" /></p>
<p>继续运行程序,程序正常启动说明修改正确。然后在 CPU 窗口右键,补丁,修补文件,保存为 <code class="language-plaintext highlighter-rouge">PrivateAccess_win2.exe</code>。关闭 x32dbg,直接运行修改后的程序,没有问题。</p>
<h2 id="4-移植">4. 移植</h2>
<p>我们能不能把这个壳重新加回去呢?直接用 UPX 对手动脱壳的程序加壳是不行的,会报错。我们必须把刚才的补丁移植回 UPX 直接脱出的原始文件。</p>
<p>首先打开终端,定位刚才补丁的位置。执行:</p>
<div class="language-batch highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">fc</span> <span class="na">/b </span><span class="kd">PrivateAccess_win_dump_SCY</span><span class="err">.exe</span> <span class="kd">PrivateAccess_win2</span><span class="err">.exe</span>
</code></pre></div></div>
<p>得到:</p>
<pre><code class="language-plain">正在比较文件 PrivateAccess_win_dump_SCY.exe 和 PRIVATEACCESS_WIN2.EXE
00061476: 0F E9
00061477: 85 A1
00061478: A0 00
0006147B: 00 90
</code></pre>
<p>运行 <code class="language-plaintext highlighter-rouge">upx -d PrivateAccess_win.exe</code> 脱掉主程序的壳得到原始文件,把文件拖入 010 Editor。找到 <code class="language-plaintext highlighter-rouge">6:1470h:</code> 行,选择第 6 列,发现和文件对比给出的结果一致,因此从这里开始输入 <code class="language-plaintext highlighter-rouge">E9 A1 00 00 00 90</code>,如图:</p>
<p><img src="https://cdn.jsdelivr.net/gh/peasoft/picx-images-hosting@master/SanDiskPrivateAccess/4.175u1n5ane.webp" alt="移植补丁字节码" /></p>
<p>另外软件可能会自动更新导致需要重新破解,所以我们要修改更新地址以去除更新,搜索 <code class="language-plaintext highlighter-rouge">privateaccess.stonehenge.sandisk.com</code>,从头开始用 <code class="language-plaintext highlighter-rouge">0.0.0.0/</code> 覆盖,如图:</p>
<p><img src="https://cdn.jsdelivr.net/gh/peasoft/picx-images-hosting@master/SanDiskPrivateAccess/5.3rboea599p.webp" alt="去除更新" /></p>
<p>按 Ctrl+S 保存。<code class="language-plaintext highlighter-rouge">PrivateAccess_win.exe</code> 可以正常运行。再运行 <code class="language-plaintext highlighter-rouge">upx PrivateAccess_win.exe</code>,重新加壳,程序仍然正常。</p>
<h2 id="5-打包">5. 打包</h2>
<p>把 <code class="language-plaintext highlighter-rouge">PrivateAccess_win.exe</code> 重命名为 <code class="language-plaintext highlighter-rouge">PrivateAccess_win.bin</code>。打开 Resource Hacker,拖入 <code class="language-plaintext highlighter-rouge">privateaccess-win.exe</code>,展开 RCData,选择第一项,右击,Replace,Select,选择 <code class="language-plaintext highlighter-rouge">PrivateAccess_win.bin</code>,按 Ctrl+S 保存文件,得到新的 <code class="language-plaintext highlighter-rouge">privateaccess-win.exe</code>,可以正常使用,但数字签名不再有效。可以删掉无效的签名证书防止部分杀软报毒。</p>
<p>打包后文件大小与原版完全相同。</p>
Wed, 30 Jul 2025 00:00:00 +0000
https://peasoft.github.io/2025/07/30/sandisk-privateaccess.html
https://peasoft.github.io/2025/07/30/sandisk-privateaccess.html
破解
逆向
吾爱破解论坛
技术
-
本站公告
<p>如果你无法访问本站,请 Bing 搜 peasoft 来使用代理。</p>
<p>据测试,<code class="language-plaintext highlighter-rouge">*.github.io</code> 已被 <strong>遥遥领先浏览器</strong> 屏蔽,请更换浏览器访问。Homo OS 目前无法更换浏览器,请考虑更换系统或设备。</p>
<p>请您选择合适的浏览器访问本站以获得最佳体验。我们推荐您使用以下浏览器:</p>
<ul>
<li>Windows 10/11:<a href="https://www.microsoft.com/edge/download">Microsoft Edge</a>、<a href="https://www.centbrowser.cn/">百分浏览器</a> (有免安装版)、<a href="https://google.cn/chrome/">Chrome</a>、<a href="https://www.firefox.com/zh-CN/browsers/desktop/">Firefox</a></li>
<li>Windows 7/8:<a href="https://www.centbrowser.cn/">百分浏览器</a> (有免安装版)、<a href="https://www.win32subsystem.live/supermium/">Supermium</a> (有免安装版)</li>
<li>Windows XP/Vista:<a href="https://www.win32subsystem.live/supermium/">Supermium</a> (有免安装版)</li>
<li>Mac/Linux:<a href="https://www.microsoft.com/edge/download">Microsoft Edge</a>、<a href="https://google.cn/chrome/">Chrome</a></li>
<li>Android:<a href="https://viayoo.com/">Via</a> (需升级系统 WebView)、<a href="https://www.microsoft.com/edge/download">Microsoft Edge</a>。</li>
</ul>
<p><strong>警告:请勿使用国内大厂制作的浏览器!这些浏览器会盗取您的个人隐私、应用内含有大量广告,并且会随意屏蔽合法网站。目前已知 QQ 浏览器、UC 浏览器、夸克浏览器 会将您的所有浏览记录及页面内容进行完整记录并用于大数据分析,把你的隐私扒的连底裤都不剩!</strong></p>
Thu, 04 Jul 2024 00:00:00 +0000
https://peasoft.github.io/2024/07/04/notice.html
https://peasoft.github.io/2024/07/04/notice.html
站务
站务
-
最新破解 WPS 2023 个人版不登录不能用限制
<p>不知从哪一版开始,WPS 必须登录后才能使用了,这给公用电脑带来了很大的麻烦。那么,能不能解除这一限制呢?</p>
<p>当然可以!只要打开 WPS 配置工具,选择高级、其他选项、兼容异常网络环境……不登录(1 天(新版为 3 天)内有效)……</p>
<p>等等?只能跳过 3 天?没有 KMS38 我是不会罢休的!</p>
<p>我们要对 WPS 的注册表下手。首先,导出注册表:<code class="language-plaintext highlighter-rouge">HKEY_CURRENT_USER\Software\kingsoft\</code>。然后,打开 WPS 配置工具,解除限制。再次导出注册表。使用工具对比前后导出的两份注册表,结果如图:</p>
<p><img src="https://testingcf.jsdelivr.net/gh/peasoft/picx-images-hosting@master/20240127/对比结果.ihmsz5rekeg.webp" alt="对比结果" /></p>
<p>其中 <code class="language-plaintext highlighter-rouge">forced</code> 项与 <code class="language-plaintext highlighter-rouge">lastSkipVistorModeTime</code> 被修改了,从名称推断,这两项很可能与登录限制有关。另外还有一个项 <code class="language-plaintext highlighter-rouge">isForceLoginNewDevice202111</code>,这个项没有被修改,但看着也有点意思。下面我们分别对这三项进行修改。注意:每次测试另一项前要把上一项的修改还原!</p>
<ol>
<li>将 <code class="language-plaintext highlighter-rouge">forced</code> 项的值 <code class="language-plaintext highlighter-rouge">c2tpcFZpc3Rvck1vZGUuMTcwMzIwMzYzNQ==</code> 进行解码,得到 <code class="language-plaintext highlighter-rouge">skipVistorMode.1703203635</code>,其中 <code class="language-plaintext highlighter-rouge">1703203635</code> 是一个 Unix 时间戳或称 C 时间戳,转换为年月日时分秒后就是我们点击“跳过登录”的时间。将时间戳改为 9999 年后回编码,修改注册表,无效。(这里我没有确认是因为时间戳过大导致 WPS 无法识别还是这一项本来就无关紧要,欢迎热心坛友进一步测试!)</li>
<li>将 <code class="language-plaintext highlighter-rouge">lastSkipVistorModeTime</code> 的值 <code class="language-plaintext highlighter-rouge">6584d333</code> 转换成十进制,得到 <code class="language-plaintext highlighter-rouge">1703203635</code>,再进行时间戳转换,发现这就是我们跳过登录的时间。WPS 会将当前时间与这个时间相减,如果差值在 1 天(或 3 天)之内,则“跳过登录”仍然有效。因此,我们把这项改成 <code class="language-plaintext highlighter-rouge">ffffffff</code>,即 <code class="language-plaintext highlighter-rouge">2106/02/07 14:28:15</code>,我们就可以跳过登录 82 年了。经测试,修改有效。</li>
<li>由名称 <code class="language-plaintext highlighter-rouge">isForceLoginNewDevice202111</code> 推测,这一项指示了 WPS 是否是从 2021.11 版之前的版本升级而来的,如果是,则仍能像老版本一样无需登录即可使用。将这一项的值从 <code class="language-plaintext highlighter-rouge">true</code> 改为 <code class="language-plaintext highlighter-rouge">false</code>。经测试,修改有效。</li>
</ol>
<p>由此,我们制作出了以下注册表补丁:(2024/01/02 更新:可能要保存成 <code class="language-plaintext highlighter-rouge">UTF-16 LE (BOM)</code> 格式,但是默认存成 <code class="language-plaintext highlighter-rouge">ANSI</code> 似乎也没问题?<strong>最后两项是根据回帖新增的</strong>,分别兼容旧版 WPS 和教育版 WPS,在此感谢 107 楼)</p>
<pre><code class="language-reg">Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\kingsoft\Office\6.0\plugins\officespace\flogin]
"isForceLoginNewDevice202111"="false"
"lastSkipVistorModeTime"=dword:ffffffff
"enableForceLoginForFirstInstallDevice"="false"
"enableForceLoginStyle_202111"="false"
</code></pre>
<p><a href="https://peasoft.github.io/dl/UnlockWPS.reg">https://peasoft.github.io/dl/UnlockWPS.reg</a></p>
<p>导入后即可永久破解 WPS 的登录限制。</p>
<p>小声:值得注意的是,第 3 项方法在网上流传已久,要修改的注册项名以前叫 <code class="language-plaintext highlighter-rouge">enableForceLoginForFirstInstallDevice</code>(据坛友回复,现在这个项仍然有效),但是谁也说不准 WPS 将来流氓起来会不会对所有用户“一视同仁”。而第 2 项方法网络上尚未出现过。总算,这问题总算在今年解决了……</p>
<p><a href="https://www.52pojie.cn/thread-1875176-1-1.html">本文在吾爱破解论坛同步发布,点此查看</a></p>
Sun, 31 Dec 2023 00:00:00 +0000
https://peasoft.github.io/2023/12/31/unlock-wps.html
https://peasoft.github.io/2023/12/31/unlock-wps.html
破解
逆向
吾爱破解论坛
技术
-
【原版补档】我们的教育弄虚作假,到底是为了什么? - 哔哩哔哩
<h3>本视频原作者 <a href="https://space.bilibili.com/381593208" target="_blank">一只柴犬7</a>,视频现已删除,并被 peasoft 恢复,请放心观看。如果本网站出现无法访问等情况,请自行使用魔法。视频播放可能会卡顿,请谅解。如果您在手机上无法播放视频,请更换浏览器。<a href="https://archive.org/details/ec8f60c687c0c1a7567ca40a0b162c1c">互联网档案馆存档(需魔法)</a></h3>
<video id="v" class="video-js vjs-default-skin" poster="https://gcore.jsdelivr.net/gh/peasoft/media@master/cnedu/cover.webp" controls>
<source src="https://7327638.xyz/camo/https://raw.githubusercontent.com/peasoft/media/master/cnedu/video.m3u8" type="application/x-mpegURL">
<source src="https://raw.githubusercontent.com/peasoft/media/master/cnedu/video.m3u8" type="application/x-mpegURL">
</video>
<link href="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/video.js/8.3.0/video-js.min.css" rel="stylesheet">
<style>
.video-js {
left: 50%;
transform: translateX(-50%);
}
.vjs-poster {
display: none;
}
</style>
<script src="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/video.js/8.3.0/video.min.js"></script>
<script>
var player = videojs('v', {
html5: {
vhs: {
overrideNative: true
},
nativeAudioTracks: false,
nativeVideoTracks: false
}
});
</script>
<p style="white-space: pre-line;">
理性 客观 事实
UP主也支持因材施教
我很感谢你能够拿出人生中宝贵的时间点开这期视频,你可以不用关注我,可以对我的视频制作,或者我们的教育提出任何话题,我都会吸收大家的建议
在这一年里,我和大多数学生们一样,都经历了很多次毫无意义的困难和痛苦,我在学校和大家生活得一样,被琼禁在牢笼里,我一直想要挣脱出去,但在这庞大的互联网中,我却看不到一丝希望
所以我决定了,要做出一个视频,为那些受苦受难的学生们出一口气,让大家看到,大多数的学生,他们在学校中过着不是人过的生活,但他们却是国家未来的建设者,我们对每个学生们这么做,真的合适吗?
我不知道为什么这个社会在进步,但人们的思想却被封禁了一样,永远只能继承着父母的苦难和思想,如果我们的教育还是一直这样,那么我们那些离去的家人,他们一辈子都没有感受到生活的快乐,一直为我们的生活努力打拼,我们这么做,对得起他们的汗水吗?
希望更多年轻人的思想能够随着时代进步而进步,而不是随着时代进步而止步不前,甚至是退步
——————
视频中用到的BGM(按顺序):
阿鲲 - 上海的家
阿鲲 - 独处
阿鲲 - 前行
阿鲲 - 训练生活
阿鲲 - 股骨头
阿鲲 - 敬礼
阿鲲 - 导演最后非得让作曲加的
阿鲲 - 星辰 起航
Epic Soul Factory,Cesc Vilà,Fran Soto - Everdream
视频中用到的视频素材(按顺序):
衡水中学食堂:<a target="_blank" href="//www.bilibili.com/video/BV1yZ4y1X7LF">BV1yZ4y1X7LF</a>
芬兰教育:<a target="_blank" href="//www.bilibili.com/video/BV1XT4y1G79V">BV1XT4y1G79V</a>
4岁小孩玩Apex:<a target="_blank" href="//www.bilibili.com/video/BV1SY4y1T7BP">BV1SY4y1T7BP</a>
我体验了5个不同地区的CSGO:<a target="_blank" href="//www.bilibili.com/video/BV1Dj411G7zM">BV1Dj411G7zM</a>
老外看使命召唤:<a target="_blank" href="//www.bilibili.com/video/BV1yW4y1h7wD">BV1yW4y1h7wD</a>
——————
视频中有使用到已公开的moss语音模型制作
与配音演员本人,原作,电影设定无关
</p>
Sat, 26 Aug 2023 00:00:00 +0000
https://peasoft.github.io/2023/08/26/cnedu.html
https://peasoft.github.io/2023/08/26/cnedu.html
视频
社会问题
哔哩哔哩
自由哔哩
社会问题
-
[油猴脚本] 吾爱折叠 - 自动折叠水贴
<p>吾爱破解论坛上的水贴非常多,有些回复只有“谢谢楼主”四个字,还占用了大量网页空间,看着就很不爽,要是有个脚本把它们折叠掉就好多了,因此有了这个脚本。</p>
<h3 id="功能">功能:</h3>
<ol>
<li>
<p>自动折叠被屏蔽的贴子:帖子都没了还看啥?不如折掉释放空间。原理:帖子被屏蔽时,作者头像会一起被屏蔽,脚本通过检查头像从而判断帖子是否被屏蔽。查看效果请去 <a href="https://www.52pojie.cn/forum-22-1.html">『UnPackMe◇CrackMe◇KeyGenMe◇ReverseMe』区</a> 。主贴被屏蔽不会被折叠。</p>
</li>
<li>
<p>自动折叠疑似灌水贴:四个字占用十行字的空间,把有效回帖都淹没了,折叠掉更清爽。原理:脚本收录了论坛中常见的灌水词,这些词没有实际意义。脚本会将回复中的这些词去掉,再看剩余的字数,如果不满三个字就视作水贴。楼主的帖子不会被折叠。查看效果请看 <a href="https://www.52pojie.cn/thread-1816967-1-1.html">论坛上的脚本发布贴</a> 。</p>
</li>
<li>
<p>手动折叠:在每层楼的顶部有“折叠此层”按钮(右下角暂无),点击即可折叠。</p>
</li>
</ol>
<h3 id="折叠原理">折叠原理:</h3>
<p>将楼层的 <code class="language-plaintext highlighter-rouge">display</code> 属性设为 <code class="language-plaintext highlighter-rouge">none</code>,使楼层不显示,并在原有楼层下方插入展开按钮。展开按钮就是用论坛的“下一页”按钮改的。</p>
<h3 id="下载地址及注意事项">下载地址及注意事项:</h3>
<p>下载地址:<a href="https://greasyfork.org/zh-CN/scripts/472337">吾爱折叠 - 自动折叠水贴</a></p>
<p>注意:此脚本与 <a href="https://greasyfork.org/zh-CN/scripts/412680">吾爱破解论坛增强</a> 的自动翻页功能及其它自动翻页脚本不兼容,您需要关闭这些脚本或其中的单个功能。</p>
<h3 id="代码">代码:</h3>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// ==UserScript==</span>
<span class="c1">// @name 吾爱折叠 - 自动折叠水贴</span>
<span class="c1">// @namespace peasoft.github.io</span>
<span class="c1">// @match *://www.52pojie.cn/forum.php?*mod=viewthread*</span>
<span class="c1">// @match *://www.52pojie.cn/thread-*</span>
<span class="c1">// @grant GM_setValue</span>
<span class="c1">// @grant GM_getValue</span>
<span class="c1">// @grant GM_registerMenuCommand</span>
<span class="c1">// @grant GM_unregisterMenuCommand</span>
<span class="c1">// @grant GM_notification</span>
<span class="c1">// @version 1.0</span>
<span class="c1">// @author 陆鎏澄</span>
<span class="c1">// @description 在吾爱破解论坛手动或自动折叠不想看到的帖子,如水贴和已被屏蔽的帖子。</span>
<span class="c1">// @run-at document-end</span>
<span class="c1">// @icon https://www.52pojie.cn/favicon.ico</span>
<span class="c1">// @license CC BY-NC-SA</span>
<span class="c1">// ==/UserScript==</span>
<span class="c1">// 拦截词后续还会更新,欢迎补充!注意:本贴中的代码不会定时更新,最新代码请见安装地址!</span>
<span class="kd">const</span> <span class="nx">stopWordsStr</span> <span class="o">=</span> <span class="dl">"</span><span class="se">\t</span><span class="s2"> </span><span class="se">\n</span><span class="s2"> ( ) [ ] { } < > , . ? ! </span><span class="se">\</span><span class="s2">' </span><span class="se">\"</span><span class="s2"> : ; / | </span><span class="se">\\</span><span class="s2"> + - _ ( ) 【 】 《 》 , 。 ? ! ‘ ’ “ ” : ; 、· … — 我 你 大佬 大神 大牛 膜 拜 什么 怎么样 怎么 感 谢 觉 可能 好像 分享 虽然 但是 有 用 没用 没什么用 不上 帮 帮忙 顶 一下 不懂 软件 是 个 这 那 哪 的 得 地 了 啦 拉 辣 过 收藏 加分 点赞 优秀 了解 支持 学习 学 到 真 很 好 啊 厉害 试 看 观 望 前排 后排 进 来 吧 呢 哈 嘛 阿 呵 哎 唉 也 太 极 绝 几 就 愣 啥 6</span><span class="dl">"</span>
<span class="kd">const</span> <span class="nx">stopWords</span> <span class="o">=</span> <span class="nx">stopWordsStr</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="dl">'</span><span class="s1"> </span><span class="dl">'</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{};</span>
<span class="kd">const</span> <span class="nx">keys</span> <span class="o">=</span> <span class="p">{</span><span class="dl">"</span><span class="s2">noBlocked</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">自动折叠被屏蔽的贴子</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">noJunk</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">自动折叠疑似灌水贴</span><span class="dl">"</span><span class="p">};</span>
<span class="kd">let</span> <span class="nx">menuIds</span> <span class="o">=</span> <span class="p">[];</span>
<span class="kd">function</span> <span class="nf">readConfig</span><span class="p">(){</span>
<span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="nx">key</span> <span class="k">in</span> <span class="nx">keys</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">config</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nc">GM_getValue</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">config</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span>
<span class="nc">GM_setValue</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
<span class="nx">config</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">switchConfig</span><span class="p">(</span><span class="nx">key</span><span class="p">){</span>
<span class="nx">config</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="o">!</span><span class="nx">config</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
<span class="nc">GM_setValue</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">config</span><span class="p">[</span><span class="nx">key</span><span class="p">]);</span>
<span class="nf">unregMenu</span><span class="p">();</span>
<span class="nf">regMenu</span><span class="p">();</span>
<span class="nc">GM_notification</span><span class="p">({</span><span class="na">text</span><span class="p">:</span> <span class="dl">"</span><span class="s2">设置将在刷新页面后生效!</span><span class="se">\n</span><span class="s2">(点此刷新页面)</span><span class="dl">"</span><span class="p">,</span> <span class="na">title</span><span class="p">:</span> <span class="dl">"</span><span class="s2">吾爱折叠</span><span class="dl">"</span><span class="p">,</span> <span class="na">onclick</span><span class="p">:</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span><span class="nx">location</span><span class="p">.</span><span class="nf">reload</span><span class="p">()}});</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">regMenu</span><span class="p">(){</span>
<span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="nx">key</span> <span class="k">in</span> <span class="nx">keys</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">menuIds</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="nc">GM_registerMenuCommand</span><span class="p">((</span><span class="nx">config</span><span class="p">[</span><span class="nx">key</span><span class="p">]?</span><span class="dl">'</span><span class="s1">✅</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">❌</span><span class="dl">'</span><span class="p">)</span><span class="o">+</span><span class="dl">'</span><span class="s1"> </span><span class="dl">'</span><span class="o">+</span><span class="nx">keys</span><span class="p">[</span><span class="nx">key</span><span class="p">],</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span><span class="nf">switchConfig</span><span class="p">(</span><span class="nx">key</span><span class="p">)}));</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">unregMenu</span><span class="p">(){</span>
<span class="nx">menuIds</span><span class="p">.</span><span class="nf">forEach</span><span class="p">(</span><span class="nx">id</span> <span class="o">=></span> <span class="p">{</span><span class="nc">GM_unregisterMenuCommand</span><span class="p">(</span><span class="nx">id</span><span class="p">)});</span>
<span class="nx">menuIds</span> <span class="o">=</span> <span class="p">[];</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">hidePost</span><span class="p">(</span><span class="nx">post</span><span class="p">,</span> <span class="nx">action</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">显示被折叠的楼层 ↧</span><span class="dl">"</span><span class="p">){</span>
<span class="nx">post</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">none</span><span class="dl">"</span><span class="p">;</span>
<span class="k">if </span><span class="p">(</span><span class="nx">post</span><span class="p">.</span><span class="nx">nextElementSibling</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">post</span><span class="p">.</span><span class="nx">nextElementSibling</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">unset</span><span class="dl">"</span><span class="p">;</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="kd">let</span> <span class="nx">showBtn</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">div</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">showBtn</span><span class="p">.</span><span class="nx">className</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">pgbtn</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">showBtn</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">unset</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">showBtn</span><span class="p">.</span><span class="nf">insertAdjacentHTML</span><span class="p">(</span><span class="dl">"</span><span class="s2">beforeend</span><span class="dl">"</span><span class="p">,</span><span class="dl">'</span><span class="s1"><a href="javascript:;" hidefocus="true" class="bm_h" style="margin-bottom: 0; border-radius: 0"></span><span class="dl">'</span><span class="o">+</span><span class="nx">action</span><span class="o">+</span><span class="dl">'</span><span class="s1"></a></span><span class="dl">'</span><span class="p">);</span>
<span class="nx">showBtn</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">showPost</span><span class="p">);</span>
<span class="nx">post</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">showBtn</span><span class="p">);</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">showPost</span><span class="p">(){</span>
<span class="k">this</span><span class="p">.</span><span class="nx">previousElementSibling</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">''</span><span class="p">;</span>
<span class="k">this</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">none</span><span class="dl">"</span><span class="p">;</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">hidePostH</span><span class="p">(){</span>
<span class="nf">hidePost</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">);</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">showButtons</span><span class="p">(){</span>
<span class="kd">let</span> <span class="nx">headers</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">div.pti > div.authi</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">headers</span><span class="p">.</span><span class="nf">forEach</span><span class="p">(</span><span class="nx">header</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">header</span><span class="p">.</span><span class="nf">insertAdjacentHTML</span><span class="p">(</span><span class="dl">"</span><span class="s2">beforeend</span><span class="dl">"</span><span class="p">,</span><span class="dl">'</span><span class="s1"><span class="pipe">|</span></span><span class="dl">'</span><span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">header</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">span.none</span><span class="dl">"</span><span class="p">))</span> <span class="p">{</span>
<span class="nx">header</span><span class="p">.</span><span class="nx">lastChild</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">show</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">header</span><span class="p">.</span><span class="nf">insertAdjacentHTML</span><span class="p">(</span><span class="dl">"</span><span class="s2">beforeend</span><span class="dl">"</span><span class="p">,</span><span class="dl">'</span><span class="s1"><a href="javascript:;">折叠此层</a></span><span class="dl">'</span><span class="p">);</span>
<span class="nx">header</span><span class="p">.</span><span class="nx">lastChild</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">hidePostH</span><span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">header</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">span.none</span><span class="dl">"</span><span class="p">))</span> <span class="p">{</span>
<span class="nx">header</span><span class="p">.</span><span class="nx">lastChild</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">show</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">autoHide</span><span class="p">(){</span>
<span class="kd">let</span> <span class="nx">avatars</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">div.pls > div > div.avatar</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">avatars</span><span class="p">.</span><span class="nf">forEach</span><span class="p">(</span><span class="nx">avatar</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">post</span> <span class="o">=</span> <span class="nx">avatar</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">;</span>
<span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">post</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">contains</span><span class="p">(</span><span class="dl">"</span><span class="s2">res-postfirst</span><span class="dl">"</span><span class="p">))</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">author</span> <span class="o">=</span> <span class="nx">post</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">div.pls > div.pi > div.authi > a.xw1</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerText</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">authorHTML</span> <span class="o">=</span> <span class="dl">'</span><span class="s1"><span style="letter-spacing: normal"></span><span class="dl">'</span><span class="o">+</span><span class="nx">author</span><span class="o">+</span><span class="dl">'</span><span class="s1"></span> </span><span class="dl">'</span><span class="p">;</span>
<span class="k">if </span><span class="p">(</span><span class="nx">config</span><span class="p">[</span><span class="dl">"</span><span class="s2">noBlocked</span><span class="dl">"</span><span class="p">]</span> <span class="o">&&</span> <span class="nx">avatar</span><span class="p">.</span><span class="nx">innerText</span> <span class="o">==</span> <span class="dl">"</span><span class="s2">头像被屏蔽</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
<span class="nf">hidePost</span><span class="p">(</span><span class="nx">post</span><span class="p">,</span> <span class="nx">authorHTML</span><span class="o">+</span><span class="dl">"</span><span class="s2">的帖子被管理员或版主屏蔽</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">else</span> <span class="p">{</span>
<span class="k">if </span><span class="p">(</span><span class="nx">config</span><span class="p">[</span><span class="dl">"</span><span class="s2">noJunk</span><span class="dl">"</span><span class="p">]</span> <span class="o">&&</span> <span class="o">!</span><span class="nx">post</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">div.pti > div.authi > span.firstauthor</span><span class="dl">"</span><span class="p">)){</span>
<span class="c1">// 不屏蔽楼主</span>
<span class="kd">let</span> <span class="nx">text</span> <span class="o">=</span> <span class="nx">post</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">td.t_f</span><span class="dl">"</span><span class="p">).</span><span class="nx">innerText</span><span class="p">.</span><span class="nf">replaceAll</span><span class="p">(</span><span class="dl">'</span><span class="s1"> </span><span class="dl">'</span><span class="p">,</span><span class="dl">''</span><span class="p">);</span>
<span class="nx">stopWords</span><span class="p">.</span><span class="nf">forEach</span><span class="p">(</span><span class="nx">word</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">text</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nf">replaceAll</span><span class="p">(</span><span class="nx">word</span><span class="p">,</span> <span class="dl">''</span><span class="p">);</span>
<span class="p">});</span>
<span class="k">if </span><span class="p">(</span><span class="nx">text</span><span class="p">.</span><span class="nx">length</span> <span class="o"><</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
<span class="nf">hidePost</span><span class="p">(</span><span class="nx">post</span><span class="p">,</span> <span class="nx">authorHTML</span><span class="o">+</span><span class="dl">"</span><span class="s2">发布的疑似水贴被自动折叠</span><span class="dl">"</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="nf">readConfig</span><span class="p">();</span>
<span class="nf">regMenu</span><span class="p">();</span>
<span class="nf">autoHide</span><span class="p">();</span>
<span class="nf">showButtons</span><span class="p">();</span>
</code></pre></div></div>
<p><a href="https://www.52pojie.cn/thread-1816967-1-1.html">本文在吾爱破解论坛同步发布,点此查看</a></p>
Thu, 03 Aug 2023 00:00:00 +0000
https://peasoft.github.io/2023/08/03/52fold.html
https://peasoft.github.io/2023/08/03/52fold.html
脚本
吾爱破解论坛
技术
-
技术手段破解手游防沉迷限制
<p>此文转自吾爱破解论坛,作者就是我本人,<a href="https://www.52pojie.cn/thread-1733855-1-1.html">点击这里查看原文</a></p>
<h1 id="0-前言">0. 前言</h1>
<p>前几天有坛友成功破解了页游的防沉迷限制,既然页游已经被破解成功了,那我们是不是也可以逝逝看破解手游呢?</p>
<h1 id="1-分析">1. 分析</h1>
<p>先在手机上下载好游戏,使用MT管理器<strong>提取出 APK,传到电脑上</strong>。为了反编译和阅读代码,我们<strong>在电脑上打开 JADX,把传到电脑上的游戏 APK 文件拖入窗口</strong>。</p>
<p><img src="https://testingcf.jsdelivr.net/gh/peasoft/picx-images-hosting@master/20230526/code_tree.5jmpgp86mb80.webp" alt="代码文件结构" /></p>
<p>从游戏的代码结构中可以看出:这个程序使用了某 SDK 来实现防沉迷检测。一般来说,<strong>SDK 中有一个函数来判断能否进行游戏,游戏再根据这个函数的返回值选择进入或退出</strong>。因此,第一种思路就是:<strong>修改判定函数的返回值</strong>。那么,我们怎样找到判定函数呢?我们可以参考 SDK 的开发文档(<strong>2024/07/23 更新</strong>:此文档的 REST API 部分在更新后已被删除,可以科学使用 Web Archive 来查看):aHR0cHM6Ly9kZXZlbG9wZXIudGFwdGFwLmNvbS9kb2NzL3Nkay9hbnRpLWFkZGljdGlvbi9ndWlkZS8jJUU1JTlCJTlFJUU4JUIwJTgzJUU3JUIxJUJCJUU1JTlFJThC</p>
<p>在文档中,我们看到这个函数有多种回调状态码。因此,如果一个函数中同时包含了这几种状态码,这个函数应该就是判定函数。<strong>我们在 JADX 中选择”导航“->”搜索文本“,填入 <code class="language-plaintext highlighter-rouge">9002</code>。</strong></p>
<p>思考:为什么选择搜索<code class="language-plaintext highlighter-rouge">9002</code>?我们设想一下,假如判定函数可能给出的状态码有<code class="language-plaintext highlighter-rouge">1</code>和<code class="language-plaintext highlighter-rouge">9002</code>,搜索哪一个数有更大概率找到这个函数?应该选<code class="language-plaintext highlighter-rouge">9002</code>。<code class="language-plaintext highlighter-rouge">1</code>可以表示第1个变量(<code class="language-plaintext highlighter-rouge">v1</code>)、第1个寄存器(<code class="language-plaintext highlighter-rouge">p1</code>)等,在代码中<strong>太常见</strong>了,没有针对性。但是一个正常的函数不会含有<code class="language-plaintext highlighter-rouge">9002</code>个变量,这时<code class="language-plaintext highlighter-rouge">9002</code>肯定表示一个<strong>特殊</strong>的状态码。</p>
<p><img src="https://testingcf.jsdelivr.net/gh/peasoft/picx-images-hosting@master/20230526/code_search.18tckozo8g2o.webp" alt="代码搜索结果" /></p>
<p>我们可以找到好几条可疑代码,我已经在上图中框出来了。我们重点分析框中的第2条。程序的流程大致是这样的:<strong>先判断实名认证是否成功</strong>(<code class="language-plaintext highlighter-rouge">状态码==500</code>),如果不成功则弹出错误信息;如果成功则<strong>判断用户是不是成年人</strong>(<code class="language-plaintext highlighter-rouge">currentUserAgeLimit()==18</code>),是就开始游戏,否则执行其它验证(?)。我们可以在检查状态码前把状态码强行赋值成500,或者在进入函数后直接跳转到“开始游戏”。但可惜的是,这两种破解方法都失败了。</p>
<h1 id="2-再次分析">2. 再次分析</h1>
<p>我们在手机上用MT管理器打开 APK 中的 <code class="language-plaintext highlighter-rouge">classes.dex</code> 文件,切换到“常量”页面,选择“过滤”,输入“<code class="language-plaintext highlighter-rouge">https://</code>”。翻看结果,有没有发现“<code class="language-plaintext highlighter-rouge">https://tds-tapsdk.cn.tapapis.com</code>”?这个网址在上面提到的 SDK 文档的“REST API”部分也出现了。根据文档的说法,这个地址是用来检查玩家当前能否游戏的。那么,<strong>如果我们把这个地址改掉,让这些请求全部发到我们自己的电脑上,再返回伪造的“验证通过”消息,不就能骗过游戏了</strong>?我们点击这条文本,<strong>把编辑框内的文本替换成“<code class="language-plaintext highlighter-rouge">http://电脑IP:8080</code>”</strong>。确定,再应用修改,最后重编译 dex 及 APK,然后安装这个APK。(注意:如果手机没有Root并安装核心破解,需要先卸载原应用再安装。另外,因为游戏被修改过了,所以系统可能会报毒,无视即可)</p>
<p>接下来,我们要在电脑上启动一个服务器来接收游戏的实名认证请求,本文使用的是Python3+Flask。先创建文件 <code class="language-plaintext highlighter-rouge">server.py</code>,在文件中加入以下代码:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">flask</span> <span class="kn">import</span> <span class="n">Flask</span><span class="p">,</span> <span class="n">request</span>
<span class="n">app</span> <span class="o">=</span> <span class="nc">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
</code></pre></div></div>
<p><del>然后再创建 <code class="language-plaintext highlighter-rouge">go.bat</code>,用于快速启动 Flask 服务端:</del></p>
<div class="language-batch highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@set <span class="kd">FLASK_APP</span><span class="o">=</span><span class="kd">server</span>.py
@set <span class="kd">FLASK_ENV</span><span class="o">=</span><span class="kd">development</span>
@py <span class="o">-</span><span class="m">3</span> <span class="na">-m </span><span class="kd">flask</span> <span class="nb">run</span> <span class="na">--host</span><span class="o">=</span><span class="m">0</span>.0.0.0 <span class="na">--port</span><span class="o">=</span><span class="m">8080</span>
</code></pre></div></div>
<p><del>运行 <code class="language-plaintext highlighter-rouge">go.bat</code></del></p>
<p><strong>2023/05/26 更新</strong>:不用创建 <code class="language-plaintext highlighter-rouge">go.bat</code>,只要在 <code class="language-plaintext highlighter-rouge">server.py</code> 的代码结尾加上:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">'</span><span class="s">__main__</span><span class="sh">'</span><span class="p">:</span>
<span class="n">app</span><span class="p">.</span><span class="nf">run</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="sh">'</span><span class="s">0.0.0.0</span><span class="sh">'</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">8080</span><span class="p">)</span>
</code></pre></div></div>
<p>即可。</p>
<p>运行 <code class="language-plaintext highlighter-rouge">server.py</code>,观察控制台日志,游戏请求了以下地址:<code class="language-plaintext highlighter-rouge">/anti-addiction/v1/clients/<clientId>/configuration</code>(其中<code class="language-plaintext highlighter-rouge"><XXXXXX></code>表示信息经过脱敏处理),同时游戏报错“无法连接网络”。我们应该返回什么信息给游戏呢?<strong>我们把这个地址拼到原来的 API 域名后面,粘贴到浏览器打开</strong>。我们得到了一大串内容,其中大多数信息已被我省略:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="nl">"success"</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span><span class="nl">"data"</span><span class="p">:{</span><span class="nl">"child_protected_config"</span><span class="p">:{</span><span class="nl">"share_time_switch"</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="nl">"use_time_switch"</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="nl">"no_identify_time"</span><span class="p">:</span><span class="mi">3600</span><span class="p">,</span><span class="nl">"charge_amount_switch"</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="nl">"child_common_time"</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="nl">"child_holiday_time"</span><span class="p">:</span><span class="mi">3600</span><span class="p">,</span><span class="nl">"night_strict_start"</span><span class="p">:</span><span class="s2">"21:00"</span><span class="p">,</span><span class="nl">"night_strict_end"</span><span class="p">:</span><span class="s2">"20:00"</span><span class="p">,</span><span class="nl">"night_strict_warn"</span><span class="p">:</span><span class="mi">1200</span><span class="p">,</span><span class="nl">"remain_time_warn"</span><span class="p">:</span><span class="mi">2400</span><span class="p">,</span><span class="nl">"upload_all_data"</span><span class="p">:</span><span class="s2">"0"</span><span class="p">},</span><span class="nl">"name"</span><span class="p">:</span><span class="err"><游戏名></span><span class="p">,</span><span class="nl">"upload_user_action"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="nl">"ui_config"</span><span class="p">:{</span><span class="nl">"pay_limit_words"</span><span class="p">:</span><span class="err"><</span><span class="s2">"消费金额已达上限"</span><span class="err">提示文本></span><span class="p">,</span><span class="nl">"health_reminder_words"</span><span class="p">:</span><span class="err"><</span><span class="s2">"健康游戏"</span><span class="err">提示文本></span><span class="p">,</span><span class="nl">"auth_identify_words"</span><span class="p">:</span><span class="err"><</span><span class="s2">"实名认证"</span><span class="err">界面文本></span><span class="p">},</span><span class="nl">"register_config"</span><span class="p">:{},</span><span class="nl">"holiday"</span><span class="p">:[</span><span class="err"><今年所有休息日的日期></span><span class="p">]}}</span><span class="w">
</span></code></pre></div></div>
<p>然后我们给服务器加3行代码(<strong>2023/05/26 更新</strong>:以下所有代码均加在 <code class="language-plaintext highlighter-rouge">if __name__ == '__main__'</code> 前):</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@app.route</span><span class="p">(</span><span class="sh">'</span><span class="s">/anti-addiction/v1/clients/<clientId>/configuration</span><span class="sh">'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">configuration</span><span class="p">(</span><span class="n">cliendId</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">r</span><span class="sh">'</span><span class="s"><把你得到的完整信息粘贴到这里></span><span class="sh">'</span>
</code></pre></div></div>
<p>在游戏中选择“重试”。接着,游戏又请求了 <code class="language-plaintext highlighter-rouge">/real-name/v1/clients/<clientId>/users/<userIdentifier></code>。我们再按照刚才的方法添加3行代码(这次得到的信息很短,我就直接把信息和代码一起给了):</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@app.route</span><span class="p">(</span><span class="sh">'</span><span class="s">/real-name/v1/clients/<clientId>/users/<userIdentifier></span><span class="sh">'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">real_name</span><span class="p">(</span><span class="n">clientId</span><span class="p">,</span> <span class="n">userIdentifier</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">r</span><span class="sh">'</span><span class="s">{</span><span class="sh">"</span><span class="s">success</span><span class="sh">"</span><span class="s">:true,</span><span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="s">:{</span><span class="sh">"</span><span class="s">status</span><span class="sh">"</span><span class="s">:2,</span><span class="sh">"</span><span class="s">anti_addiction_token</span><span class="sh">"</span><span class="s">:</span><span class="sh">""</span><span class="s">,</span><span class="sh">"</span><span class="s">age_limit</span><span class="sh">"</span><span class="s">:-1,</span><span class="sh">"</span><span class="s">has_auth_record</span><span class="sh">"</span><span class="s">:false}}</span><span class="sh">'</span>
</code></pre></div></div>
<p>接着,游戏弹出了实名认证提示。我们随便填写姓名,身份证号也可以随便填,但要符合身份证号的格式。比如,你可以填 <code class="language-plaintext highlighter-rouge">110101190001011017</code>(免责声明:此处的身份证号是随机生成的,仅用作测试用途,如此号码真实存在纯属巧合!)我们的服务器接收到了一个 POST 请求(API 地址见代码)。接着再加几行代码:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@app.route</span><span class="p">(</span><span class="sh">'</span><span class="s">/real-name/v1/clients/<clientId>/users/<userIdentifier>/manual</span><span class="sh">'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">POST</span><span class="sh">"</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">real_name_post</span><span class="p">(</span><span class="n">clientId</span><span class="p">,</span> <span class="n">userIdentifier</span><span class="p">):</span>
<span class="nf">print</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">data</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">r</span><span class="sh">'</span><span class="s">{}</span><span class="sh">'</span>
</code></pre></div></div>
<p>再次提交实名信息,控制台会输出游戏的请求信息,再把这些信息 POST 给真服务器,我们又得到了和刚才相同的数据。我们把数据填到添加的 <code class="language-plaintext highlighter-rouge">return</code> 语句中,在游戏中再次提交信息。这次,游戏提示“请输入真实信息”。那么,究竟要返回怎样的信息才能使游戏认为实名认证通过了呢?我们再仔细观察一下这串信息:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="nl">"success"</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span><span class="nl">"data"</span><span class="p">:{</span><span class="nl">"status"</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span><span class="nl">"anti_addiction_token"</span><span class="p">:</span><span class="s2">""</span><span class="p">,</span><span class="nl">"age_limit"</span><span class="p">:</span><span class="mi">-1</span><span class="p">,</span><span class="nl">"has_auth_record"</span><span class="p">:</span><span class="kc">false</span><span class="p">}}</span><span class="w">
</span></code></pre></div></div>
<p>很显然,最前面的 <code class="language-plaintext highlighter-rouge">success</code> 是正常的,而 <code class="language-plaintext highlighter-rouge">data</code> 中的 <code class="language-plaintext highlighter-rouge">age_limit</code> 引起了我们的注意。还记得吗,再第一次分析中我们提到游戏会判断用户是不是成年人,即 <code class="language-plaintext highlighter-rouge">currentUserAgeLimit()</code> 是否为<code class="language-plaintext highlighter-rouge">18</code>。我们凭直觉判断,这个函数的返回值应该就是 <code class="language-plaintext highlighter-rouge">age_limit</code> 的值。所以“正确”的数据中 <code class="language-plaintext highlighter-rouge">age_limit</code> 应该就是<code class="language-plaintext highlighter-rouge">18</code>。而这里的 <code class="language-plaintext highlighter-rouge">status</code> 也需要调整。经测试,<code class="language-plaintext highlighter-rouge">status>=2</code>代表提交的是假信息;<code class="language-plaintext highlighter-rouge">1</code>代表信息正在审核;<code class="language-plaintext highlighter-rouge">0</code>代表实名认证已通过。另外2个数据不修改也没有问题。所以,最终的服务器代码应该是这样:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@app.route</span><span class="p">(</span><span class="sh">'</span><span class="s">/real-name/v1/clients/<clientId>/users/<userIdentifier>/manual</span><span class="sh">'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">POST</span><span class="sh">"</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">real_name_post</span><span class="p">(</span><span class="n">clientId</span><span class="p">,</span> <span class="n">userIdentifier</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">r</span><span class="sh">'</span><span class="s">{</span><span class="sh">"</span><span class="s">success</span><span class="sh">"</span><span class="s">:true,</span><span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="s">:{</span><span class="sh">"</span><span class="s">status</span><span class="sh">"</span><span class="s">:0,</span><span class="sh">"</span><span class="s">anti_addiction_token</span><span class="sh">"</span><span class="s">:</span><span class="sh">""</span><span class="s">,</span><span class="sh">"</span><span class="s">age_limit</span><span class="sh">"</span><span class="s">:18,</span><span class="sh">"</span><span class="s">has_auth_record</span><span class="sh">"</span><span class="s">:false}}</span><span class="sh">'</span>
</code></pre></div></div>
<p>这时,游戏发出了最后一个 GET 请求:<code class="language-plaintext highlighter-rouge">/anti-addiction/v1/clients/<clientId>/users/<userIdentifier>/playable</code>。而响应这个请求非常简单,因为开发文档已经给出过样例了!(开发小哥:我给你样例是让你干这事的?<del>原地去世</del>)代码:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@app.route</span><span class="p">(</span><span class="sh">'</span><span class="s">/anti-addiction/v1/clients/<clientId>/users/<userIdentifier>/playable</span><span class="sh">'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">playable</span><span class="p">(</span><span class="n">clientId</span><span class="p">,</span> <span class="n">userIdentifier</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">r</span><span class="sh">'</span><span class="s">{</span><span class="sh">"</span><span class="s">success</span><span class="sh">"</span><span class="s">:true,</span><span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="s">:{</span><span class="sh">"</span><span class="s">code</span><span class="sh">"</span><span class="s">:200,</span><span class="sh">"</span><span class="s">can_play</span><span class="sh">"</span><span class="s">:true,</span><span class="sh">"</span><span class="s">message</span><span class="sh">"</span><span class="s">:</span><span class="sh">"</span><span class="s">游戏时间不受限制</span><span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="s">remain_time</span><span class="sh">"</span><span class="s">:60,</span><span class="sh">"</span><span class="s">cost_time</span><span class="sh">"</span><span class="s">:0,</span><span class="sh">"</span><span class="s">restrict_type</span><span class="sh">"</span><span class="s">:0,</span><span class="sh">"</span><span class="s">title</span><span class="sh">"</span><span class="s">:</span><span class="sh">"</span><span class="s">健康游戏提示</span><span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="s">description</span><span class="sh">"</span><span class="s">:</span><span class="sh">"</span><span class="s">当前为成年人账号</span><span class="sh">"</span><span class="s">}}</span><span class="sh">'</span>
</code></pre></div></div>
<p>最后,再次提交信息,<strong>验证通过!成功进入游戏!!!<del>全体起立!</del>至此,防沉迷限制破解成功!!!</strong></p>
<p>不过,还可以优化!</p>
<h1 id="3-优化">3. 优化</h1>
<p>如果你对着控制台继续观察一段时间就会发现,游戏还会向服务器请求 <code class="language-plaintext highlighter-rouge">server-time</code>,不过404好像没有影响游戏正常运行,所以我们不管了。游戏有时会用 POST 方式发出 <code class="language-plaintext highlighter-rouge">playable</code> 请求,所以我们可以让服务器也响应 POST。另外,上文中说到 <code class="language-plaintext highlighter-rouge">real_name</code> 请求和 <code class="language-plaintext highlighter-rouge">real_name_post</code> 请求时,真服务器返回的数据是一样的,因此我们不妨猜想一下,假如 <code class="language-plaintext highlighter-rouge">real_name</code> 通过了,游戏应该就不会再发送 <code class="language-plaintext highlighter-rouge">real_name_post</code> 请求了,所以我们可以把两个处理函数合二为一。最终代码如下:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
<span class="n">app</span> <span class="o">=</span> <span class="nc">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="sh">'</span><span class="s">/anti-addiction/v1/clients/<clientId>/configuration</span><span class="sh">'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">configuration</span><span class="p">(</span><span class="n">clientId</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">r</span><span class="sh">'</span><span class="s"><把你得到的完整信息粘贴到这里></span><span class="sh">'</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="sh">'</span><span class="s">/real-name/v1/clients/<clientId>/users/<userIdentifier></span><span class="sh">'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">real_name</span><span class="p">(</span><span class="n">clientId</span><span class="p">,</span> <span class="n">userIdentifier</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">r</span><span class="sh">'</span><span class="s">{</span><span class="sh">"</span><span class="s">success</span><span class="sh">"</span><span class="s">:true,</span><span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="s">:{</span><span class="sh">"</span><span class="s">status</span><span class="sh">"</span><span class="s">:0,</span><span class="sh">"</span><span class="s">anti_addiction_token</span><span class="sh">"</span><span class="s">:</span><span class="sh">""</span><span class="s">,</span><span class="sh">"</span><span class="s">age_limit</span><span class="sh">"</span><span class="s">:18,</span><span class="sh">"</span><span class="s">has_auth_record</span><span class="sh">"</span><span class="s">:false}}</span><span class="sh">'</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="sh">'</span><span class="s">/anti-addiction/v1/clients/<clientId>/users/<userIdentifier>/playable</span><span class="sh">'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">get</span><span class="sh">'</span><span class="p">,</span><span class="sh">'</span><span class="s">post</span><span class="sh">'</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">playable</span><span class="p">(</span><span class="n">clientId</span><span class="p">,</span> <span class="n">userIdentifier</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">r</span><span class="sh">'</span><span class="s">{</span><span class="sh">"</span><span class="s">success</span><span class="sh">"</span><span class="s">:true,</span><span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="s">:{</span><span class="sh">"</span><span class="s">code</span><span class="sh">"</span><span class="s">:200,</span><span class="sh">"</span><span class="s">can_play</span><span class="sh">"</span><span class="s">:true,</span><span class="sh">"</span><span class="s">message</span><span class="sh">"</span><span class="s">:</span><span class="sh">"</span><span class="s">游戏时间不受限制</span><span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="s">remain_time</span><span class="sh">"</span><span class="s">:60,</span><span class="sh">"</span><span class="s">cost_time</span><span class="sh">"</span><span class="s">:0,</span><span class="sh">"</span><span class="s">restrict_type</span><span class="sh">"</span><span class="s">:0,</span><span class="sh">"</span><span class="s">title</span><span class="sh">"</span><span class="s">:</span><span class="sh">"</span><span class="s">健康游戏提示</span><span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="s">description</span><span class="sh">"</span><span class="s">:</span><span class="sh">"</span><span class="s">当前为成年人账号</span><span class="sh">"</span><span class="s">}}</span><span class="sh">'</span>
<span class="c1"># 2023/05/26更新:不用创建 `go.bat`,加入以下代码即可
</span><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">'</span><span class="s">__main__</span><span class="sh">'</span><span class="p">:</span>
<span class="n">app</span><span class="p">.</span><span class="nf">run</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="sh">'</span><span class="s">0.0.0.0</span><span class="sh">'</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">8080</span><span class="p">)</span>
</code></pre></div></div>
<p>最终的控制台日志截图:</p>
<p><img src="https://testingcf.jsdelivr.net/gh/peasoft/picx-images-hosting@master/20230526/server.e5rj3svz99c.webp" alt="控制台日志" /></p>
<h1 id="4-总结">4. 总结</h1>
<p>看完这篇文章,你或许已经能够破解使用同样的 SDK 制作的其它游戏了,因为本文针对的其实并不只是单独一款游戏,而是这个 SDK。但我并不希望一些熊孩子学会破解。顺便说一下,这种通过<strong>把 API 调用转移到自己的服务器上并返回假信息</strong>的方法被我自己称为模拟验证破解法,而这种思路还能用于破解登录限制,破解内购等一系列其它限制。欢迎大家分享自己的其它思路!</p>
<h2 id="2024-年的圣诞礼物">2024 年的圣诞礼物?</h2>
<p>5oqKIGBodHRwczovL3Rkcy10YXBzZGsuY24udGFwYXBpcy5jb21gIOabv+aNouaIkCBgaHR0cHM6Ly9wZWFzb2Z0LnBhZ2VzLmRldmAg5bCx6KGM5LqG44CC</p>
Fri, 06 Jan 2023 00:00:00 +0000
https://peasoft.github.io/2023/01/06/game-realname-crack.html
https://peasoft.github.io/2023/01/06/game-realname-crack.html
Android
破解
逆向
吾爱破解论坛
技术