在开始之前,请确定你的设备型号是C1200 v1,以及备份好你的PPPoE账户和密码信息以及VLAN信息
由于马来西亚版本软件阉割了波束成形和AP功能,所以尝试将其刷成公开版。

确定版本

首先使用默认用户名和密码登录

默认用户名为admin,密码为TIME(主MAC地址后四位)
比如你的MAC地址为FF:FF:FF:FF:AA:C0,则对应密码是TIMEAAC0

TPTIME2EU_CheckVersion
首先在TIME旧固件下进入Advanced界面,向下滑动到最下方
TPTIME2EU_VersionCk
即可查看到当前的版本
TIME版本有一个特殊点就是完全没有任何关于系统更新的功能在前台,必须通过审查元素的方式才能调出。
而且只有1.0.0 Build 20180502 rel.45702 (EU)一个软件版本号,从来没有更新过

更新前准备

首先需要进入本来的管理页面,进入Advanced界面,在左侧找到Guest Network
TPTIME2EU_OriginalGuest
在Guest Network按钮上右键选择检查,进入DevTools
找到如下节点
TPTIME2EU_GuestPoint
改为
TPTIME2EU_DevTools_Moded
再次点击Guest Network,即可进入被隐藏的固件更新页面!
TPTIME2EU_UpdatePage

更新到中间固件

TP-LINK也不是傻瓜,不会让我们那么轻易的跨版本刷入固件开启更多功能,但是在2018年发布的46288 BETA版本中,这个版本没有刷写验证,所以我们就选择46288版本进行版本中继,继而就可以刷入正常的RELEASE版本。
TPTIME2EU_Flash46288
TPTIME2EU_Flash46288_Progress

更新到最新发布版固件

等待设备自动重启后,你会发现它的整个UI都大变样,同时也有BETA水印
TPTIME2EU_NewUi
直接设置好密码,进入新的页面
TPTIME2EU_NewBar
此时已经变成了公开版,所以也不再需要DevTools来打开固件更新页面了
TPTIME2EU_NewSidebar
直接进入Firmware Upgrade页面
选择2022年最新发布的58207版本,即可更新到RELEASE版本!
TPTIME2EU_Flash58207
TPTIME2EU_Flash58207_Progress

完成

享受波束成形和AP模式吧!
TPTIME2EU_Finish

固件下载

中转用BETA固件: C1200v1_eu_1.1.3_20180502_46288.bin
欧洲/东南亚区域最新版本固件: C1200v1_eu_1.1.4_20220517_58207.bin
美洲区域最新版本固件: C1200v1_us_1.1.3_20220517_58249.bin
TIME原版固件: C1200v1_time_1.0.0_20180502_45702.bin
注:如果需要刷回TIME版固件,请刷入一遍中转用BETA固件才可刷入TIME版固件

K2A.SH

此脚本可一键将Debian系Linux发行版,一键切换到超级轻量的Linux分支——Alpine Linux,多适合于小型VPS或高性能需求下使用

新一代的DD脚本

特点

  • 支持自非标准网卡名(比如ens0等情况)自动获取IPv4/IPv6双栈网络信息并自动生成网络配置文件
  • 支持一键切换到国内镜像源,在运行时添加"--tuna"参数即可切换到由清华大学TUNA协会提供的镜像源,加快在国内使用时的安装速度
  • 支持在安装之后使用公钥登录(如果源系统启用了公钥登录的情况下)
  • 支持安装权限检测,并提示提权

使用

wget --no-check-certificate https://obj.yuu.ink/script/k2a.sh && chmod +x k2a.sh && ./k2a.sh

使用时请务必做好备份

更新日志

1.8
JAN.28-2023
修复GRUB安装器无法找到磁盘的Bug

1.7
JAN.10-2023
一些优化

1.6
JAN.07-2023
增加IPv6自动判断和自动配置文件生成功能
增加帮助提示功能(附带--help参数即可显示)

1.5
JAN.06-2023
首次发布

测试版

测试中功能: EFI检测, EFI安装, Debian系发行版检测
使用时请务必做好备份

wget --no-check-certificate https://obj.yuu.ink/script/k2a_alpha.sh && chmod +x k2a_alpha.sh && ./k2a_alpha.sh

2.2-ALPHA
MAR.3-2023
添加EFI安全启动检测功能

2.1-ALPHA
JAN.26-2023
添加snapd检测和卸载功能

2.0-ALPHA
JAN.13-2023
修复无法执行init的逻辑错误
精简部分代码

1.9-ALPHA
JAN.12-2023
添加系统检测功能
修改一些字符提示

1.8-ALPHA
JAN.10-2023
添加EFI检测功能
添加EFI安装功能

第一次尝试给Typecho写插件,其中利用到了Typecho1.2的新功能和比较新的PHP实现
这只是一个简单的小小作品,代码比较混杂,如果有什么建议和遇到问题可在评论区中提出
执行效果如下
CNYLtn_Yuu
动画基于CSS3和其自带的贝塞尔曲线实现进行绘制
同时又由于慢速互联网的存在,该插件会将代码插入到footer以避免影响页面的整体加载和渲染速度
将部分设置做了图形化界面,可以更快进行修改和匹配新的传统节日
CNYLtn_Settings
安装方式则与其他插件一样,解压下方提供的zip,将插件文件夹放入<网站根目录>/usr/plugins下,至Typecho后台启用即可。

更新日志与下载

1.2R->1.3R
<FEB.14-2023>
CNYLtn_1.3R.zip
1.添加调试模式,开启后可在前台控制台中输出调试信息
2.整体结构优化

1.1R->1.2R
<JAN.11-2023>
CNYLtn_1.2R.zip
1.修复在英文版Windows系统和MacOS下的默认字体回归问题
2.修改组件动画显示
3.修改字体大小为3em并在灯笼中居中

1.0R->1.1R
<JAN.04-2023>
CNYLtn_1.1R.zip
1.修复移动端检测无效的问题

1.0R
<JAN.03-2023>
未公开发布的Release版本

注于230214:今年已经更新结束,功能新增将在来年进行更新,Bug修复则可继续提出并等待修复

前言

在本文中,我将使用x86汇编和简易的小小程序片段,其中将会使用最新的C++ 23标准进行代码编写。所以当你开始阅读这篇短文时,希望你有理解C++ 23,内存,指针和标准Win32 API的基本概念的能力。

代码段

#include <iostream>

int main() {
    auto string = "Hello, World! ";
    auto integer = 114514;
    std::cout << string << integer << std::endl;
    system("pause");
    return 0;
}

在这段简单的代码中,很明显这只是一个利用了C++新特性的HelloWorld程序,不难看出它最终会在命令提示符打出”Hello, World! 114514”这个字符串和整数并且传输pause指令给命令提示符,让其暂停运行并显示“按任意键继续”的提示。
提示:在编译时候记得加上-static给CMAKE_EXE_LINKER_FLAGS,这样才可以让编译出的可执行文件独立运行

入口点

当你将编译出的可执行文件拖入IDA的窗口之后,当IDA自动分析完成整个程序的互相调用,会给出一张十分复杂的调用图(如下图)。
IDA_MainGraph
你可能会很好奇为什么,只是一个简单的Hello,World程序而已为什么会存在这么多的调用,并没有在代码中体现出来哇?
放大其中任意一个代码块(如下图)你会发现,他们做的那么多事情,无非就是在准备运行现场,错误处理等现代编程语言自带的功能,在现如今的编程中,这些以往繁琐的操作,都将会被自动处理。
IDA_AnyPreFunc

准备运行现场

main

总结

(暂未完结)

开机splash上有彩条的时候使用
需要等到设备完全进系统后再执行
C#写的首个练手项目

/* NB30 AtCmdXSoftUpdate v0.1
   (C)Yuu 2020
 */
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.IO.Ports;

namespace AtCmdXSoftUpdate {
  class Program {
    static void Main(string[] args) {
        Console.WriteLine("Nb30 AtCmdXSoftUpdate v0.1");
      SerialPort serialPort = new SerialPort();
      serialPort.PortName = "COM30";
      serialPort.BaudRate = 115200;
      serialPort.DataBits = 8;
      serialPort.Parity = Parity.None;
      serialPort.StopBits = StopBits.One;
      serialPort.Handshake = Handshake.None;
      serialPort.ReadTimeout = 500;
      serialPort.WriteTimeout = 500;
      serialPort.Open();

      serialPort.WriteLine("AT+XSOFTUPDATE");
      Thread.Sleep(1000);
      string response = serialPort.ReadExisting();
      if (true == response.Contains("OK")) {
        Console.WriteLine("OK.Please wait device reboot!");
      } else {
        Console.WriteLine("ERROR");
      } 
      serialPort.Close();
    }
  }
}