微信远程攻击面简单的研究与分析

微信远程攻击面简单的研究与分析

https://mp.weixin.qq.com/s/yMQN3MciI-0f3mzz_saiwQ

在完成了对 FaceTime 的一系列漏洞挖掘与研究后,我们决定对微信的音视频通信做一些分析。经分析后发现,当微信语音通话连接建立成功之后,微信客户端将解析远端发来的网络报文并还原成多媒体流。在还原解析的过程中,如果处理远端数据的代码存在问题时就会形成一个远程的攻击面。
在针对这个攻击面进行深入挖掘后我们发现了若干可以造成远程内存破坏的漏洞。本篇文章我们将选择一个比较有趣且复杂的漏洞进行深入的分析。该漏洞可以造成远程写溢出从而导致崩溃,其root cause隐藏的非常深,触发流程也比较复杂。研究与分析该漏洞无论是对安全研究还是软件开发的角度都有一定的价值。我们将在文章中详细的分析漏洞成因和触发流程。微信已经在最新版7.0.12中修复了该漏洞。

开胃小菜

首先我们先介绍两个比较简单的漏洞,一个属于本地代码执行,一个属于远程溢出。

本地代码执行

Mac版本的微信客户端处理粘贴操作时,没有有效检查粘贴板对象中内容,导致不安全的对象反序列化。当本地其他恶意应用设置粘贴板时,用户在微信客户端粘贴操作时,会导致任意对象的创建。
如下面截图所示,Mac 版本的微信在反序列化粘贴板对象的过程中,并没有使用secure coding 以及白名单等设置,导致任何可以响应 [initwithcoder:] 函数的 objective-c 对象都能被创建并使用,会引起很大的攻击面。

Mac版本微信对剪切板的处理

具体攻击结果可以参考[Google Project Zero在iMessage中发现的大量不安全反序列化攻击] (https://www.blackhat.com/us-19/briefings/schedule/#look-no-hands—-the-remote-interaction-less-attack-surface-of-the-iphone-15203).
Mac版本微信已经对该漏洞进行了完全正确的修复,调用了 setRequiresSecureCoding: 函数,并作出了安全设置。
修复后的剪切板处理

远程下溢出


微信视频通话接通后,通话两端建立网络直连传递RTP报文。微信客户端传输RTP包过程中,采用了一套加密机制。但是微信客户端在RTP解密之前,没有很好验证RTP包长度。当攻击者发送很短的RTP包的时候,会引起接受端处理RTP包过程中长度计算的整数下溢出,进而导致内存越界访问。
RTP包长度验证减法下溢出
有趣的是,GP0 研究员在微信 CAudioJBM::InputAudioFrameToJBM 函数中发现了类似的错误 (https://bugs.chromium.org/p/project-zero/issues/detail?id=1948)。这说明微信在在包长度验证时存在一定共性缺陷。
这是一个非常明显的下溢出,但是通过对这个问题的分析,我们认为远程的攻击面中可能存在风险更高的漏洞。

远程写溢出成因与分析

跳过前期复杂的协商互联流程,我们在已经通过微信语音通话的状态下,微信客户端将收到远端发送来的音频数据。收到的原始数据会被层层分解处理,并根据不同的类型分发到不同的处理函数上。

RecvRtpPacketCng

在收到远端的网络数据后,RTP 数据包将被 RecvRtpPacketCng(__int64 XVEChannel, unsigned int *pData, __int16 len, void *a4) 函数处理,这里的参数 pData内容是语音通话的远端完全可控的。该函数会根据网络包中指定的过不同的代码解析
当pkType类型为7或8时,该网络包的类型为 RTPwithRsMd


当网络包头部的 subpkt 解析完成后会调用 ParaseRemoteLostRateParam 函数:


ParaseRemoteLostRateParam 函数中,根据远端的 pData 中数据设置了XVEChannel+72 处对象的内部数据。通过参数 a2,在 pData 中读取两个字节,并最终设置到 m_RemoteLrParam 和 nFrmCnt 两个成员变量中。


DevPutProcessRsMdCng

在接收远端的语音数据的同时,也需要将自己的语音数据通过`XVEChannel`对象发送给远端。

在 readRemoteLrParam 函数中,会将刚刚设置的 m_RemoteLrParam 和 nFrmCnt 读取到栈上变量v92中。


在读取`RemoteLostRateParam`到局部变量v92后,需要设置到相应的本地成员变量中


当数据准备好后将调用函数 CAudioRS::RsMdEncProcessCng,写溢出就发生在这个函数中。

当 CAudioRS::RsMdEncProcessCng 刚开始执行时会通过 XVEChannel_72+9 作为 index 写一个 byte.


并在 RsMdEncQueueSourcePktCng 函数中 XVEChannel_72 + 9 将做一次自增。

当 CAudioRS::RsMdEncProcessCng 退出前会根据当前的状态更新成员变量。

[1] 通过`update_data`根据`LocalExpectRSPara`的值修改成员变量

[2] 如果XVEChannel_72+9处的值与XVEChannel_72+4处的值相同,则会发[3]处的代码将XVEChannel_72+9处写0.
因为 XVEChannel_72 + 9 可以根据 pData 中的数据设置成攻击者可控的数据,当 XVEChannel_72 + 9 被设置为大于 XVEChannel_72 + 4 时,就必须一直自增且产生整数溢出后重新与 XVEChannel_72 + 4 相等时, 才能将 XVEChannel_72 + 9清零。
所以 XVEChannel_72 + 9 的取值范围是0-255。又因为` *(_BYTE *)(XVEChannel_72 + *(char *)(XVEChannel_72 + 9) + 1668) = a7;` 使用的是有符号数作为`index`。最终覆盖范围是 `XVEChannel_72+1668`处的`-128`到`127`处超过原本数据结构包含的内存。

触发流程

  • RecvRtpPacketCng 从网络报文中获取 lrParam
  • DevPutProcessRsMdCng 根据`lrParam 设置 LocalExpectRSPara
  • RsMdEncProcessCng 根据 LocalExpectRSPara 中的参数修改成员变量作为数据修改的index (XVEChannel_72 + 9 )
  • 修改成功后会对index自增并与本地的max值做比较,如果index达到最大值index_max时(`XVEChannel_72 + 4`)将index清零
    • 如果通过远数据端将index设置为大于index_max的情况,则index会一直自增直到发生整数溢出后才能满足index==index_max的条件进入清零的逻辑
    • index在(-128,127)范围内遍历,产生越界写。越界写的范围在 (-128,127)之间。

感谢

要特别感谢 TSRC 的认真负责。他们在我们上报漏洞后对漏洞响应及时,收到报告的次日就确认了漏洞并给出危险评级。并且在后续的漏洞修复与修复版本更新的工作中和我们保持联系。

TimeLine

2019/11/28 发现漏洞
2019/12/02 完成漏洞分析并上报TSRC
2019/12/03 TSRC确认漏洞并修复
2020/03/23 文章发布
Credit:漏洞由盘古实验室黄涛、王铁磊发现和分析。

数字隐私和流量分析那些事儿

流量分析能为网站提供关键运营数据,大型成熟的网站都有不同类型的流量分析。互联网行业常用Analytics来描述流量分析,实现方式有多种:浏览器端、网页端、网络环节、服务器端。本文只是简单扫盲,欢迎各位行家拍砖。
浏览器端
比如你的浏览器安装了某种流量分析插件,那么这个插件可能将你的所有浏览数据传到分析公司的数据库,常见的如 SimilarWeb. 如果你的浏览器装有流量分析插件,那么无论你是通过代理、VPN、Tor访问网络,你的真实IP地址、操作系统、浏览器指纹等信息都会被分析公司搜集。很明显浏览器端的流量分析危险等级最高,这也是为什么某些极权政府热衷于推广国产浏览器的原因。详见这里。
Cookies
网页端的流量分析通常是通过cookies和网页插件来实现的。Cookies是很多网站必不可少的元素,但凡要你登录操作的网站都需要cookies,它是网站分发给你的一个临时记号。
打个比方,你晚上去兰桂坊这样的夜店街玩,每进一个场子,夜店保安就会在你手臂上盖一个他们特有的图案,这样你出去吃完烧烤或打个电话回来,门口保安检查你有这个章就可以直接让你进去,而不是让你重新买票。Cookies就是网站给你的浏览器盖的章,但网站不会像夜店那样给每个客人盖同样的章,而是会给每人一个唯一的临时号码,这样网站不但知道你什么时候来的,还知道你是你而不是同时登录网站的张三或李四。人类保安能根据外表和声音来区别你跟张三李四不是同一个人,而你的长相声音具有唯一性。
Cookies有什么危险呢?想象一下你在夜店街从9点玩到6点,回家刚好撞见你老爸出门晨练,你刚打算拿出事先练得滚挂烂熟的瞎话说自己昨晚同学聚会喝醉了住远近闻名的老实人刘帅家,结果你老爸二话不说一把拉起你的袖子,露出手臂上十多家不同夜店的章…… 所以,为了防止发生这种隐私泄露的尴尬,你得用一个关闭窗口就自动删除所有cookies的浏览器,你爸拉起你袖子的时候只能看到白白的手臂。
夜店章时间久了会自动消失,cookies同样会有长短不同的有效期,某些cookies能保存很长时间这样你每次打开这个网站都不需要再输入一次帐号密码,方便,但问题是隐私。而某些网站则给cookies设置了一个寿命,过期就不认了,就像夜店章一样,否则你买一次票就能天天免费去玩,夜店老板不亏死了?
Http Cookies也分不同总类,详见维基百科.
网页插件
有很多网站不需要使用Cookies,比如你现在正在看的这种根本不需要登录的静态页面。但网站是怎样知道自己的客流量多大,包括详细到具体内容的流量呢?通常有网页插件和服务器端两种方法。
网页插件可以是javascript或者图片。网站使用网页插件来分析流量的原因无外乎以下两点:
1. 方便 网页插件好用啊,比如Google Analytics能直接提供各种分析数据、图表,部署也比自己在服务器端安装分析软件方便多少倍。
2. 权威 你自己服务器上的流量分析只有你自己知道,遇到那种吹牛逼的人怎么办?明明浏览量只有1000它说是一百万,而第三方插件则可以在必要时,比如面对投资人或广告投放商直接展示出你的Google Analytics。
3. 不是自己的服务器 现在很多网站都可以不用自己的服务器就能搭建,比如你现在正在看这个就是托管在Github Pages上的。这种情况Github知道我的流量,但我自己不知道,所以我只能装网页插件来分析流量了。
网页插件很容易识别,你只需要在网页上点击鼠标右键,查看网页代码,就能看到插件了。好吧你不会读代码,当我没说。不过市面上有很多浏览器插件专门检测或屏蔽网页插件,常见的广告屏蔽器(Ad Blocker)或脚本屏蔽器 no script, 或者跟踪插件屏蔽器 uBlock Origin,都可以告诉你哪些插件有问题,或者直接帮你屏蔽掉它们。这样,你对于流量分析来说就是隐形的了。Cheers~
Note: 用户跟踪流量分析的网页插件的使用是一个极为普遍的现象,请在顶部导航栏查看本站所作的 简要统计
服务器端
你打开一个网站的过程大致如下:
1. 你的浏览器要先问DNS服务器你输入这个网址的服务器在哪里,DNS服务器告诉你的浏览器一个IP地址。
2. 然后你的浏览器就向那个IP地址的服务器发出请求,那个服务器在收到你的请求之后把网页文件传送给你的浏览器。
3. 你的浏览器把接收到的网页文件 渲染 成你看到的漂亮网页。
好吧,上述过程有点长,不过你反复读两遍就会发现这个过程有两个“服务器”知道你访问过这个网站的事儿。假如你访问的是pornhub,那么DNS服务器知道你曾经问过pornhub的网址在哪里,虽然你只是问了它pornhub怎么走,不代表你一定就去了pornhub,但,呵呵,come on,大家都知道问pornhub怎么走的人里头有99.99%都去了。第二个知道你访问过pornhub的当然就是pornhub自己啦,你向它要了网页呢,那还能赖掉?
不过,你对pornhub很信任,因为你知道pornhub绝对不会出卖你,否则这事儿传出去以后谁还敢去它那儿?DNS服务器就没办法了。
你是不是在想“我这次知道pornhub怎么走了,下次再去的时候就不用问DNS服务器了,这样DNS服务器就不知道我看过多少”。这个理论上是可以的,不过因为各种原因并不现实。像pornhub这种人民群众喜闻乐见的网站,至少有成千上万台服务器,名副其实的连锁店。你访问pornhub更像是在一个大城市里找中石化的加油站,你上次加油的地方现在可能排着长长的队,所以你每次加油前都得先查查哪个加油站不用排队。用夜店比喻的话,就是pornhub每次都会让接待你的服务生带你去一个空的卡座。所以一般来说,你还得每次都问DNS服务器pornhub怎么走。
服务器端的流量分析是无法避免的,服务器知道你在这里干的一切,如果你每次都换IP且不登录的话还好,服务器认不出你是同一个人,但如果你登录帐号的话……
网络环节
互联网是一张网,前面描述的打开过程只是在应用层面,看上去只有DNS服务器和网站服务器(Pornhub)知道这事儿。实际上在更底层的网络,你发送的和接收到的每一个数据包都是经过很多服务器层层接力转发,就像你在淘宝剁手之后包裹是由网店老板交给快递收件员,途经收件站,经货车转运到机场或火车站,经铁路或航空送到你的城市总站,再经两三次转发送到快递门店,再由快递小哥送到你(或者小区门卫大爷)的手上。这中间很多人都可能打开你的包裹偷看一下你买了个啥好东西,这中间的每个环节都可能记录下你买了多少东西,比如快递门店一查这个月给你发了多少条短信就能统计你这个流量了。互联网上的数据包传输在本质上跟上述实物包裹是一样的,只不过各种中转站是由各种昂贵的路由器、网关等设备构成,整个过程时间短一点而已(好吧,短几个数量级)。
所以,网络中除了DNS服务器能做流量分析外,还有很多环节可能做流量分析。顺便说一句,看到这里,你大概明白防火长城是怎么封锁你的吧?一种方法是像机场安检,一扫你的包裹里有把枪或者一个炸弹,直接就拦下来了。第二种方法,看到你的发件地址是不允许的地方(比如收件人:台湾总统府)直接拦下,第三种也是最廉价的方法就是当你问DNS服务器pronhub怎么走的时候直接告诉你一个错误的地址(DNS污染)。
好啦,回到正题,除了DNS方的分析,你的ISP服务商(就是每个月收你网费的公司,或者给你网用的组织)通常会分析你访问了哪些网站,因为你所有的流量都会经过它控制的服务器。用前面送快递来比喻,你的ISP服务商就是专门负责你那个片区的快递门店,你的公司或机构网络则相当于负责收发件的门卫大爷。
总结
前面这些分析无外乎是想告诉大家,不是只有你登录或访问的网站能够分析你在互联网上的活动,而且你的活动是否被记录和分析绝不仅能通过看一个网站的源代码发现。整个网络里有无数个环节可以用来分析和跟踪你,服务器有你的所有信息,网路中间设施有很多环节可以监听、审查你的信息流。当你凝视深渊的时候,深渊也在凝视你。保护隐私要从自己的电脑这边源头做起,而不是仅仅去指望或指责别人。

《數字極權時代生存手記》1.不记名號碼的選擇

1 為什麼使用不記名號碼
網絡服務或是在註冊時強制要求提供手機號碼(比如包括 Telegram 和 Signal 在內的大部分即時通訊應用),或是支持添加手機號碼用於安全驗證(比如 Gmail 和 Twitter)。使用個人真實號碼註冊或綁定帳號存在很大的風險,他人可循此追蹤用戶本人;使用不記名的預付費電話卡/太空卡或虛擬號碼並不能完全實現匿名,但可以提高追蹤的難度和成本。
中國大陸用戶應避免使用自己的個人手機號碼註冊 Telegram 等牆外服務。由於中國實施手機實名制,每個號碼都有與之對應個人身份信息,國安、公安可以借助中國大陸的實名制手機號碼實現對牆外 ID 的「實名制」,甚至通過攔截一次性驗證碼 (one-time password, OTP) 短訊侵入帳號。此外,2017 年以來中國政府部門在微信等牆內平台對「區塊鏈」話題實施管制,「幣圈人士」大量湧入 Telegram,此類人士使用 +86 開頭的中國大陸手機號碼註冊的賬號普遍存在發送 spam 信息等濫用行為,使 Telegram 官方不得不限制 +86 號碼新註冊的 Telegram 賬號主動發起聊天。

2 不記名號碼的類型
不記名號碼分為不記名實體電話卡號碼和虛擬號碼,按用途可分為一次性號碼和可長期保留的號碼,按持有方式可分為自持和代持。
2.1 不記名實體電話卡
2.1.1 香港太空卡
在深水埗鴨寮街和全港 7-11 和 OK 便利店可買到香港本地電訊商/運營商的太空卡。記得使用現金支付,刷卡或電子支付可被追溯。香港電訊商的可靠性請自行判斷。
2.1.2 美國:KnowRoaming
KnowRoaming 的 Travel SIM Card 提供一個美國手機號碼,支持在 200 個以上國家和地區漫遊。該卡每次充值的最小金額是 25 美元,餘額自最近一次充值起有 9 个月的有效期,到期餘額清零;此外還提供每月 3-12.5 美元的其他國家號碼。儘管 KnowRoaming 提供的國際漫遊服務反響不佳,但如果只是將號碼用作網站註冊接收 OTP,KnowRoaming 還是不錯的選擇。
2.1.3 美國:Lycamobile
Lycamobile 是一家跨國移動虛擬運營商(MVNO)。Lycamobile 的預付費 SIM 卡已取消現用現付 (Pay As You Go) ,性價比不高。号码需要每 90 天使用一次或充值一次,否则号码会被回收。配送中國需要轉運。
2.1.4 美國:Google Fi
Google Fi (原稱 Project Fi)是 Google 旗下的移動虛擬運營商,通過 T-Mobile 和 Sprint 的 Wi-Fi 和蜂窩移動網絡向美國以及超過120個國家的漫遊用戶提供語音及數據服務,已擴展至支持所有較新的 Android 手機和 iPhone。
Google Fi 的套餐分為無限套餐 (Unlimited) 和彈性套餐 (Flexible),無限套餐的月費為 70 美元另加 10%-20% 的稅費和附加費,提供無限制的通話、短信和流量;彈性套餐的月費為 20 美元另加 10%-20% 稅費和其他費用,流量費用每 GB 10 美元,超過 6 GB 後免費;另提供 1-6 人的多人團購優惠。
Google Fi 更適合頻繁出國的商旅人士,如果只是用於接受短信或者電話卡翻牆,選擇 Google Fi 的性價比不高。 Google Fi 的電話卡寄送美國以外地區需要轉運。
2.1.5 英國:Three
英國電訊商 Three 提供 Pay As You Go 的 SIM 卡。SIM 卡本身免費且無期限,只要求用戶每 6 個月通話、發送短訊或使用流量來保持號碼活躍,使用時可搭配有效期 30 日(最長 90 日)的流量套餐。
2.1.6 其他境外實體電話卡
出境時在機場或者便利店購買的預付費 local SIM 卡號碼通常都有使用期限,如用於註冊網站只能一次性使用。此類卡也可從電商平台購買,但線上交易會破壞匿名性,不如線下現金交易可靠。
2.2 Google Voice
Google Voice 是由 Google 推出的 VoIP 服務,在美國和加拿大提供的免費語音通話和短信服務。Google Voice 的最大優勢在於允許用戶以零成本長期保留號碼。
2.2.1 Google Voice 號碼的獲取
改版後的 Google Voice 已經取消了在線直接申請虛擬號碼的做法,要求用戶在申請前必須綁定並驗證一個真實的美國手機號碼,你可以使用上文提到的美國實體電話卡號碼。
除官方渠道外,你可以從電商平台或 Telegram 賣家(比如 Google Voice 靚號,可靠性請自行判斷)那裡付費購買一個 Google Voice 號碼。進行在線交易可能導致號碼被溯源追蹤,相關風險請自行判斷。從淘寶賣家處購買 Google Voice 號碼風險較大,不作推薦。 部分 Google Voice 號碼賣家允許你修改密碼和驗證郵箱後直接使用;部分賣家需要回收其 Gmail 賬號,會要求你將 Google Voice 號碼移轉到自己的賬戶上。
2.2.2 Google Voice 的使用
你需要擁有 Google 賬號(Gmail 賬號)才能登錄 Google Voice 服務。建議在手機 Gmail 客戶端應用註冊新賬號以提高成功率,註冊完成後建議立即添加「驗證郵箱」以確保變更代理 IP 後還能正常登錄。 除網頁版 Google Voice 和谷歌環聊(Hangouts)移動應用外, 你可以使用 Gmail 接收來自 Google Voice 的短信消息。
2.2.3 長期保留 Google Voice 號碼
Google 會回收超過半年未使用的 Google Voice 號碼。為保持號碼活躍,你可以使用 IFTTT 腳本 Keep Google Voice Active 每月自動撥打你的號碼。參見:長久保留申請的 Google Voice 號碼 除 IFTTT 的腳本外,你還可以將自己的 Google Voice 號碼與其他網絡服務相綁定,定期接受商家的通知短信,避免號碼被回收;或者定期撥打電話或發短信。參見:印象筆記|科技 NEWS|活躍 Google Voice,防止被回收的方法:定期撥打電話或發短信出去

2.3 其他虛擬號碼
TextNow 等虛擬號碼服務只提供臨時號碼。 Telegram 每次登錄賬戶都需要接收短信驗證碼,如果你使用臨時性虛擬號碼或者出境時購買的臨時電話卡號碼註冊 Telegram,當號碼過期被回收或者臨時電話卡到期後你若中途登出 Telegram 賬戶,再次登錄時就會因收不到短信驗證碼而無法登錄。
iYouPort 推薦了 4 款適用於 Android 和 iOS 的虛擬號碼應用:Hushed (Android | iOS)、Burner (Android | iOS)、CoverMe (Android | iOS) 和 TextMe Up (Android | iOS)。這類虛擬號碼應用程序的好處是不限制號碼數量,你可以將多個號碼用於不同的活動。虛擬號碼可供一次性使用,如果需要長期保留號碼可以付費訂閱。相類似的應用程序或服務還有:VoxoxPingerFreeTone 等。
2.4 代持號碼
Telegram 頻道 抗爭者網絡安全DIY / HK Protestor Privacy & Health 提供了一種他人代持式使用的不記名電話卡號碼獲取渠道:在 Telegram 上聯絡賣家,通過 FPS/轉數快或者 ATM 現金入帳支付 HK$200 購卡費,之後由賣家代持一張烏克蘭 Vodafone 的 SIM 卡並轉發註冊網站所需的 OTP 短訊。可靠性請自行判斷。

聊聊墙的未来

不管是在网络或者现实生活中,我亲身看到听到越来越多的国人觉得墙的存在是必要的,理由不外乎是如下三点:一是国家发展时期的维稳需求;二是给中国企业足够的发展空间和机会;三是墙内的网络资源已经能满足国内居民的生活需求,外网是不需要的。其中第三条严格来说不是理由,而是被墙多年的结果,再被他们用于说服自己和别人。

最近兔主席在《病人香港——从黑衣人破坏MTR说到斯德哥尔摩综合征》里分析说普通香港市民目前患上了斯德哥尔摩综合征,我倒是觉得有心人也可以好好分析一下为墙说话的人所患的、更严重的斯德哥尔摩综合征。
但我写这篇文章的目的不是批判,毕竟我们都没有预知未来的能力,也没有代替墙内居民判断他们生活是好是坏的权力。我想要讨论的是墙的未来以及其可能造成的影响。以下是个人一些不算太成熟的观点,放到这里来和大家讨论。希望可以通过此文与各位一起学习进步。
我觉得墙的未来有三种可能。
一是在中国共产党执政的整个时期,墙都会存在。
在这种情况下,就算人口红利继续为中国的实体经济发展作出贡献,但整体国民经济也不会有太大的上升空间,毕竟人口基数在那里,出生率又在减少,而死亡率增加。如果悲观估计一大部分人的工作会被机器和AI取代的话,物质需求还有可能因为工作和收入的流失而减少。相比之下,国民的精神文化需求几乎可以看作有无限的上升空间。可是在墙内的创作者,为了满足日新月异的审查监管制度,会丧失培养创造力的机会,不能够持续创造出有新意的精神文化产品。而同时,墙外的精神文化产品所蕴含的价值观和表现方式,不论是社会科学研究成果、文学著作,还是影视作品、媒体资讯,正在不断试错并愈发进步创新,一有机会就能够越来越轻而易举地吸引看够了墙内统一声音的大众,而这些成倍增长的内容,将越来越与既定的社会主义基本价值观背道而驰,变得越来越“不适合”广大国民接受,是有可能造成社会不稳定的,是“必须”被墙阻挡的。在对外贸易方面,墙的存在也给了国际竞争中的对手足够多的理由抨击中国政府对人权的侵犯,在贸易战中吃亏,还不能取得良好的国际声誉,这些问题在全球化趋势下都是政府必须重视的。既然中国起步晚,国门打开得迟,就不得不遵守既定的游戏规则,而不是一来就想大刀阔斧地制定新规则,或者固步自封,完全不做改变,一副暴发户的模样四处用钱撑腰,仅依靠目前庞大的消费者市场做谈判筹码,这不仅换不来真正意义上的国际尊重和自身创造力的提升,也是不能够应运社会和人类发展规律的。
第二个可能是,待时机成熟,政府主动将墙推倒。
拥有全球四分之一的网民人口,墙内的网络生活跟墙外相比就是一个平行世界。随着出国旅游及海外留学经商人数的增多,已经有一定比例的中国居民对墙有了重新的认识,对政府来说,这有好有坏,经常这部分人(特别是在国外待过一段时间的留学生)就走了两个极端。不是变得完全反党觉得中国无望想方设法移民逃离,就是变得无条件爱国并理解共产党的忍辱负重,坚信西方媒体一直欺负祖国母亲,属于唯恐天下不乱之流。这两个极端也出现在身居国内有条件网络翻墙的人群中。这其实是很有意思的现象,说明已经有一部分国民都能够理解墙的存在,并且赞同政府的做法。如果政府选择将墙推倒,这批理解政府的人会起到推波助澜的作用。对于已经成见颇深的那部分人,推倒墙更是一个唯一能够有可能改变他们想法的机会。在国际关系中,推倒墙带来的挑战是特别巨大的,会有很多历史遗留问题需要政府去面对,但也给政府很多机会以更透明的身份被世界及其国民所认识。同时,政府会有机会培育出更广泛更牢固的群众基础,主动配合国家去占领国际舆论阵地(关于这一点,这篇文章讲的更详细一些)从品牌营销的角度来说,这是一个建立国际形象的问题,需要宣传部和外交部整合资源,广纳贤才,建立一个世界一流的创意公关公司协助国家度过难关。这个可能性下的未来,对中国及世界的发展都会产生良性的推动力,有机会能让两种价值体系和政治制度慢慢磨合。虽然这个未来需要等待合适的时机,但它也受时效性的控制,如果一直等下去,可能会有更多人走向跟政府对立的那一面,促成以下要提到的第三个可能的未来。
我觉得墙的第三个未来是,在强大的墙外势力支持下,国民站起来去推倒墙。
这将不会是特别和平的一个结局。虽然从感性上来说,谁都不愿意看到这个未来,它发生的可能性也极小,但不代表没有可能。这里所说的墙外势力可以是西方国家的社会组织或者西方国家政府居心叵测的政治谋划,也可以是有条件翻墙的国民所建立的组织。为什么一定要依靠墙外势力?集权威慑下人民内心的恐惧限制了发起抗争的能动性,而墙的存在就是为了把国民任何抗争的可能性杀死在襁褓之中以求大范围的相对稳定,所以我不看好自发的民粹主义在墙内的发展。但同时,墙的存在导致大部分国民形成了习惯性的二元对立思维,而这部分占人口很大比例的群体也是特别容易被煽动的,特别是在国家经济发展遇到瓶颈,个人生活也不如意的时候。这是最初维稳的原因,也是这个手段最坏的副作用。
我最希望墙能够实现第二个可能,但我特别怕的是,为了不实现第三种可能,政府会极力促成第一种可能。毕竟在有生之年,我最想看到的是中华文化在和平年代,在科技高速发展的新时代,能够吸取世界多元文化的精髓而发扬广大,再次受世界瞩目,并为后世流传。我相信这并不是少数人的梦想,也希望最后这不只是我们这代人的一个梦而已。

Shadowsocks 笔记(节选)

前言

翻越GFW有很多种方法,大浪淘沙,很多的方法都已经消失了,在我能够想起来的过去的,现在的,做一简单的记录:

经典思路

  1. 修改电脑内部的host文件,通过自主指定相关网站的IP地址的方式实现,即避开DNS,简单粗暴,这种方式现在依然存在;
  2. GFW主要攻击手段之一是DNS污染,于是便有了强制指定DNS的方式以避免IP被污染的方法,这种方法经常会结合1使用;
  3. 原本用来作为一种匿名,安全,保密的VPN服务也被发掘出翻墙的潜力,其原理比较简单,选择一个没有被GFW封杀的服务器,通过该服务器将相关网站的流量转发到自己的设备,而设备与VPN服务器之间的通信并不在GFW的屏蔽范围之内,于是便达成了翻墙的目的。VPN最初的目的是用于企业服务,方便员工远程登录企业内网进行操作,主要协议有PPTP、L2TP、IPsec、IKEv2、openVPN等等;
  4. GoAgent,自由门,fqrouter等一系列网络服务;

新思路

  1. Shadowsocks类:主要包括各类Shadowsocks衍生版本,ShadowsocksR,Shadowsocks-libev等,特点是加密了通信过程中的数据以及流量分流;
  2. 内网穿透:比较典型的是ZeroTier,简单解释就是假装自己在国外上网,这么说的主要原因是因为当两台设备同时加入到ZeroTier的服务器之后,两台设备会拥有同一IP段内的IP地址,此时两台电脑相当于处于一个虚拟局域网之中,可以用iPad连接电脑远程运行MATLAB;
  3. V2Ray:V2Ray 是 Project V 下的一个工具。Project V 是一个包含一系列构建特定网络环境工具的项目,而 V2Ray 属于最核心的一个。官方介绍 Project V 提供了单一的内核和多种界面操作方式。内核(V2Ray)用于实际的网络交互、路由等针对网络数据的处理,而外围的用户界面程序提供了方便直接的操作流程。不过从时间上来说,先有 V2Ray才有Project V;
  4. 大杀器:奇怪的名字,似乎是一个有趣的人开发的,个人没有关注过。

Shadowsocks

一些历史事件

2012年4月22日,V2EX用户clowwindy分享了一个自己自用一年多的翻墙工具:Shadowsocks


 相对于以前的VPN技术,SS的一个大特点就是网络分流技术,配置文件中的网站走代理通道,配置文件之外的地址全部走直连通道,相较于以前所有的流量只能走代理通道,不需要代理的网站上网速度会因为流量需要通过远程服务器转发至设备而受到影响,极大地提升了上网体验。
之后的SS的发展比较顺利,各个平台的客户端也如雨后春笋逐渐建立起来,最初的SS客户端都内置了节点信息,虽然速度略慢,但丰俭由人,普通用户安装后无需配置即可食用,有需求有技术的群体也可以使用自己的服务器。唯一遗憾的是当年的iOS上并没有网络通道的权限,要么使用ss浏览器有限翻墙,要么越狱安装客户端实现 SS 代理。


风云突变

2015年8月20日,clowwindy在GitHub发出如下一段话:
Two days ago the police came to me and wanted me to stop working on this. Today they asked me to delete all the code from GitHub. I have no choice but to obey.
I hope one day I’ll live in a country where I have freedom to write any code I like without fearing. I believe you guys will make great stuff with Network Extensions.
Cheers!
当晚,clowwindy把他所维护的几个shadowsocks实现的代码仓库内的Issue面板全部关闭,所有帮助信息全部删除,所有的描述都改成了Something happened。另外,他还清空了该组织的membership,或者将所有成员全部转入隐私状态,不对外公开。
2015年8月21日传出clowwindy被请去喝茶的消息,他在 shadowsocks-windows 的 #305 issue 下回复道
I was invited for some tea yesterday. I won’t be able to continue developing this project.
同时开启了 twitter 的隐私保护,除先前关注者外无法查看动态; 当晚clowwindy 发布了 thanks. 后的推文,证明人没事。 

 至此,SS原作者退出。


一些话

后续工作并未停止,前前后后也着实发生了很多的事情,前因后果在此不计。ShadowsocksR的作者breakwa11是一个极富争议性的人,她接手了后续SS的开发工作,却违反开源协议封闭源代码,同时发布的过程中暗示自己是原作者,在shadosocks-windows/Issue108中clowwindy做出了一些回应:
那是自然的咯。这边加了什么功能,它(SSR)马上扒过去合并了。它那边加了什么却不会贡献出来给其他人用,久而久之,不就是它那边功能更多了吗。
一直以来我什么都没说是因为我对他还有点希望,所以得给他一点面子不是。一开始我还只是纳闷他为什么不发 pull request,过了一段时间我才明白,这个世界上也有这一类的人。不尊重 GPL 就算了,把作者名字换成自己的,还在主页上加上官方的字样。为什么我们这边反而不说官方呢?因为我希望这个项目是没有官方的,人人都是贡献者。想不到这个社会人人都围着官转,人人都巴不得当官 。
既然他没有尊重别人劳动成果的意愿,那他那些不开源的理由想必也只是借口。说因为加了一些试验性功能会不兼容所以暂不开源。他弄了一个混淆 TCP 协议头功能,在界面上标注提升安全性,吸引用户打开,然后安装他自己的不兼容服务端。然而我分析了一下之后发现这个功能的设计就是想当然,用得多了以后反而会增加特征。如果你真有什么试验性功能,不是更应该开放出来让所有人帮你分析么,大家一起讨论么?在加密算法领域,只有经过足够多人和机构的审视的算法,才能视作是安全的,闭门造出来的怎么能用。。
当然啦,大部分用户才不会管这些,他们不会分析你是不是真的安全,也不会做道德判断,只要他们觉得好用就行。所以可以看到,这种环境下开源其实并没有什么优势,只不过为一些人抄袭提供了便利。这种环境下最后留下来的都是这些人。
我一直想象的那种大家一起来维护一个项目的景象始终没有出现,也没有出现的迹象。维护这个项目的过程中,遇到 @chenshaoju 这样主动分享的同学并不多。很多来汇报问题的人是以一种小白求大大解决问题,解决完就走人的方式来的,然而既不愿提供足够的信息,也不愿写一些自己尝试的过程供后人参考。互帮互助的气氛就是搞不起来。对比下国外的社区差好远。
最适合这个民族的其实是一群小白围着大大转,大大通过小白的夸奖获得自我满足,然后小白的吃喝拉撒都包给大大解决的模式。通过这个项目我感觉我已经彻底认识到这个民族的前面为什么会有一堵墙了。没有墙哪来的大大。所以到处都是什么附件回帖可见,等级多少用户组可见,一个论坛一个大大供小白跪舔,不需要政府造墙,网民也会自发造墙。这尼玛连做个翻墙软件都要造墙,真是令人叹为观止。这是一个造了几千年墙的保守的农耕民族,缺乏对别人的基本尊重,不愿意分享,喜欢遮遮掩掩,喜欢小圈子抱团,大概这些传统是改不掉了吧。
现在维护这些项目已经越来越让我感到无趣。我还是努力工作,好好养家,早日肉翻吧。
值得反思。


SSR之死

紧接着breakwa11的遭遇不论真假,同样令人胆寒
2017年7月19日,breakwa11在Telegram频道ShadowsocksR news里转发了深圳市启用SS协议检测结果,被大量用户转发,引发恐慌。
2017年7月27日,breakwa11遭到自称 "ESU.TV" 的不明身份人士人身攻击,对方宣称如果不停止开发并阻止用户讨论此事件将发布更多包含个人隐私的资料,随后breakwa11表示遭到对方人肉搜索并公开的个人资料属于完全无关人士,是自己当时随便填写的信息,为了防止对方继续伤害无关人士,breakwa11删除GitHub上的所有代码、解散相关交流群组,停止ShadowsocksR项目。
这次的人肉事件,让我严重怀疑我自己做 SSR 是不是对的,首先不管资料对不对,从行为上看,就是有人希望我死,希望这个项目死,恨一个人能恨到如此程度。我知道我很做作,因此得罪了很多人,尤其最近公开 SS 可被检测的问题,更是让很多人义愤填膺,非要干掉我不可。尽管从我的角度看,我只是希望通过引起关注然后促进 SS 那边进行修改,这并不是希望 SS 死掉的意思,我每次提出的问题之后不是都得到了改进了吗,包括 OTA 和 AEAD,AEAD 我也是有参与设计的,你们可以问 Syrone Wong,以及 NoisyFox 证实,而且 ss-windows 有一部分也是我参与修改的。但如今,人肉的资料我也稍微看了一下,真是太令人心寒,连对方的支付宝流水都拉出来了,这样真的好吗?我并不希望因为我自己的问题而害了另一个人。我期望和那些反对我的人来一笔交易,我可以以停止开发 SSR 作为交换,删除项目及相关的东西,以后不再出现,SSR 群从此解散,账号注销,删除代码。对于我来说,这个项目不过是我用来证实自己的想法的一个东西,可有可无,制作也只是兴趣,扔掉也没有什么可惜的,反正替代品非常多,根本就不缺我这一个。你们老说我圈粉,你们真想太多了,真没这个必要。如果可以以这个换取另一人免受网络暴力,我也觉得这是值得的。相反的,如果人肉的结果仍然公开了,那就是我的行为已经救不了了,那我就可以继续开发 SSR。不过也不会太久,估计最多只多坚持一年到我毕业之前。谢谢这两年来大家的支持,这次应该是真正的和大家再见,看结果吧,今天晚上 12 点以 SSR 群解散作为标志,如果解散了那就正式和大家说一声再见
至此,SSR作者退出。


传承

得益于 clowwindy 最初开源 SS 的决定,大量的 fork 使得 SS 依然在更新之中,从 GitHub 现有结果来看,各个平台(甚至是路由器)的SS仍然不断的在更新,在提交 Issue,也有大功能更新,每一滴微小的力量都推动着项目的前进,只是前途在何处仍然是未知数。


变数


收紧的手

2017年7月底,中国区App Store多款VPN相关应用在无任何说明与通知的情况下,突然集体被下架,与正常下架流程不同的是,过去苹果官方下架的应用一般可以在用户的已购项目中仍然可以下载,这是对已经购买了该应用的用户权益的保障,而这次的下架直接封杀了国行App Store所有渠道的下载,性质显然不同于以往,苹果给出的回应是:
我们已经收到要求,在中国移除一些不符合规范的 VPN App。这些 App 在其他市场的运营则不受影响
此次下架中所谓的规范即指2017年1月工业和信息化部印发的《关于清理规范互联网网络接入服务市场的通知》,《通知》中明确表明:
规范的对象是未经电信主管部门批准,无国际通信业务经营资质的企业或个人,租用国际专线或VPN,私自开展跨境的电信业务经营活动。外贸企业、跨国企业因办公自用等原因,需要通过专线等方式跨境联网时,可以向依法设置国际通信出入口局的电信业务经营者租用,《通知》的相关规定不会对其正常运转造成影响。
受此影响,大量的用户只能与开发者联系,不少开发者只能通过 TestFlight 对用户分发更新,但是由于 TestFlight 分发的app 90天后就会失效,开发者一旦弃更,用户便无法再使用该软件,此种风险也使得不少用户注册了外区的Apple ID 并重新购买应用。由于工信部要求备案,且个人无备案资格,基本上表明了此次被下架的应用无法再上架,此次的风波也受到了国际社会的广泛关注与批评,唯一算作欣慰的是,苹果在下架软件的同时,倒逼政府出台了相应的明确细则。
2017年10月,伴随着十九大的开幕,大量线路被封杀,尤其以SSR为甚,各大机场与 tg 群一片哀嚎,所幸大会闭幕后不少IP被解封,不清楚具体的比例。
2018年1月,以及接下来的两会期间,执行了更大规模的IP封杀,涉及范围更广,基于各种算法的翻墙方法均有涉及,SS的Issue中有人反映刚刚搭好十几分钟即被封杀。
2018年9月30日,公安部下发通知
《公安机关互联网安全监督检查规定》已经2018年9月5日公安部部长办公会议通过,现予发布,自2018年11月1日起施行。


时间线


2019/04/25

2019年4月25日,河南省新密市人民检察院发出公告:
2019年3月25日,新密市人民检察院依法以提供侵入计算机系统工具罪对孙东洋提起公诉,案件正在进一步办理当中。
孙东洋即逗比根据地网站主创办人,长期以来,提供了各类 SS 相关知识和安装使用教程,并编写与维护了大量的一键脚本,2018年11月失联。


2019/05/14

SS 一键安装脚本先驱秋水逸冰在twitter上发推:
斟酌再三,还是觉得已经没有继续坚持下去的必要了。 不如就此告别,后会有期。 https://teddysun.com/548.html 
长期关注无线路由器相关固件的恩山论坛上,lean,hiboy,荒野无灯,abccba94等多名重要维护者宣布退出。


2019/09/16 - 2019/09/xx

国家网络安全宣传周,大量的机场出现大规模节点被封的情况,个别机场的ip甚至全数被封。推特上有人反应甚至出现平常仅使用ssh进行网络学习的服务器被封的情况。


小心翼翼

网传的一份联通客户端对于各个协议的识别情况:
软件和协议联通检测类型访问网址ShadowsocksTCP 业务显示服务器IPSS + http_simple(80端口)上网 (Web方式get)显示混淆域名SSRTCP 业务显示服务器IPSSR + http_simple上网 (Web方式get)显示混淆域名SSR + TLS(443)* 安全类网页浏览 (HTTPS VPN) 流量
* HTTPS 链接显示混淆域名SSR + TLS(995)安全协议的收邮件流量显示IPSSR + TLS(非443)* 网络连接(网页)
* HTTPS 链接显示混淆域名OpenConnectUDP 业务显示服务器IPIPSec VPNUDP 业务显示服务器IPV2RayTCP 业务显示服务器IPV2Ray + TLSHTTPS 网络连接显示证书域名nghttpx + TLSHTTPS 网络连接显示证书域名kcptunUDP 业务显示服务器IP
注:由于这份资料真假未知,仅做分享,请勿有不必要的恐慌。


新生代

所有的主流平台中,iOS 是比较特殊的,因为其权限管理相当的严格,直到 iOS 9 时代才对开发者开放VPN 相关的 Network Extension 权限,在此之前,iOS 用户只能在越狱环境下才能获得相对完整的 SS 体验,因此 SS 相关软件在 iOS 上不温不火,直到 Surge 的出现。


Surge --- 破局者

Surge,虽然出生于 iOS 平台,但其思路打破了之前 SS 圈内的桎梏,再次促进了 SS 生态的发展。
最初的 Surge 定位于网络调试工具,作者本人写了一个 SS module 实现了 SS,也许作者本人的想法并不是翻墙,所以该 module 从开始就是一个黑箱,至今也没有支持V2Ray等新型协议。无心栽柳柳成荫,Surge 可以在 iOS 端实现全局代理,并且自开始稳定性就非常好,68的售价并没有挡住人们热情的购买力,但此时的 Surge 仍然是相对小众的。
Surge 的模式非常具有开创性:
  1. 以文本 config 设置软件,非常的 linux;
  2. 因为 Surge 定位为网络调试工具,因为配置文件中可以单独设置面对某网址或某IP时,网络对其的响应,主要包含 proxy,direct,reject 3种核心模式,同时,Surge 可以观测到网络的连接情况,实现重发等操作,实现抓包。于是,一个网络调试软件,得益于优异的思路,经由网友们的一番探索,使其可以指定代理地址,屏蔽广告,解析视频地址,抓取网络流量,堪称完美。



题外话

Surge 固然好,但是其开发者 Yachen Liu 却着实是一个富有争议的人,整理的 Surge 时间线如下:
  • 2015年10月26日 Surge 以68元的售价上架 App Store;
  • 2015年11月29日 Yachen Liu 自称被喝茶(注:无法被证实);
  • 2015 年 12 月 4 日 ,Surge App Store 全区下架,之后又以648元的高价短期上线,作者解释为方便已购买用户更新;
  • 2016 年 3 月,Surge iOS 2.0 版本发布,承诺648元永不降价,同时启用反盗版策略,180天内仅能激活十台设备;
  • 2016 年 8 月,Surge Mac 2.0 版本发布,iOS 版本价格调整为 328元,作者解释648元为 Mac 与iOS双版本价格,价格调整是售卖策略发生变化;
  • 2017年5月,Surge限时8折;
  • 2018 年 1 月,iOS Surge 3发布,根据老用户购买时间提供免费升级和优惠升级,同时提升反盗版策略,仅能激活3台设备;
  • 2018年10月,作者发推表示
计划给 Surge iOS 加一个新功能,可以选择将自己的授权与 iCloud 账号绑定,绑定后最多可激活 6 个设备,但是仅可以在自己的 iCloud 登录的设备上使用。
作者确实是网络技术大牛,截至目前,Surge 仍然是iOS端最优秀的 SS 客户端,但是其营销策略极富争议性,喝茶事件至今无法证实,且之后全区下架客户端也毫无道理,之后长期上架 App Store 也不能很好的自圆其说,因此被称为喝茶营销。
作者对高价的解释是 Surge 是面向国际的网络调试设备,主要竞品是老牌应用 Charles,但是这几年的发展下来,调试功能这种核心并没有实质的长进,反盗版能力,UI设计倒是提升不少,口嫌体直般升级了 SS 的最新版本,却死活不肯添加 V2ray 等新协议,面向国际的软件,核心用户却是国内用户,可以说是相当的傲娇。


Shadowrocket --- 穿云箭

Surge 下架上架来回折腾的时候,不少开发者也看到了机遇,Shadowrocket 便是当时的 Surge 追随者,最初上架性能虽然不佳,但是6元的售价并且兼容Surge规则还是吸引了不少人下载,一时间风头无两,被称为小火箭。
小火箭的作者 Guangming Li 似乎是个奶爸,最初小火箭比较简陋,随着快速的迭代更新,小火箭功能逐渐完善起来,稳定性也提高了不少,在摆脱 Surge 的同时,小火箭也开发出了不少让人眼前一亮的新功能。
与Surge不同,小火箭的初衷就是为了翻墙,所以作者直接就内置了各种翻墙协议,通过UI界面非常容易添加和修改,作者也针对国内的环境开发出了场景模式,按需求连接,服务器订阅等模式,同时作者在Telegram上创建了群组,用户之间的交流以及开发者的反馈速度很快。

shadowrocket

现在的小火箭可以说已经尽善尽美了,作者更新的频率大大降低,但是仅仅18元的售价显得非常的亲民。


Others

iOS上还有A.BIG.T,Potatso等VPN软件,16年,17年与小火箭战的难舍难分,无奈后劲不足,现在大概是明日黄花了。
Quantumult 是新近崛起的一款代理软件,$4.99 的售价可以实现 Surge 的大部分功能,支持多种协议,相较于小火箭又多出了抓包功能,测试规则更方便,同时,Quantumult 扩展了规则中的屏蔽性能,使得屏蔽广告更有针对性。
(2019/09)Quantumult 的更新已经陷入停滞,目前作者似乎在 Testflight 上开发了全新的 Quantumult X,基本特性与 Surge 4 相似。

Quantumult


Android

Android 理应有更多的选择,然而事实却完全相反,在 Android 上实现分流代理的软件反倒非常的稀少,且质量良莠不齐。


Postern

Postern是在 Android 上最接近于 Surge 模式的软件,其可以兼容 Surge 规则,直接将 Surge 的配置文件导入即可使用,整体功能也算中规中矩,但是 Postern 的 UI 相对简陋,作者对此的解释是:
很多Postern用户抱怨软件UI的问题,确实UI比较简陋。主要是Postern是从Linux下一堆C代码演化过来的,刚开始并没有任何UI只有命令行,开发者只求运行稳定快速。我也希望能强化UI,不过无奈主业实在太忙,最近更是几乎没有时间维护。仅就今后尽量改进吧。
截止目前(2019/03/12),Postern Android 版仍未支持混淆,SSR 之后兴起的新型加密格式也未获得支持,如果有相关的需求可以尝试,对于一般人来说也许 shadowsocks 更为合适些。Postern 可以在 Google Play Store 获取,同时 Postern 的 Github 中包含了说明手册,从 Github 的文件来看,作者同时也放出了 Mac 版的安装包,在 iOS 美区也可以购买 iOS 版。

postern


总结

总体来看,得益于 Surge 的开创性思路,iOS 端的代理软件一度诸侯林立,逐鹿中原,相关软件的讨论也是层出不穷,是一段相当甜美的蜜月期。随着政策的逐渐收紧,潮水退去,国区内基本上已经没有太多的选择,蛰伏至外区的软件们随着各类原因或离开或留下,如今天下大势已定,或许很难比较各自的用户数量,但几大软件已经有了稳定的核心用户群,Surge 还在稳扎稳打走着自己的路,Shadowrocket 与 Quantumult 的开发已经陷入停滞,新入门的代理软件仍需在夹缝中找寻自己的位置。
喧闹过后,一片白茫茫大地。


后记

并未经历过墙垒砌的时间段,那段时间的我并不足以对世界产生认知,当高墙矗立,互联网缩小成了局域网,我慢慢才明白所有的一切都陷入了疯狂。得益于各个开发者孜孜不倦的努力与付出,像我这种普通人才真正接触到了互联网,感叹于各个网站,各个博客之间的信息分散,内容相互交叉重叠,大多数人在实现目标后也就弃之而去,再加上这些年自己也尝试了不少的软件与上网方法,一点一点拼凑了这篇文章,并未有他想,只是希望作为一个小传留存下来,随着时间的推移,这篇文章迟早会成为历史的尘埃。
这篇文章洋洋洒洒写了很多,圄于个人知识,能力所限,难免有所遗漏与错误,还望大家海涵。