再谈微信运动

这里统一回复下,昨天写了篇关于微信运动刷榜的文章,考虑到微信运动是一个传播正能量,引领健康,宣起了全民运动热潮的公益应用,微信运动方面也做了沟通,刷榜这种行为不益于微信运动的健康生态,所以删除。

作者想说的是,现在对自己的健康作弊,最后伤害的还是自己,运动不在于多少,在于问心无愧,每天多走一步,用真实的数据说话。

记步问题

关于如何统计每天的步数,自己统计,需要长时间后台刷新,不太可行。所以微信运动采取的是读取health里的数据。下面是我写的统计当天步数的代码,原理都是一样的:

    func readTotalSteps(completion: ((Int) -> Void)) {
        ...
        let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: .None)
        let sampleQuery = HKSampleQuery(sampleType: sampleType!, predicate: predicate, limit: 0, sortDescriptors: nil, resultsHandler: {
            (sampleQuery, results, error ) -> Void in
            if let queryError = error {
                print( "There was an error while reading the samples: \(queryError.localizedDescription)")
            }
            
            var steps: Double = 0
            if results?.count > 0 {
                for result in results as! [HKQuantitySample] {
                    steps += result.quantity.doubleValueForUnit(HKUnit.countUnit())
                }
            }
            completion(Int(steps))
        })
        
        healthKitStore.executeQuery(sampleQuery)
    }

所以说,这样也就给了我们作弊的可能,因为我们也可以随意向heathlKit里面随意写入数据,而且是在不越狱的前提下,目前都是基于这种方法刷榜的。

如何防范

难道我们就这样放任不管吗,那些每天认认真真运动的人反而排在最后,这对微信运动的健康生态十分不益。

那我们该如何防范呢,我是从HKQuantitySample入手的,对于每一个HKQuantitySample类的result,都有一个source属性,对应的是HKSource,再看HKSource

/*!
 @class     HKSource
 @abstract  Represents the entity that created an object stored by HealthKit.
 */
@available(iOS 8.0, *)
class HKSource : NSObject, NSSecureCoding, NSCoding, NSCopying {
    
    /*!
     @property      name
     @abstract      The name of the source represented by the receiver.  If the source is an app, then the name is the
                    localized name of the app.
     */
    var name: String { get }
    
    /*!
     @property  bundleIdentifier
     @abstract  The bundle identifier of the source represented by the receiver.
     */
    var bundleIdentifier: String { get }
    
    /*!
     @method    defaultSource
     @abstract  Returns the source representing the calling application.
     */
    class func defaultSource() -> HKSource
}

这样说,我们可以校验这两个属性值来筛选数据咯,name指的是数据来源的名字,如果是手机自己添加的则是本机名,通过第三方应用添加的则对应其应用名,bundleIdentifier地球人都知道。更改之前的代码如下:

    func readTotalSteps(completion: ((Int) -> Void)) {
        ...
        let sampleQuery = HKSampleQuery(sampleType: sampleType!, predicate: predicate, limit: 0, sortDescriptors: nil, resultsHandler: {
            (sampleQuery, results, error ) -> Void in
            ...
            var steps: Double = 0
            if results?.count > 0 {
                let deviceName = UIDevice.currentDevice().name
                let healthBId = "com.apple.health"
                for result in results as! [HKQuantitySample] {
                    let name = result.source.name
                    let bid = result.source.bundleIdentifier
                    if name == deviceName && bid.hasPrefix(healthBId) {
                        steps += result.quantity.doubleValueForUnit(HKUnit.countUnit())
                    }
                }
            }
            completion(Int(steps))
        })

这样就完美过滤其他数据来源,真实还原health数据,不知道以后微信运动会不会采取这种方式。

然而这种方式存在固然的缺陷,一些正规的第三方运动应用添加的数据也会被过滤掉,难道以后要加白名单机制?想出现在微信运动里的运动应用(小米运动之类的)需要向微信审核??

反过来想想

对于上面这种过滤,是否存在绕过呢?

  1. 对于验证数据来源名字是否是本机,这个我们可以将应用名改成本机名,本地操作,秒秒钟的事情,不成问题。然而对于那种分发上线的应用,这个就比较困难了,我不知道有什么方法或者不存在方法。

  2. 对于bundle Identifier的伪造与修改,这个也是本地操作,假面攻击就是与之相关,因为该漏洞(iOS 8.4已修复部分),health应用的bundle Identifier后面有了一串随机数,com.apple.health.EBE76334-789F-400D-9214-0581002D49CE,我们获取它然后将自己的应用改成它,然后企业签名,再插入数据。

这里说说题外话,所谓的假面攻击,就是通过使用相同的bundle ID,替换手机上已有从app store上下载安装的APP应用程序,替换后的APP可以获取该应用程序的的用户敏感数据,比如第三方邮件应用下邮件信息,也可以作为跳板,通过已知漏洞绕过应用层的sandbox保护,对系统层进行攻击。乌云上有详细的资料,后面给出链接。

多说一句

总之,只要加点小的限制,便会让大众随意刷榜的举动变的十分困难,刷榜的成本大大提高,不再具有普及性和传播性。

废话这么多,最后来句吐槽,难得github有个这么多star的项目,删了好心痛。。希望大家为本文点个赞。

阅读更多

想了解Masque Attack的下面给了三个链接:
假面攻击:你所有的iOS应用都在我们的手掌心
假面攻击(Masque Attack)详细分析与利用
三种新的针对IOS的假面攻击方法(Masque Attacks)—— 乌云知识库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容