0x00.启用缓存功能无效
即:设置→WP-Super Cache→启用缓存功能无效无法更新。
进入控制台,wp-config.php 添加:
define('WP_CACHE',true);
0x01.无法写入缓存文件…
即提示:Could not rename temporary file to configuration file….
进入控制台:
su root chmod 755 /www/wwwroot/async.website/wp-content
即:设置→WP-Super Cache→启用缓存功能无效无法更新。
进入控制台,wp-config.php 添加:
define('WP_CACHE',true);
即提示:Could not rename temporary file to configuration file….
进入控制台:
su root chmod 755 /www/wwwroot/async.website/wp-content
无需设置,安装完即可食用
将下列代码复制至主题→编辑→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; }
如今,我们对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、手机号码等信息。
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
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芯片数据镜像。
挂载系统分区并定位至/data/data/com.tencent.mm/MicroMsg
使用ADB指令将MicroMsg以沙盒方式提取至本地:
adb pull /data/data/com.tencent.mm/MicroMsg X:\
在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版本不向下兼容)尝试解密数据库。
列名 | username | Alias | Conremark | Nickname |
解释 | 对应的联系人微信账户实际ID | 对应联系人的微信账户显示ID | 用户对联系人的备注 | 对应联系人的昵称 |
列名 | chatroomname | Memberlist | Displayname | Roomowner | Selfdisplayname |
解释 | 对应聊天群ID | 聊天群成员微信实际ID | 聊天群成员显示昵称 | 聊天群房主实际ID | 该用户在所在聊天群中的自我备注 |
列名 | issend | Creattime | Talker | Content |
解释 | 布尔值为0表示收到消息,布尔值为1标识发出信息 | 表示对话创建时间 | 对话发生的对象 | 消息内容 |
挂载系统分区并定位至/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表中
列名 | _id | Account_id | Display_name | Last_time_contacted |
解释 | 通过id关联其他等表中的联系人 | 标识该联系人所对应的通讯录登陆账户 | 对应联系人姓名 | 最后通话的时间 |
列名 | _id | hash_id | data1~data15 |
解释 | 通过id关联其他等表中的联系人 | 该联系人信息的hash值 | 这几列为对应联系人的姓名、住址、固话等信息 |
挂载系统分区并定位至/data/data/com.android.providers.contacts/databases/
使用ADB指令将对应的database提取至本地:
Adb pull /data/data/com.android.providers.contacts/databases/calllog.db X:\
使用Sqlitebrowser打开calllog.db文件
列名 | number | date | duration | geocode_location |
解释 | 对应通讯记录的去电号码 | 通话记录发生的时间 | 通话记录持续时间 | 去电号码归属地理位置 |
在安卓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下
列名 | Msg_type | address | date | body |
解释 | 消息类型,SMS为短信息,PDU为彩信 | 收到的消息的地址 | 收到消息的日期 | 消息内容 |
首先将手机连接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
System分区等价于PC端的C盘。System分区分区包含了Android除却内核kernel和ramdisk内存的其他部分,比如图形界面和所有priv-app等预装应用部分,清除这个分区意味着删除整个系统,刷机时的ROM便是刷入这个分区。
MISC正如其全称miscellaneous一样,但这并不代表这是一个不重要的分区,该分区挂载在/data目录下。MISC分区其中包含一些系统设置和系统功能,比如运营商区域识别ID(CID,Carrier or Region ID),USB配置和一些硬件的的设置,这些设置选项通常以布尔值表示其ON/OFF状态。
Recovery分区即为恢复分区,通常来说负责手机的开机,在正常的分区损坏后,recovery分区中所包含的内核kernel和ramdisk来进行系统的自我恢复,可以理解为recovery分区保存了安卓系统的底层,进入recovery分区的系统可以对机器进行如擦除分区、挂载分区、adb slide等部分高级操作。
Boot分区包含内核kernel和内存ramdisk的分目录文件进行打包生成boot.img文件来进行烧录的。
Boot分区是必须分区,没有该分区手机将无法正常启动至Android系统。除非特殊情况才会使用recovery进行boot分区擦除,即format操作。
该分区一旦受损或被擦除,设备只能安装一个新的boot分区才能正常启动,通常是通过安装一个包含boot.img镜像的ROM包来实现boot分区的在安装
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文件可以反算出该设备的九格密码。
Cache分区用来存储系统经常访问的数据和APP的临时组件的内容,使用recovery擦除该分区不影响机器的使用但是会失去现有的数据,通常不会造成程序崩溃,这些被擦出的数据会在后续使用中再次生成。
SD卡分区内包含内部存储空间和外部存储空间的映射,外部存储空间即通常所说的SD闪存卡,通常应用程序的数据均安装在内部SD卡中,包括用户的音乐、相片等数据均默认保存在内置SD卡中,而所有在外置SD卡中的数据均是由当前用户自我添加的。
擦除SD卡分区是安全的,前提是其中数据已经经过备份,擦除该分区意味着时区所有用户数据。
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。
Nuget中下载 HtmlAgilityPack,项目中引用
using HtmlAgilityPack;
HtmlDocument index = web.Load("http://www.sonystyle.com.cn/mysony/acafe/index.htm");
浏览器以火狐为例
打开所需网页,F12进入控制台
定位到所需元素,右键→复制→Xpath
e.g:/html/body/div[3]/div[1]/div/div/div[1]/div[1]/div[1]
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元素
DocumentNode.SelectNodes选择的是单一元素,所以需要使用该元素的绝对路径
var sth = index.DocumentNode.SelectSingleNode("//div/li/a/img"); var attribute=sth.GetAttributeValue("src", ""));
using System.Threading.Tasks; using System.Net.Http;
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; }); }
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; }
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); }); }
在默认引用下添加
using Windows.ApplicationModel.Core
public MainPage() { this.InitiallizeComponent(); var titlebar=CoreApplication.GetCurrentView().TitleBar; titlebar.ExtendViewIntoTitleBar=true; Window.Current.SetTitleBar(thingsuneed);//thingsuneed 为需要扩展至标题栏的控件的X:name }
//获取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');
echo get_post_views(get_the_ID());
即可输出访问次数。