失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > snapchat阅后即焚实现分析

snapchat阅后即焚实现分析

时间:2020-04-02 10:16:15

相关推荐

snapchat阅后即焚实现分析

最近主打阅后即焚的snapchat似乎又火了起来,估值已经达到100亿美元了。阅后即焚这个功能看上去挺神秘的样子,我们来分析一下它到底是怎么实现的吧。

通过wireshark抓包,发现全部都是SSL包,无法解密,但是至少可以确定这个app全程使用https进行通讯。另外APP还对HTTPS代码做了某些处理,使得fiddler的证书劫持功能也无法正常使用,那就只有再次祭上netbeans了。

通过apkIDE搜索"https"字符串,因为一般来说会注册一个https的Scheme。在找到的位置下断点,就可以跟踪到https使用的URL了。不过这里第二个https链接并不是直接走这里的代码,需要单步跟过去才会找到。

下面直接讲下它的网络和存储过程吧。

一.登录过程获取auth_token

通过如下URL来进行登录,并获取auth_token

https://feelinsonice-/loq/login

它会返回一个包含auth_token的json

二.接收照片过程

接收照片的过程比较多一点,会分下几个步骤

1.https://feelinsonice-/loq/all_updates

得到类似如下的未读信息

"snap": {

"sn":"teamsnapchat",

"t": 7,

"timer":7,

"id":"882091414483730340r",

"st":1,

"m": 1,

"ts":1414483730340,

"sts":1414483730340

【"zipped":true】

}

zipped是可选项,表示文件被压缩过

获取到有未取消息后,在对话框里显示“点击加载”,提示用户有新阅后即焚消息可读

2.用户点击“点击加载”后,触发的行为

1)构造一个类似的如下URL,下载该点击对应的文件到内存

https://feelinsonice-/ph/blob?id=795436414647955780r&username=shsjsjsjshsxxxx&timestamp=1414650012732&req_token=630010c93a89ceb579c2bd79f659d518efc9b763521c4d0537b7dab777392277

id就是上面loq/all_updates获取的未读id, username也是loq/all_updates返回的json中的内容,表示来自哪个好友,timestamp是本地时间戳,req_token是本地通过auth_token和timestamp再加上本地固定key,进行SHA-256加密后的串,可用于服务端认证及防篡改校验

生成算法,如下函数

public static String a(String authToken, String timestamp) {

String v0 = "iEk21fuwZApXlz93750dmW22pw389dPwOk" + authToken;

String v1 = timestamp + "iEk21fuwZApXlz93750dmW22pw389dPwOk";

MessageDigest v2 = MessageDigest.getInstance("SHA-256");

v2.update(v0.getBytes("UTF-8"));

String v3 = new String(RequestAuthorization.a(v2.digest()));

v2.update(v1.getBytes("UTF-8"));

String v2_1 = new String(RequestAuthorization.a(v2.digest()));

v1 = "";

int v0_1 = 0;

label_26:

if(v0_1 <"0001110111101110001111010101111011010001001110011000110001000110".length()){

int v4 ="0001110111101110001111010101111011010001001110011000110001000110".charAt(v0_1);

StringBuilder v5 = new StringBuilder().append(v1);

char v1_1 = v4 == 0x30 ? v3.charAt(v0_1) : v2_1.charAt(v0_1);

v1 = v5.append(v1_1).toString();

++v0_1;

goto label_26;

}

return v1;

}

2)对下载后的内存使用固定的key进行aes解密,这个key的值为:M02cnQ51Ji97vwT4,这一步进行解密后,内存中的内容是以明文存在的。

3)本地生成一个随机key,重新对解密后的文件进行aes加密,并保存为文件,同时将key保存起来:

照片文件保存名字如下所示: /data/data/com.snapchat.android/cache/received_image_snaps/h1a81hurcs00h-XXXXXXXXXXXXXXXXXXX.jpg.nomedia

XXX为可变数字

视频文件保存名字如下所示:

/mnt/sdcard/Android/data/com.snapchat.android/cache/received_video_snaps/sesrh_dlw21-XXXXXXXXXXXX.mp4.nomedia

加载完成后,阅后即焚的数据就以这样的一个加密文件形式存在,此时“点击加载"按钮变成了“按住查看”,一直到用户看完照片,这里的URL都是可以访问的

3.用户点击“按住查看”后,使用保存的KEY对加密文件进行解密,并显示出来,然后删除本地文件,并向服务端发送该照片或视频对的id,通知该id已读,服务端会使上一步使用的URL失效,同时通知此图片或视频的客户端,此消息已读。

通过上面的分析可知,阅后即焚的图片在内存中被AES解密后,是明文存在的,只要在这一步将该内存保存为文件,就可以将阅后即焚图片扣出来了。因此阅后即焚功能相对而言还是比较脆弱的。

如果觉得《snapchat阅后即焚实现分析》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。