Telegram网络层源码分析

最近看了一下Telegram网络层的源码,本来想网上找一下现成的结论,降低一点学习成本,但是并没有发现相关的资料。于是自己梳理了一下telegram是如何发送网络请求和响应回包的,这里做个总结。 连接的建立 先上一张图: 这张图描述了telegram客户端和server的连接时如何建立的。Java层的ConnectionsManager是一个线程安全的单例,其实只是个wrapper,真正的逻辑都是转交给C++层的ConnectionsManager类处理的。 C++层的ConnectionsManager对象,在TgNetWrapper.cpp中初始化,也同样是个单例。这里贴一下C++层ConnectionsManager类的init方法: 这里有两个关键的方法调用,一个是loadConfig(),一个是pthread_create()。顺着时间线往下看,loadConfig()调用了initDataCenter()方法,这个方法实现如下: 可以看到,主要是一些hardcode的IP和端口,其实在连接上第一个数据中心之后,客户端就会被分发到最优的数据中心接入,

  • 曙晨
    曙晨
6 min read

Android N多窗口适配

前言 从Android 7.0开始,系统就开始支持多窗口模式,对于多窗口模式的适配,主要是两方面,UI适配和生命周期的调整,适配的工作量因App而异,下面就从几个方面来谈谈多窗口模式的适配。 多窗口模式规则 这里要注意,多窗口模式分为两种,split-screen模式和freeform模式,前者是单纯的屏幕一分为二,而后者允许用户自由调整两个activity的大小。根据官方文档的说法,所有Android N的设备都是支持split-screen模式的,而freeform模式由厂商决定是否开启,一般屏幕比较大的设备都支持这个模式。 AndroidManifest.xml中的android:resizeableActivity属性和应用的targetSDK共同影响着应用在分屏模式下的行为,这里先讨论应用没有指定orientation的情况。如果应用的targetSDK是24及以上,那么android:resizeableActivity属性默认为true,应用默认支持多窗口模式,当然应用可以手动覆盖掉这个默认值。如果应用的targetSDK是23及其以下,那么要分为三种情况。一是这个属性没有被指定,

  • 曙晨
    曙晨
8 min read

2017回顾与展望

引言 这个系列一般都是在每一年的11~12月写的,这一篇为什么推迟了这么久呢,因为这三个月发生了几件对我来说很重要的事情,我觉得等到一切尘埃落定之后再写会比较有意义。 回顾 先来看看2016年给自己定下的目标: 找个女朋友 ✅ 持续更新GitHub ✅ 坚持慢跑 ❓ 重新开始练书法 ❓ 拓展交际圈 ❎ 这里打勾的是完成了,叉是完全没做,问号是部分完成。女朋友是17年底找到的,算是赶上了末班车。持续更新GitHub这一条,完成度一般吧,去年一年,很大一部分时间是研究卡顿和内存泄漏监控,GitHub上主要更新的内容就是这个。坚持慢跑这一条,做了大概半年吧,后来因为天气转冷,就没有继续了。书法也差不多练了半年,重新拿起毛笔,有点生疏,后来因为搬家了,毛笔什么丢了,就暂时搁一边了。

  • 曙晨
    曙晨
16 min read

CVE-2017-13156漏洞分析(中)

承接上篇,本篇主要介绍一下Android的签名机制,并从原理上分析一下为什么使用APK Signature Scheme v2签名的应用在Android 7.0以上不受漏洞影响。Android提供了两种签名方式,一种是v1的基于JAR签名的方式,另一种就是APK Signature Scheme v2。 签名验证时机 首先看一下PackageManagerService的代码,看看是什么时候进行签名验证的。 PMS的installPackageLI方法会构造一个PackageParser对象,并调用collectCertificates方法来验证签名。 这里可以看到,首先要对apk文件的entry做遍历,如果遇到entry是目录,或者是META-INF文件名,或者是AndroidManifest.xml则跳过,否则把entry加入一个List,这个List中的每一个entry将在下一步进行签名验证。验证签名的过程后面会说,这一节只是说明,在apk安装的时候,PMS会进行签名验证。 V1签名 Android官方文档有说,

  • 曙晨
    曙晨
9 min read

CVE-2017-13156漏洞分析(上)

前言 CVE-2017-13156是今年Android爆出的最为严重的一个漏洞,这个漏洞允许攻击者绕过Android系统V1的签名,用篡改过的apk覆盖原有的应用,攻击者的代码可以访问原应用所有的数据。影响范围是Android 5.0+。这个漏洞的本质原因是ART允许直接运行一个dex,同时也允许运行一个里面包含dex的zip文件。而因为dex文件格式和zip文件格式的问题,一个文件可以同时是合法的zip文件和合法的dex文件。正是因为这种二义性,这个漏洞也被称作Janus漏洞,Janus是罗马神话中的双面神,具有前后两个面孔。对于特殊修改过的apk文件,PackageManagerService把它当作合法的apk安装,而ART把它视作合法的dex执行,这就是一个文件的两个视角。github上已经有人放出了这个漏洞的PoC,代码虽然很简单,但是看懂需要一点背景知识,下面就从zip和dex的文件结构上来解释这段代码。 Zip文件结构 Zip文件最重要的一个部分就是末尾的Central Directory,这个部分可以理解为Zip文件真正的文件头,解析zip文件都是从这里开始解析的,它包含了zip文件每一个entry的摘要信息。这个部分的结构如下: 这里很容易看出来,Central

  • 曙晨
    曙晨
6 min read

SharedPreferences源码分析

前言 SharedPreferences作为Android应用配置项的存储,给上层提供了非常方便的接口,这篇Post将从源码层面分析SharedPreferences实现的细节。 获取SharedPreferences 获取SharedPreferences实例是通过ContextImpl.getSharedPreferences(String name, int mode)方法来完成的。 这里的sSharedPrefs是ContextImpl的静态成员,类型为ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>>,从这个ArrayMap里,我们可以通过包名获取另一个ArrayMap packagePrefs,其中包含文件名到SharedPreferencesImpl的映射。这里我初看的时候不太理解,为什么要两级映射。后来想了一下,应该是针对sharedUserId的情况,这种情况下,同一个进程会有不同的Context和包名,个人见解,

  • 曙晨
    曙晨
8 min read

TLS握手过程

最近和朋友吃饭的时候,聊到了HTTPS,HTTPS其实就是基于TLS建立了安全信道的HTTP协议。所以可以说,HTTPS最重要的就是TLS的握手过程。这篇post整理了一下TLS的握手过程。 前置知识 这里要先讲几个概念,在后面对于TLS握手过程的描述中会用到这几个概念。 HTTPS TLS和SSL的关系 SSL是90年代Netscape弄出来的一套东西,为的是解决HTTP协议明文传输数据的问题。后来SSL慢慢成了事实上的标准,于是IETF就把SSL标准化了,名字叫做TLS,TLS 1.0其实就是SSL 3.1。所以SSL和TLS经常被放在一起写成SSL/TLS,因为这两个名词在现在其实就是同一个东西。HTTPS是使用TLS的HTTP协议。 证书及信任链 我们知道,HTTPS的网站都有一个自己的证书,用于表明自己的身份。证书本质上是为了让公钥能可信的传输。公钥是放在证书里面的,如果证书可信,那么公钥就也是可信的。

  • 曙晨
    曙晨
5 min read

Steam升级指南

前言 混了这么久的steam,帐号等级一直很低,本来只是准备升一下等级的,没想到就入了挂卡的坑,这里写一篇攻略吧,讲讲关于steam升级的一切。 背景知识 什么是喜加一? 本意是说,买了也不玩,只是让库存游戏数量加一的行为。后来喜加一游戏也用来指那些质量低下,但是很便宜的游戏,通常来说,这些游戏几乎没有可玩性,唯一的优点就是便宜。像下面这张图里,这些被我隐藏掉的,都是喜加一游戏。 什么是steam集换式卡牌? 虽然叫集换式卡牌,但是并不能拿来玩卡牌游戏,唯一的作用就是拿来合成徽章,就像下面这两张图一样,合成完的徽章会出现在个人资料页。 每个游戏会掉落总数一半左右的卡牌,举个例子,Don't Starve一共有5张卡牌,那么通过游戏可以免费掉落的就是3张(向上取整),掉落的卡牌是会重复的,

  • 曙晨
    曙晨
8 min read

关于未雨绸缪

前段时间某厂被曝清理34岁以上的员工,虽说有标题党的嫌疑,但是反映出来的现象还是值得深思的。看过一个被离职员工的文章,过久了安逸的日子,被离职之后,居然找不到合适的工作,然后还要还高额的房贷,小孩还要上学,不得不卖房来还贷。在这件事情之前,我听到“程序员都是青春饭”这种说法,都是嗤之以鼻的,一方面是觉得,这是得过且过的人安慰自己的托辞,另一方面是因为真的没考虑过10年之后会怎么样。随着时间的流逝,我觉得也应该好好思考一下这个问题了。 概括了一下平行宇宙知乎上的讨论,大致有这么几种论调: 公司卸磨杀驴,不想跟员工签终生合同,所以变相裁掉这些人。 程序员这一行,如果34岁没有管理岗,还在纯粹写代码,就会混得很艰难,薪资也会到上限,这些人机遇不好 这些人活该,不合理的事情一直没有人说,

  • 曙晨
    曙晨
5 min read

卖场购机的一些套路

前言 前天晚上和一个朋友吃了个饭,走回去的路上刚好路过徐家汇的百脑汇,就聊了一下这些卖场的套路,在这里记下来,不少朋友都是吃过套路的亏的。 这里假定各位读者都是对电脑的配置有基本了解的,如果对于硬件一无所知,我还是建议直接去京东买个合适价位的,就不要去趟卖场这滩浑水了。卖场虽然坑比较多,但是好处也是很明显的,如果能避开商家挖好的坑,最后的成交价会比京东要便宜。废话不多说了,下面来列举一下商家常用的套路。 洗脑转型 这是各大卖场最常见的套路。一般去逛电脑城的,大部分人都是看好了某个型号,目的性很强。卖场门口拉客的自然也知道这一点,所以不管你问他们什么型号,他们都会说有,然后报一个低于市场价500~2000的价格(视总价而定),先把你拉进店。接下来会给你看一台样机,如果没什么问题就让你交钱了,他们去仓库取机器。过一会会有人来告知你,这个区的仓库没货了,

  • 曙晨
    曙晨
9 min read

2016回顾与展望

前言 其实每一年的11~12月我都有写一篇同样题材的post,很可惜,因为一次意外的事故,2016年之前的post都丢失了。不过,仔细想想也没什么大不了的,我个人认为,2016年算是我的一个转折点,遗失的四篇其实差不太多,并没有实质性的区别,有些地方现在想起来还有些矫情,2016的这一篇就算是个新的开始吧。因为并不涉及到技术问题,也不用考虑SEO,这一篇就用中文写了。 家庭 在我20多年的成长中,对我影响最大的是我的父母,他们塑造了我的人生观和世界观。我印象中的父母,是说一不二的,在我小时候,很多事情是没得商量的,不过他们做事情确实是滴水不漏,绝大多数时候,听他们的没错,所以曾经我一直都是个优柔寡断的人,但是今年的一件事情让我有了很大的改变。今年年中的时候有一次和妈妈打电话,提了一句想做一件事情,具体的事情涉及隐私,

  • 曙晨
    曙晨
10 min read