WordPress删除链接中的category

0x00.Remove Category Base插件

无需设置,安装完即可食用

0x01.代码实现

将下列代码复制至主题→编辑→functions.php

add_action( 'load-themes.php',  'no_category_base_refresh_rules');
add_action('created_category', 'no_category_base_refresh_rules');
add_action('edited_category', 'no_category_base_refresh_rules');
add_action('delete_category', 'no_category_base_refresh_rules');
function no_category_base_refresh_rules() {
    global $wp_rewrite;
    $wp_rewrite -> flush_rules();
}
// register_deactivation_hook(__FILE__, 'no_category_base_deactivate');
// function no_category_base_deactivate() {
//  remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
//  // We don't want to insert our custom rules again
//  no_category_base_refresh_rules();
// }
// Remove category base
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
    global $wp_rewrite, $wp_version;
    if (version_compare($wp_version, '3.4', '<')) {
        // For pre-3.4 support
        $wp_rewrite -> extra_permastructs['category'][0] = '%category%';
    } else {
        $wp_rewrite -> extra_permastructs['category']['struct'] = '%category%';
    }
}
// Add our custom category rewrite rules
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
    //var_dump($category_rewrite); // For Debugging
    $category_rewrite = array();
    $categories = get_categories(array('hide_empty' => false));
    foreach ($categories as $category) {
        $category_nicename = $category -> slug;
        if ($category -> parent == $category -> cat_ID)// recursive recursion
            $category -> parent = 0;
        elseif ($category -> parent != 0)
            $category_nicename = get_category_parents($category -> parent, false, '/', true) . $category_nicename;
        $category_rewrite['(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $category_rewrite['(' . $category_nicename . ')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $category_rewrite['(' . $category_nicename . ')/?$'] = 'index.php?category_name=$matches[1]';
    }
    // Redirect support from Old Category Base
    global $wp_rewrite;
    $old_category_base = get_option('category_base') ? get_option('category_base') : 'category';
    $old_category_base = trim($old_category_base, '/');
    $category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';
    //var_dump($category_rewrite); // For Debugging
    return $category_rewrite;
}
// Add 'category_redirect' query variable
add_filter('query_vars', 'no_category_base_query_vars');
function no_category_base_query_vars($public_query_vars) {
    $public_query_vars[] = 'category_redirect';
    return $public_query_vars;
}
// Redirect if 'category_redirect' is set
add_filter('request', 'no_category_base_request');
function no_category_base_request($query_vars) {
    //print_r($query_vars); // For Debugging
    if (isset($query_vars['category_redirect'])) {
        $catlink = trailingslashit(get_option('home')) . user_trailingslashit($query_vars['category_redirect'], 'category');
        status_header(301);
        header("Location: $catlink");
        exit();
    }
    return $query_vars;
}

 

手机数据提取简介

0x00.SIM卡数据提取

如今,我们对SIM卡取证的方法通常用的方法有两种。第一种方法是利用专门的读卡设备对SIM卡的数据进行提取。在这种方法中,只要读卡器只要符合ETSI(欧洲电信标准协会)TS31.101和TS51.011两种标准指令集就可以对SIM卡中的数据进行提取。此外另一种方法就是通过指令对SIM种数据进行直接提取。

一般情况来说Android手机的SIM卡使用记录一般保存在data分区的data\com.android.providers.telephony\databases\telephony.db文件中,该文件类型为SQLite数据库。数据库中的表“sim_info”会记录使用过的SIM卡的ICCID、手机号码等信息。


0x01.AT指令集

AT指令集是从TE(终端设备,Terminal Equipment)或者DTE(数据终端设备,Data Terminal Equipment)向TA (终端适配器,Terminal Adapter)或者DCTE (数据电路终端设备,Data Circuit Terminal Equipment)发送的。

AT指令集最早是由”贺氏“微系统公司开发,初衷是用来操作调制解调器的,随后专门开发了一套手机专用的AT指令集。在这套专门为手机开发的版本中,开发者可以通过指令获取手机的产品型号、手机生产商、手机操作系统版本、IMEI、IMS、电话簿、电话记录短消息记录等信息数据。

Nokia、Ericsson、Motorala和HP这些被AT指令集覆盖的移动设备生产厂商共同为GSM 研发了一套AT指令,该套专门定制的AT指令集被用来控制手机的GSM模块。其中就包括对SMS(short message service,短信息服务)的控制。后来的GPRS模块,3G模块、4G模块均采用AT命令集来进行控制。

功能 AT指令 详细说明
厂商认证 AT+CGMI 获得厂商的标识
模式认证 AT+CGMM 查询支持评断
修订认证 AT+CGMR 查询软件版本
生产序号 AT+CGSN 查询IMEI序列号
TE设置 AT+CSCS 选择支持网络
查询IMSI AT+CIMI 查询国际移动电话支持认证
卡的认证 AT+CCID 查询SIM卡的序列号
功能列表 AT+GCAP 查询可供使用的功能列表
重复操作 A/ 重复最后一次操作

更多AT指令集请参阅:https://blog.csdn.net/u012686462/article/details/53199382


0x02.JTAG提取技术

JTAG主要用于高级器件的芯片(如高通高端芯片)内部测试,该类芯片均支持JTAG协议。标准协议下的JTAG接口有:TCK、 TDI、TDO、TMS,分别为时钟、数据的输入和输出线、模式选择。 针对高通芯片的测试接口且可以在主板上焊线并且通过JTAG指令,就可以直接控制CPU 强制读取 nandflash/eMMC。

绝大多数CDMA定制机器只具有充电接口而不具有数据传输接口,这些定制的机器大多采用高通的低端CPU。针对这类机器,可以通过使用JTAG技术探查主板,同时依据具体CPU型号采用专门方法进行数据提取,从而获得手机中数据的镜像。

JTAG取证技术的原理是将安卓手机背后的 JTAG触点连接到专门设备,相关人员使用手机向CPU发送指令,再通过JTAG命指令反向控制 CPU,将 FLASH所有数据发给 CPU,我们再从CPU把 FLASH芯片的数据取走。

JATG取证的优点是不论手机是否root,是否可以安装第三方recovery,USB调试模式是否打开,操作系统版本是多少都不重要,使用该方法都可以直接提取到FLASH芯片数据镜像。

微信6.6.6 EnMicroMsg.db提取

0x00.ADB 提取MicroMsg文件夹

挂载系统分区并定位至/data/data/com.tencent.mm/MicroMsg

使用ADB指令将MicroMsg以沙盒方式提取至本地:

adb pull /data/data/com.tencent.mm/MicroMsg  X:\

0x01.获取EnMicroMsg.db密码

在MicroMsg文件夹下找到EnMicroMsg.db数据库文件,该文件是加密文件,无法直接打开。

经过逆向分析得出,该数据库密码是一字符串的md5值,具体算法如下:

密码=md5(IMEI+uin),其中uin与登陆的微信账号对应。

在MicroMsg文件夹下找到system_config_prefs.xml,其中name=default_uin的整数值便是uin值。

在手机拨号盘中输入*#06#获取手机对应IMEI码,由此可得:

IMEI=354XXX77972179

Uin= -154XXX3212

密码计算公式为该字符串的32位md5码的前7位。

md5(354XXX77972179-154XXX3212,32)= 4ffcbXXXXX71a722XXXXXeb0a3fa

计算完毕后使用由SQLCipher 2.1版本编译运行查看器(经尝试,只有2.1版本的源码编译后可以实现嵌套加密功能,低于2.1版本无此功能,高于2.1版本不向下兼容)尝试解密数据库。


0x02.EnMicroMsg下常用表解释

0x001.Rcontact

列名 username Alias Conremark Nickname
解释 对应的联系人微信账户实际ID 对应联系人的微信账户显示ID 用户对联系人的备注 对应联系人的昵称

0x002.Chatroom

列名 chatroomname Memberlist Displayname Roomowner Selfdisplayname
解释 对应聊天群ID 聊天群成员微信实际ID 聊天群成员显示昵称 聊天群房主实际ID 该用户在所在聊天群中的自我备注

0x003.message

列名 issend Creattime Talker Content
解释 布尔值为0表示收到消息,布尔值为1标识发出信息 表示对话创建时间 对话发生的对象 消息内容

Android通讯信息提取

0x00. 获取通讯录数据

挂载系统分区并定位至/data/data/com.android.providers.contacts/databases/

使用ADB指令将database提取至本地:

adb pull /data/data/com.android.providers.contacts/databases/contacts2.db X:\

使用Sqlitebrowser打开contact2.db文件

主要通讯录文件在raw_contacts表和data表中

raw_contacts各列解释

列名 _id Account_id Display_name Last_time_contacted
解释 通过id关联其他等表中的联系人 标识该联系人所对应的通讯录登陆账户 对应联系人姓名 最后通话的时间

data各列解释

列名 _id hash_id data1~data15
解释 通过id关联其他等表中的联系人 该联系人信息的hash值 这几列为对应联系人的姓名、住址、固话等信息

0x01.获取通话记录

挂载系统分区并定位至/data/data/com.android.providers.contacts/databases/

使用ADB指令将对应的database提取至本地:

Adb pull /data/data/com.android.providers.contacts/databases/calllog.db X:\

使用Sqlitebrowser打开calllog.db文件

calllog.db各列解释

列名 number date duration geocode_location
解释 对应通讯记录的去电号码 通话记录发生的时间 通话记录持续时间 去电号码归属地理位置

0x02. 获取短信息数据

在安卓7.1中,mmssms.db文件位置再在/data/data/com.android.providers.telephony下,而是在/data/data/com.google.android.gms/database下。

挂载系统分区并定位至/data/data/com.google.android.gms/database/

使用ADB指令将对应的database提取至本地:

adb pull /data/data/data/data/com.google.android.gms/database/icing_mmssms.db X:\

使用Sqlitebrowser打开icing_mmssms.db文件,定位至表mmssms下

icing_mmssms.db各列解释

列名 Msg_type address date body
解释 消息类型,SMS为短信息,PDU为彩信 收到的消息的地址 收到消息的日期 消息内容

Android系统分区简介

0x00.挂载文件系统

首先将手机连接PC并开启USB调试,再使用PC端进入CMD,输入 ADB shell进入ADB界面。

输入df查看手机分区信息。

列名 filesystem 1k-blocks Used Available use% Mount on
解释 文件系统所在具体路径 文件系统空间显示方式,以1024字节为一个单位 已用空间 可用空间 已用空间百分百 挂载点

输入su启用superuser,使用命令挂载所查看分区:

Mount -o remount,rw /dev/block/mmcblk0p43 /system

0x01.System分区

System分区等价于PC端的C盘。System分区分区包含了Android除却内核kernel和ramdisk内存的其他部分,比如图形界面和所有priv-app等预装应用部分,清除这个分区意味着删除整个系统,刷机时的ROM便是刷入这个分区。

0x02.MISC分区

MISC正如其全称miscellaneous一样,但这并不代表这是一个不重要的分区,该分区挂载在/data目录下。MISC分区其中包含一些系统设置和系统功能,比如运营商区域识别ID(CID,Carrier or Region ID),USB配置和一些硬件的的设置,这些设置选项通常以布尔值表示其ON/OFF状态。

0x03.Recovery分区

Recovery分区即为恢复分区,通常来说负责手机的开机,在正常的分区损坏后,recovery分区中所包含的内核kernel和ramdisk来进行系统的自我恢复,可以理解为recovery分区保存了安卓系统的底层,进入recovery分区的系统可以对机器进行如擦除分区、挂载分区、adb slide等部分高级操作。

0x04.Boot分区

Boot分区包含内核kernel和内存ramdisk的分目录文件进行打包生成boot.img文件来进行烧录的。

Boot分区是必须分区,没有该分区手机将无法正常启动至Android系统。除非特殊情况才会使用recovery进行boot分区擦除,即format操作。

该分区一旦受损或被擦除,设备只能安装一个新的boot分区才能正常启动,通常是通过安装一个包含boot.img镜像的ROM包来实现boot分区的在安装

0x05.user data分区

User data分区挂载在/data分区下,也称为用户数据区,包含了大量用户数据:如通讯录、短信、设置等用户安装程序的数据。对该分区进行操作等价于对设备进行恢复出厂设置,或是在安装完第三方ROM后的第一次启动时的状态。通常在recovery系统中对该分区进行format操作清除该分区。

再取证中,挂载在/data目录下的userdata分区是最为重要的数据源,无论是第三方APP的用户数据还是系统自带APP的数据都保存在userdata分区下,这些数据会充分反映该机器的使用情景和使用者的详细特征,最为典型的便是即时通讯软件的聊天记录账户信息等和使用者产生最为直接现实映射的数据。

目录 解释
/data/app-installed apps 已经安装的程序
data/app-private-protected apps 受保护的程序
/data/backups-manufacturer backups(rare) 厂商备份
/data/dalvik-cache dalvik 模拟器数据数据
/data/data (application data)              应用程序数据
/data/local-apps 应用程序被安装前第一次被拷贝的位置
/data/misc -bluetooth and wifi information 蓝牙和wifi信息
data/propert-timezone.info 时区信息
/data/system-gesture.key.file 图案密码文件

/data/system-gesture.key.file作为屏幕九宫格锁定的记录信息具有极大的数据价值。在不影响手机其他数据的情况下解锁手机在取证过程是非常重要的条件,通过gesture.key文件可以反算出该设备的九格密码。

0x06.Cache分区

Cache分区用来存储系统经常访问的数据和APP的临时组件的内容,使用recovery擦除该分区不影响机器的使用但是会失去现有的数据,通常不会造成程序崩溃,这些被擦出的数据会在后续使用中再次生成。

0x07.SD Card分区

SD卡分区内包含内部存储空间和外部存储空间的映射,外部存储空间即通常所说的SD闪存卡,通常应用程序的数据均安装在内部SD卡中,包括用户的音乐、相片等数据均默认保存在内置SD卡中,而所有在外置SD卡中的数据均是由当前用户自我添加的。

擦除SD卡分区是安全的,前提是其中数据已经经过备份,擦除该分区意味着时区所有用户数据。

C#使用Xpath进行html解析

0x00.Xpath

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。


0x01.添加引用

Nuget中下载 HtmlAgilityPack,项目中引用

using HtmlAgilityPack;

0x02.Load html页面

HtmlDocument index = web.Load("http://www.sonystyle.com.cn/mysony/acafe/index.htm");

0x03.查看所需元素的Xpath

浏览器以火狐为例

打开所需网页,F12进入控制台

定位到所需元素,右键→复制→Xpath

e.g:/html/body/div[3]/div[1]/div/div/div[1]/div[1]/div[1]


0x04.DocumentNode.SelectNodes的用法

DocumentNode.SelectNodes选择的是多个节点,需要使用集合

private List<string>list;

foreach (var sth in index.DocumentNode.SelectNodes("//ul[@class='slides']/li/a/img"))
{
  list.Add(base_url + index_img.GetAttributeValue("src", ""));//获取对应元素的src值
}

//*是固定格式,*表示匹配中的元素
/ 表示下一次
@表示对应的属性,如//ul[@class=’slides’]表示class为slides的ul元素


0x05.DocumentNode.SelectNodes的用法

DocumentNode.SelectNodes选择的是单一元素,所以需要使用该元素的绝对路径

var sth = index.DocumentNode.SelectSingleNode("//div/li/a/img");
var attribute=sth.GetAttributeValue("src", ""));

0x06.更多

Xpath参考手册

UWP模拟获取验证码

0x00.添加引用

using System.Threading.Tasks;
using System.Net.Http;

0x01.创建新Task

public static Task<HttpResponseMessage> VerCode(string Req)//Req为获取验证码的请求连接,可去需要的网站分析请求获取
{
    return Task.Run(() =>
    {
        HttpClient request = new HttpClient(HttpClientHandler);
        HttpResponseMessage response;
        {
            request.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0");
            request.DefaultRequestHeaders.Add("Accept", "*/*");
            request.DefaultRequestHeaders.Add("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
            request.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, br");
        }//模拟请求头
        try
        {
            response = request.GetAsync(Req).Result;//响应内容为MIME
        }
        catch
        {
            response = null;
        }
        return response;
    });
}

0x02.流形式读取

private async Task GetVerCodeAsync(string Req)//Req为获取验证码的请求连接,可去需要的网站分析请求获取
{
    HttpResponseMessage response = await Sign.VerCode(Req);
    byte[] streamByte = response.Content.ReadAsByteArrayAsync().Result;
    MemoryStream ms = new MemoryStream(streamByte);
    BitmapImage img = new BitmapImage();
    await img.SetSourceAsync(ms.AsRandomAccessStream());//img为Image控件
    VerCodeImg.Source = img;
}

0x03.点击刷新(因网站而异)

private async void VerCodeBtn_Click(object sender, RoutedEventArgs e)
{
    a = a + 1;
    string plus = "?test=" + a;
    string baseReq = "https://www.sonystyle.com.cn/mysony/campaign/api/captcha.do" + plus;
    await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
    {
        await GetVerCodeAsync(baseReq);
    });
}

0x04.相关

MIME 参考手册

UWP标题栏扩展

0x00.添加引用

在默认引用下添加

using Windows.ApplicationModel.Core

0x01.实现

public MainPage()
{
  this.InitiallizeComponent();
  var titlebar=CoreApplication.GetCurrentView().TitleBar;
  titlebar.ExtendViewIntoTitleBar=true;
  Window.Current.SetTitleBar(thingsuneed);//thingsuneed 为需要扩展至标题栏的控件的X:name
}

 

 

为WordPress添加百度访客统计

0x00.在function.php中添加功能

//获取post_views
function get_post_views ($post_id)
{
 $count_key = 'views';
 $count = get_post_meta($post_id, $count_key, true);
 if ($count == '') 
  {
   delete_post_meta($post_id, $count_key);
   add_post_meta($post_id, $count_key, '0');
   $count = '0';
  }
 echo number_format_i18n($count);
}
//设置post_views
function set_post_views () 
{
 global $post;
 $post_id = $post -> ID;
 $count_key = 'views';
 $count = get_post_meta($post_id, $count_key, true);
 if (is_single() || is_page()) 
  {
   if ($count == '') {
   delete_post_meta($post_id, $count_key);
   add_post_meta($post_id, $count_key, '0');
  } else 
  {
   update_post_meta($post_id, $count_key, $count + 1);
  }
}
}
add_action('get_header', 'set_post_views');

0x01.echo

echo get_post_views(get_the_ID());

即可输出访问次数。

基于Ubuntu搭建WordPress

0x00.购买空间

腾讯云服务器

阿里云服务器

1核 1GB 1M 的50G空间的基础服务器完全可以承载小型个人博客的流量。

设置服务器管理员密码,并向服务器安装Unbuntu镜像,登陆。


0x01.安装Apache2

sudo apt-get install apache2 -y

安装完成后可以通过访问服务器地址查看是否出现Apache2 Ubuntu Default Page并显示It works.


0x02.安装PHP 7.0及相关组件

sudo apt-get install php7.0 -y
sudo apt-get install libapache2-mod-php7.0

0x03.安装MySQL服务及相关组件

sudo apt-get install mysql-server -y

期间会需要输入两次密码以设置密码。

sudo apt-get install php7.0-mysql

0x04.安装 phpmyadmin

a.安装 phpmyadmin,安装过程中,遇到lighthttpd/apache2时请选择 apache2 ,再输入root密码 和数据库密码。

sudo apt-get install phpmyadmin -y

b.建立 /var/www/html 下的软连接:

sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

c.重启apache2和MySQL 服务(以后对apache2进行更改后也要重启以生效)

sudo service mysql restart
sudo systemctl restart apache2.service

0x05.安装Wordpress

wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.zip

下载完成后解压缩

sudo unzip wordpress-4.7.4-zh_CN.zip

0x06.为 wordpress 配置数据库

a.进入 mysql,输入MySQL密码:

mysql -u root -p

b.为 wordpress 创建一个叫 wordpress 的数据库

CREATE DATABASE wordpress;

c.数据库设置一个用户 wordpressuser,并设置密码:password123

CREATE USER wordpressuser;
SET PASSWORD FOR wordpressuser= PASSWORD("password123");

d.给用户数据库的访问权限并生效配置

GRANT ALL PRIVILEGES ON wordpress.* TO wordpressuser IDENTIFIED BY"password123";
FLUSH PRIVILEGES;

e.退出Mysql

exit;

0x07.配置Wordpress

a.把 wordpress 文件夹里的文件都复制到 /var/www/html/ 文件夹

sudo mv wordpress/* /var/www/html/

b.修改权限

sudo chmod -R 777 /var/www/html/

c.将apache指定到index.html

sudo mv /var/www/html/index.html /var/www/html/index~.html

d.重启apache

sudo systemctl restart apache2.service

0x08.测试访问

输入服务器地址访问。


0x09.购买域名并添加解析

以腾讯云举例

腾讯云域名选购

选购好域名后,登陆云服务器控制台,选择要添加解析的域名,点击添加解析→新手快速添加→网站解析→输入要云服务器IP→确定