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
}

 

 

Fitbit Charge2 一月使用体验

上月3.15入了一个Fitbit Charge2,800大洋,各种测评已经很多了,总结一个月里的实际使用感受

图片来源于网络

续航

一次性充满电,所有传感器都打开,可以使用5天左右,主要影响续航的是手环的心率传感器和蓝牙

心率传感器选择的是自动,蓝牙没找到怎么关,默认也是一直打开的

每24小时大约掉电20%左右,没有发现电量越少掉电越快的情况

如果将手环取下来静止不动,心率传感器会自动关闭,下面两个绿色的就是心率传感器


屏幕&显示

手环用的是OLED点阵屏幕,所以像素点很明显,有种10年前电子表的感觉,成像质量和卡西欧计算器差不多。

屏幕并不是触摸屏,而是类似于“震动屏”,需要敲击手环的各种位置,除了敲击屏幕还可以敲击表带

屏幕不能调节亮度,阳光下可见度还是很好的,同时带来的问题就是夜间会晃瞎眼睛😱

具有抬腕显示功能,但是不是很灵敏,标准姿势是水平翻转手腕,其他姿势的灵敏度相对较低

屏幕较软,但是裸奔惯了,学校宿舍环境一个月已经出现了几条划痕

低像素的屏幕带来高续航,作为一款主打运动手环,这个显示质量和续航的平衡还是很令人满意的


表带

表带可以自行更换,暂时没有发现表带和表盘链接处有什么松动的迹象,卡扣式的设计还是很稳固

在某宝买了一个下图一样的表带,透气性还是蛮不错的

因为手环下方传感器位置是凸起的,手环只要不要扣的太紧,留出一个小指宽的空隙便可以保证舒适且不会到处滑动

因为没有使用原装的表带,所以暂时未出现很多人反应的表带鼓泡现象


传感器&精度

机器主要传感器为 MEMS 3轴加速度计、气压式高度计、PurePulse光学心率传感器

  • 3轴加速度计:主要负责测量空间加速度,能够全面准确反映物体的运动特性,提供手环的主要功能
  • 气压式高度计:提供手环高度的测量,如计算楼层数
  • PurePulse光学心率传感器:测量心率

因为没有专业设备也没有其他手环做对比测试,只发传送门

五款Fitbit 测评——选择最适合你的运动手环

仅从日常和微信步数对比来看,手环能统计到的步数通常都低于微信统计的步数

从上次爬山来看,微信统计到32000步手环只有30000步,估计是微信把在公车上晃来晃去也统计进去了

精度目前只测试了跑步距离的统计和楼层,测试时间为一周

每天早上跑步路线是1.2KM,手环会自动测量使用者的步长,开启跑步模式后,手环数据在1.18KM~1.22KM之间浮动

楼层统计也有误差,但基本很小,宿舍在5楼,一天上下楼8次总计40层,误差一般会在3~5层左右


软件&功能

Fitbit App在各大应用市场都可以下载到,此处就不做赘述

从登陆到设置手环过程,建议全程大概位置蓝牙服务,否则在设置手环时有可能无法获取手环型号

配对设备使用Sony Xperia Z5,手环的所有设置都只能在手机上完成,手环上只能进行简单的开关和切换操作

手环可以记录数据7天的分钟级精度数据,3天的 SmartTrack数据和30天的总数据,建议每天同步一次

手环可以提供电话短信提醒,但实际测试不是每次都有同步,经常收不到提示

可以自定义表盘,有7、8种表盘可选

SmartTrack:是指用户运动时,手环会自动识别用户的运动类型,如跑步、骑单车等,但是最低要求连续运动十分钟以上才能识别,只测试过单车和跑步,识别还是蛮准确的

具有震动闹铃功能

睡眠记录功能会在你睡时记录你的睡眠情况,午休也会被记录

如果App没有打开“保持同步”功能,每次重新配对同步时间会在半分钟左右

Fitbit Charge2可以通过手机GPS记录跑步路线地图(没测试过,一般都是室内跑步)

可以在Fitbit贴吧发布账号来添加Fitbit好友督促锻炼(反正我经常被嘲讽/(ㄒoㄒ)/~~)


操作逻辑

手环只有一个按钮,操作逻辑清晰简洁,分为三种操作逻辑

  1. 敲击手环
  2. 按钮短按
  3. 按钮长按

按钮短按:用于大类间切换,如:心率→跑步→秒表

敲击手环:用于大类下小类的切换,如:跑步→举重→跑步机→椭圆机

按钮长按:用于大、小类功能开关,如:在闹铃下长按为开启或关闭按钮;在跑步下长按为开始、结束跑步模式,长按结束时都会有震动提醒

总的来说操错逻辑很简单,没有很复杂的交互,如下图横向操作为短按,纵向操作为敲击


其他

手环千万不能下水,最多只能防日常飞溅的水,洗澡一定要去下来,千万别想着泡温泉还带着,早晚洗漱建议也取下来

Fitbit 账号:snowysong@live.com

欢迎添加好友~

为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());

即可输出访问次数。

关于「栗子木凤凰芯」

最近身边好几个朋友好奇为什么我的blog用「栗子木凤凰芯」这个完全不符合我的“命名规则”的奇怪ID

想了想觉得有点哭笑不得,对啊,我为什么要起这个名字啊?

按照以往的习惯,我的ID都是什么include,async等等奇奇怪怪语法🙃

开始自我回忆模式……

最早

大约07年,那时搜索还用的是Yahoo,3721,发邮件用126网易邮,第一个社交账号还是MSN,注册了第一个博客,ID:phoenix,用的应该是和讯博客。

那会还是小学生😯,这个单词是小学英语课本单词表没有的,很清楚的记得翻了很久硬汉英汉词典,虽然不知道怎么读这个单词但就是觉得很有眼缘。

小学生嘛,也没什么好写的,偶尔会被迫参加什么奇奇怪怪的作文比赛,过去太久远也忘记了账户密码,现在关于这个博客什么都搜不到,也算是不了了之了。

接下来

时间到08,09年,开始接触QQ空间、百度贴吧和魔兽世界。

那会博客还叫部落格吧,因为这个“部落”格所以玩了第一个部落牛头人萨满,当时觉得牛头人抠屁股的动作很魔性、喜感、丑萌、可爱,为了一个破图腾棒子翻山越岭,还有什么金丝换血袍的任务,那会不怎么会用插件,喊话都是用别人写好的汉化宏“一键施放”,每一个任务文本都看得很认真,但还是很挑战我的文字理解水平。

偶尔开始发发空间动态,后来沉迷QQ农场,在古老的N73上扳动摇杆“一键偷菜”😑

注册了一个百度ID:岩湖,可以很确定肯定这个ID来源于WC3中一个山丘之王的姓名文本串。

再接下来

大约到11年左右,接触到一个名为Pottermore的网站,作为一个哈迷查着字典认真做完每一道题。

J.K. Rowling阿姨把我扔到狮院顺便给了一把「硬栗木,凤凰芯,13 ¼”英寸」的魔杖。

那时刚接触剑网3,便将「栗子木凤凰芯」作为角色ID使用(虽然后来删了😥)

一根栗木魔杖

最后

介绍一下魔杖😜My wand

没错,我是奥利凡德🧐

翻译施工中…..

Chestnut

这是一种非常稀奇、多面的木材,它的特性因魔杖核芯的不同而不同 ,从而表现出许多不同的颜色。由栗木制成魔杖吸引着那些有娴熟魔法生物驯服技巧以及有斐然草药学和飞行天赋的男女巫们。然而, 当栗木与龙心弦搭配时, 它或许会在那些草率得到珍宝并沉迷其中的人中找到最佳人选。与这一说法相反的是,最高巫师法庭的连续三任继任者都拥有栗木搭配独角兽的魔杖,因为这种组合对于那些有各种正义考量的人的来说是一种偏好。

Phoenix

凤凰羽毛是极其稀有的核芯类型。它可以承受最强的魔法,尽管比起独角兽和龙需要更长时间才能展现出它的特性。凤凰羽毛制成的魔杖具有很强的自主性,有时候甚至会按照自己的意愿主动施法,然而这是一种许多巫师都不喜欢的特质。这类魔杖在选择持有者时通常非常挑剔,同时难以被随心所欲得驯服,要获得它的忠诚更是难上加难,因为凤凰本身就是这个世界上最为独立且难以接近的生物。

13 ¼” in length

下面关于魔杖长度的笔记来自魔杖铸造师 加里克·奥利凡德先生:

大多数魔杖都在9~14英寸之间,虽然我也卖出过极短的魔杖(8英寸及以下)和非常长的魔杖(超过15英寸),这些情况都很罕见。在后一种情况中,一般是使用者的身体有特质才会要求过长的魔杖。然而,非常非常短的魔杖通常会选择那些性格有所缺陷的巫师而不是因为他们的身体矮小(许多小个子巫师被较长的魔杖选中)。

Unyielding flexibility

下面关于魔杖柔韧性的笔记来自魔杖铸造师 加里克·奥利凡德先生:

魔杖的柔性和刚性代表了魔杖在使用者发生变换时的适应程度和自愿程度,这个因素不应从魔杖的木制、核心、长度以及持有者的经历和魔法风格中单独分开来考虑,所有这些因素的结合使每一把魔杖都独一无二。

渣渣翻译结束🤪

(Lyrics)アイロニ

少し歩き疲れたんだ,

有些走累了啊,

少し歩き疲れたんだ,

有些走累了呢,

月並みな表現(ひょうげん)だけど,

雖然以那麼平凡的表現,

人生(じんせい)とかいう長い道を,

來形容人生漫長的道路,

少し休みたいんだ,

想稍稍休息下呢,

少し休みたいんだけど,

虽然想稍稍休息一下,

時間は刻一刻(こくいっこく)残酷と,

可是時間每時每刻都這樣殘酷,

私を 引っぱっていくんだ,

將我 緊拖著前行,

うまくいきそうなんだけど,

雖然看似順利地進行著,

うまくいかないことばかりで,

但其實全是不順利的事,

迂闊(うかつ)にも泣いてしまいそうになる,

因此一塌糊塗地哭起來,

情(なさ)けない本当にな,

真是丟人呢,

惨(みじ)めな気持なんか,

這樣悲慘的感受,

嫌というほど味わってきたし,

已經不想再次體驗到了,

とっくに悔しさなんてものは,

明明應該將悔恨之類的,

捨ててきたはずなのに,

早早丟棄掉,

絶望抱くほど 悪いわけじゃないけど,雖然也不是感到絕望般 那樣差勁,

欲しいものは いつも少し手には届かない,

但是想要的東西 卻永遠得不到手。

考完试出来推这首歌

四年的警校生活就快结束了

也许在旁人看起来很顺利就签掉工作很幸运吧

没人知道这背后究竟经历了什么,也没人知道迈出这一步的代价究竟是什么

改变从来不意味着好坏,但一定意味着不同

一首听起来很平淡又有点略丧的歌

开始看《乌合之众》

记录开始,不知道多久能看完,占坑准备日后写写读后感。

据说是一本充满偏见的书。

上一本看完的是《蒂凡尼的早餐》。

最近忙着毕业考试和论文答辩,每天忙的根本停不下来,很多想写的以后补上,FLAG已立,一定补上,再忙多看看书也是好的。

还有日剧《四重奏》也是之前看完,没时间写感想,一如既往的日式人物塑造,细腻且生动,剧情源于生活却高于生活,平和却不平淡。

博客貌似很多天没有更,也半个多月没写代码,作为新站更新频率低应该是很影响收录的T.T

收到了一位站长的友链还是蛮开心的,第一步迈出去总是好的。

没时间只是借口吧,估计博客也没几个人看(ˉ▽ ̄~)

不是大牛不是文青,权当记录真实好了。

满足藏在冰激凌里。