头部背景图片
senrenbankaの部落格 |
senrenbankaの部落格 |

制作一个不轻量的hexo主题:cube

2017-08-15

前言

之前自己用Laravel写了个博客, 用了一段时间果断弃之, 又用回了原来的Hexo, 上网找了下主题, 没找到自己想要的, 于是决定自己写一款主题(在写主题的过程倒是找到了很多自己觉得不错的2333), 这篇文章只是用来记录一下最近这段时间写这个主题的过程, 中间存在着很多的问题, 主题目前还没有正式完成, 最近实习 + 毕设搞得比较颓, 9月份之后会逐步完善修复。

hexo-theme-cube
cube-generator
示例网站

其中cube-generator是主题的生成器, 通过运行对应的gulp命令能够重新生成主题cube

构建主题

看了一些github上的主题项目, 很多都是ES5 + jQuery的实现方式, 于是自己有了一个想法,用ES6来写这个主题样式, 最终代码是要转化为ES5的, 那么就需要babel进行转换了, 又因为写样式决定采用SaSS, 所以就决定用gulp进行自动化构建, 所以最终的决定是:

  • gulp中利用browserify + babelify对前端代码进行ES6到ES5的转换, Babel转换的规则写在babelify上面, js代码的入口规定为source/js/app.js, app.jsimport对应功能的js代码, gulp进行bundle script的生成代码如下:
const b = browserify({
    cache: {},
       packageCache: {},
       entries: path.join('./source/js/app.js'),
       debug: true
})

// 配置babel转换规则
b.transform(babelify, {
       presets: ['env', 'es2015', 'stage-2'],
       plugins: [['transform-runtime', {
           'polyfill': true,
           'regenerator': true
       }]]
})

gulp.task('buildScript', bundle)

// b.on('update', bundle)

// bundle生成script.js并且放在cube/source/js/script.js上面
function bundle() {
       return b.bundle()
           .on('error', err => console.log(err))
           .pipe(source('script.js'))
           .pipe(buffer())
           .pipe(sourcemaps.init({ loadMaps: true }))
           .pipe(uglify())
           .pipe(sourcemaps.write('./'))
           .pipe(gulp.dest(path.join(Path.theme, Path.source, '/js')))
}

JS的部分如下所示:

JS模块

博客搬迁

2017-03-04

xampp + phpstorm的简单配置

2017-01-11

前期准备

安装以下东东:

  1. XAMPP
  2. PhpStorm(如果有学生邮箱,请到jetbrains官网下载正版,可以免费使用正版,如果没有,百度下载,并下载注册机)

配置XAMPP

如下图,安装了apache之后,可以在httpd.conf文件配置监听端口:

打开httpd.conf

修改httpd.conf

Actions那里可以点击启动或者停止服务,这样的话用XAMPP无脑搭建环境的方式就成功了。

某crackme破解

2016-11-07

0x00: 前言

前两天看雪CTF大赛开始,然而对于看雪的CM题目完全是一脸懵逼,于是决定进行CM的训练,废话不多说,目标是这家伙:
crackme1

居然还用了diablo的头像hhh,运行界面:
crackme2

0x01: 脱壳

简单说明下,上下两个框都可以输入,如果输入有误,第二个框的值会变成”register unvalid”之类的东西,首先用PEID查下壳:
查壳
yoda’s crypter的壳,那么就来脱掉它吧~

OD载入程序进行异常计数,然后断在最后一次异常中,此时查看堆栈得知SEH的处理Handle0040C70C中,于是跳到异常处理函数中,下面是异常处理函数:

0040C70C    55              push ebp
0040C70D    8BEC            mov ebp,esp
0040C70F    57              push edi
0040C710    8B45 10         mov eax,dword ptr ss:[ebp+0x10]
0040C713    8BB8 C4000000   mov edi,dword ptr ds:[eax+0xC4]
0040C719    FF37            push dword ptr ds:[edi]
0040C71B    33FF            xor edi,edi
0040C71D    64:8F07         pop dword ptr fs:[edi]
0040C720    8380 C4000000 0>add dword ptr ds:[eax+0xC4],0x8
0040C727    8BB8 A4000000   mov edi,dword ptr ds:[eax+0xA4]
0040C72D    C1C7 07         rol edi,0x7
0040C730    89B8 B8000000   mov dword ptr ds:[eax+0xB8],edi
0040C736    B8 00000000     mov eax,0x0
0040C73B    5F              pop edi    这里edi的值为0x40A950,为跳转到OEP的关键
0040C73C    C9              leave
0040C73D    C3              retn

跳到edi指向的地址,然后单步跟踪,很快就找到了OEP了,OEP代码如下:

00401000    6A 00           push 0x0
00401002    E8 71020000     call d2k2_crk.00401278                   ; jmp 到 kernel32.GetModuleHandleA
00401007    A3 40314000     mov dword ptr ds:[0x403140],eax
0040100C    6A 00           push 0x0
0040100E    68 28104000     push d2k2_crk.00401028
00401013    6A 00           push 0x0
00401015    6A 01           push 0x1
00401017    FF35 40314000   push dword ptr ds:[0x403140]
0040101D    E8 62020000     call d2k2_crk.00401284                   ; jmp 到 user32.DialogBoxParamA
00401022    50              push eax
00401023    E8 4A020000     call d2k2_crk.00401272                   ; jmp 到 kernel32.ExitProcess
00401028    55              push ebp
00401029    8BEC            mov ebp,esp
0040102B    817D 0C 1101000>cmp dword ptr ss:[ebp+0xC],0x111

明显的TASM/MASM32程序,于是脱壳,再次查壳:
crackme-查壳(已脱壳)

记一次小软件脱壳

2016-10-31

目标: 跑跑排行榜1.9.exe
界面: 跑跑排行榜-界面

首先用PEID查壳,得知是tELock v0.98的壳:
跑跑排行榜-查壳

首先,愉快地打开OD:
跑跑排行榜-OD初始界面

直接F9,到第一次异常发生的地方:
跑跑排行榜-第一次F9

javascript函数化构造器

2016-06-07

javascript是基于原型继承而不是基于类继承的(至少在ES6之前是这样的。。。),javascript对于继承这方面很模糊,它提供了原型的继承方式,却又提供了”伪类”的写法,比如下面这样:

var Father = function() {
    this.nickname = '粑粑';
    this.say = function() {
        return '我是老爸';
    };
    this.statu = function() {
        return '我的地位是第一层';
    }
}
//声明一个伪类,通过prototype继承父类
var Children = function() {
}
Children.prototype = new Father();
Children.prototype.nickname = '儿子';
Children.prototype.say = function() {
    return '我是儿子';
}
Children.prototype.statu = function() {
    return '我的地位是第三层';
}

var child = new Children();
child.nickname                //儿子
child.say()                    //我是儿子
child.statu()                //我的地位是第三层

尽管我们用’伪类’的方式完成了继承,但是我们并不是用抽象的方式描述这个继承关系的,而是用了具体的,公开的方式去写继承,这种方式对于代码的安全性来说是不友好的,容易被攻击者篡改,代码维护方面也有问题,而且,使用实例必须要通过new去执行,如果没有new,结果会完全不同,变成了调用一个函数,意思就完全不同了。

所以,根据以上的情况,一个解决方案是我们不要用new这种模棱两可的方式,而是用函数化构造器,那函数化构造器又是怎么写的?这里给出一个通用的代码格式:

var constructor = function(spec,my) {
    var that = {};   //这里可用任何能产生对象的方法,包括Ojbect.create(),new Object()之类的方法
    //my作为一个共享的容器,自上而下传入,自下而上构造
    my =  my || {};
    my.public  = value;
    //spec作为一些配置的信息,里面包含了构造的对象需要的属性或者方法
    that.example = spec.example;
    //然后就是对象自己构造属性或方法了
    that.someProperty = function() {
        ....
    }
    //或者,为了更安全的着想,我们分两步构造
    //这样是为了不破坏我们原来构造的方法或者属性
    var someProperty = function() {
        ....
    }
    this.someProperty = someProperty;
    return that;
}

这种方式关键有利于属性方法的隐藏,有利于安全,并且可以用函数式的方法去写。

《AngularJS深度剖析与最佳实践》学习笔记(二)

2016-05-16

controller as的学习


在之前这本书给出的代码中,有很多次看到这样的代码:

controller:controller as vm
.....
angular.module('MyApp').controller('demoController',function() {
    var vm = this;
    //这里配置vm的各种属性;
    vm.title = 'Angular';
    ....
});

事实上,这是Angular1.2版本后推出的语法糖,我们平常写controller,一般是通过$scope来绑定变量,然后在模板中调用$scope的属性去渲染模板;类似的代码如下:

angular.module('MyApp').controller('demoController',function($scope) {
    $scope.title = 'Angular';
    //各种配置数据逻辑
    ....
});

《AngularJS深度剖析与最佳实践》学习笔记(一)

2016-05-12

看了三章之后才想到我应该写一些笔记来加深印象和理解,所以写的顺序会有点乱,到时再进行重新排版

指令:

Angular2.0将指令分为组件型指令装饰器型指令,虽然是2.0的标准,但是这个分法同样适用于Angular1.0:

组件型指令:

组件型指令的一般格式如下:

angular.module('myApp').directive('conponent',function(){
      return {
        restrict: "EA",
        scope: {
            count:1
        },
        templateUrl: 'partials/conponent.html',
        controller: function($scope){
            //相关业务逻辑操作
        }
        ....
    }
});

组件型指令的特点可以概括为: 高内聚低耦合
这种指令通常作为页面或者模板的一个组件,有自己的独立作用域,形成自己的业务逻辑,与外部模板页面的耦合性低,即使去掉这个指令,也不会对全局有影响,这样带来的好处是:代码的可维护性和复用性;

新手玩云服务器

2016-04-08

在腾讯云平台进行学生认证后,每个月都有64块的优惠券到账,最低配的云主机只需要65块,换言之,一个月只要1块钱就能租到云主机,还是挺爽的,今天花了点时间配置云服务器(我不会说我是带着电脑上课并且在玩这个的Q^Q),总结一下配置的基本步骤吧(其实很多我也不是很懂)

0X00:

连接到云服务器:

我的电脑系统是win7,而且买的是CentOS的,所以这里只说本地windows下怎么配置CentOS云服务器:

腾讯官方文档给出的是用SecureCRT、putty来登录,个人觉得xshell可以完爆这两货。。。
xshell下载地址

打开xshell,新建服务器连接,如下图所示:
建立连接1

名称随你喜欢,填个有意义又简单的最好~
主机填写云主机的公网IP
端口号默认为22
说明随你喜欢,跟名称的说法一样~

HEXO解决Google字库链接缓慢问题

2016-03-09

就在刚刚,我发现我的博客上不去了,hexo s开启本地端口也上不去,后来排查了下,是fonts.googleapis的锅QAQ

开启开发者工具监听network,访问博客可以看到一条失败的记录,记录指向的url如下:

http://fonts.googleapis.com/css?family=Lato:300,400,700,400italic&subset=latin,latin-ext
avatar AONOSORA 今生今世轮回尽, 来世愿为幻想乡