snapchat阅后即焚实现分析

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

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

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

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

     .登录过程获取auth_token

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

         https://feelinsonice-hrd.appspot.com/loq/login

     它会返回一个包含auth_tokenjson

     .接收照片过程

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

     1.https://feelinsonice-hrd.appspot.com/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-hrd.appspot.com/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_tokentimestamp再加上本地固定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解密后,是明文存在的,只要在这一步将该内存保存为文件,就可以将阅后即焚图片扣出来了。因此阅后即焚功能相对而言还是比较脆弱的。

你可能感兴趣的:(https,实现,Netbeans,阅后即焚,Snapchat)