zoukankan      html  css  js  c++  java
  • 不越狱修改钉钉位置打卡(实现除了砸壳,都可以在不越狱的前提下进行逆向工程)

      接触逆向工程也有一点时间了,从最初研究我水哥的小黄书(iOS应用逆向工程),到后来自己摩拳擦掌准备实练,突然发现自己没有一款越狱手机,以至于很多iOS工具都无法使用。这就很纠结。突然发现网易的大佬 庆哥把iOSOpenDev(13年已停更)修改升级除了 MonkeyDev ,这个东西有多好用。简单来说,他就已经注入dylib,集成Reveal、Cycript等等,不需要自己搞去配置。

        一切的一切,只需要自己配置好最新的 theos 环境。

      1 sudo git clone --recursive https://github.com/theos/theos.git /opt/theos

        安装ldid(如安装theos过程安装了ldid,跳过)

    2  brew install ldid

       然后安装 MonkeyDev

       你可以通过以下命令选择指定的Xcode进行安装:(3.1和3.2选一个执行

    3.1  sudo xcode-select -s /Applications/Xcode-beta.app

    默认安装的Xcode为:
    3.2   xcode-select -p
    

         执行安装命令:

    4  git clone https://github.com/AloneMonkey/MonkeyDev.git
    5  cd MonkeyDev/bin
    6  sudo ./md-install

    具体使用请参考 https://github.com/AloneMonkey/MonkeyDev/wiki/开始使用 庆哥在github 写的很详细了。

    本文主要是分享我是如何从无从下手 到 成功 hook 钉钉的打卡机制的思想过程。

    从PP助手上下载了个钉钉,直接扔到 MonkeyDev 里面,调好设置,准备调试!结果他还检测出我不是正版应用,于是我老老实实的去plist 文件吧bundle ID 复制了出来,然后粘在了Organization Identifiler 上。在跑,果然没事了。

    那么说到定位,我就想到
    CoreLocation 框架,那么我们就hook它!
    首先是使用 CaptainHook 这个庆哥也集成好了,咱们直接拿来用
    CHDeclareClass(CLLocation);
    
    CHOptimizedMethod0(self, CLLocationCoordinate2D, CLLocation, coordinate){
     
        return CLLocationCoordinate2DMake(39.960742, 116.569844);
    }
    
    CHConstructor{
        CHLoadLateClass(CLLocation);
        CHClassHook(0, CLLocation, coordinate);
    }
    真机一跑,GG!想想也是,要是这么简单就hook 了,企业专家也不是很没面子,class dump 出所有头文件,看看都有什么吧。



    于是进行谷歌搜索,高德地图禁止虚拟定位,看了几个博客,就找到 有这样一个方法,- (BOOL) detectRiskOfFakeLocation 返回YES,就检测虚拟定位,NO就不检测;
    OK ,那hook 它!先查找都那几个类用它了,

    
    

    搜索出来,一共就三个类, 好办,搞它!
    CHDeclareClass(AMapGeoFenceManager);
    CHMethod(0, BOOL,AMapGeoFenceManager,detectRiskOfFakeLocation){
    
        return NO;
    }
    
    CHConstructor{
        CHLoadLateClass(AMapGeoFenceManager);
        CHClassHook(0, AMapGeoFenceManager,detectRiskOfFakeLocation);
         
    }
    
    
    
    
    CHDeclareClass(AMapLocationManager);
    CHMethod(0, BOOL,AMapLocationManager,detectRiskOfFakeLocation){
        
        return NO;
    }
    
    CHConstructor{
        CHLoadLateClass(AMapLocationManager);
        CHClassHook(0, AMapLocationManager,detectRiskOfFakeLocation);
        
    }
    
    
    
    
    
    CHDeclareClass(DTALocationManager);
    CHMethod(0, BOOL,DTALocationManager,detectRiskOfFakeLocation){
        
        return NO;
    }
    
    CHConstructor{
        CHLoadLateClass(DTALocationManager);
        CHClassHook(0, DTALocationManager,detectRiskOfFakeLocation);
        
    }


       真机跑起来,哈哈,这次你还不出来! 结果照样GG !这么办,那我们去高德地图的api 搜索看看 这个方法,是不是方法有什么需要咱们注意东西。于是我搜索了

    detectRiskOfFakeLocation 这个方法。

         

     搜索出来 还真有!  一共六个,两个 高德检测,两个钉钉检测,不管全hook了!

    CHDeclareClass(AMapGeoFenceManager);
    CHMethod(0, BOOL,AMapGeoFenceManager,detectRiskOfFakeLocation){
    
        return NO;
    }
    CHMethod(0, BOOL,AMapGeoFenceManager,pausesLocationUpdatesAutomatically){
        
        return NO;
    }
    CHConstructor{
        CHLoadLateClass(AMapGeoFenceManager);
        CHClassHook(0, AMapGeoFenceManager,detectRiskOfFakeLocation);
         CHClassHook(0, AMapGeoFenceManager,pausesLocationUpdatesAutomatically);
    }
    
    
    
    
    CHDeclareClass(AMapLocationManager);
    CHMethod(0, BOOL,AMapLocationManager,detectRiskOfFakeLocation){
        
        return NO;
    }
    CHMethod(0, BOOL,AMapLocationManager,pausesLocationUpdatesAutomatically){
        
        return NO;
    }
    CHConstructor{
        CHLoadLateClass(AMapLocationManager);
        CHClassHook(0, AMapLocationManager,detectRiskOfFakeLocation);
        CHClassHook(0, AMapLocationManager,pausesLocationUpdatesAutomatically);
    }
    
    
    
    
    
    CHDeclareClass(DTALocationManager);
    CHMethod(0, BOOL,DTALocationManager,detectRiskOfFakeLocation){
        
        return NO;
    }
    CHMethod(0, BOOL,DTALocationManager,dt_pausesLocationUpdatesAutomatically){
        
        return NO;
    }
    CHConstructor{
        CHLoadLateClass(DTALocationManager);
        CHClassHook(0, DTALocationManager,detectRiskOfFakeLocation);
        CHClassHook(0, DTALocationManager,dt_pausesLocationUpdatesAutomatically);
    }

    真机一跑,成了!可以打卡了!

     哈哈哈 ,以上是我心路历程!我也已经集成了一个pod 在 https://github.com/AloneMonkey/MonkeyDevSpecs  ,你可以直接在 MonkeyDev 通过cocopods 集成它。链接里还有许多好玩的,作为彩蛋送给大家。溜了,溜了。

  • 相关阅读:
    是否可以从一个静态(static)方法内部发出对非静态 (non-static)方法的调用?
    是否可以继承 String 类?
    如何实现字符串的反转及替换?
    String s = new String(“xyz”);创建了几个字符串对象?
    Serial 与 Parallel GC 之间的不同之处?
    SVG是什么?
    阐述静态变量和实例变量的区别?
    Java 中 ++ 操作符是线程安全的吗?
    什么是 REST / RESTful 以及它的用途是什么?
    WebSQL是HTML 5规范的一部分吗?
  • 原文地址:https://www.cnblogs.com/DafaRan/p/7522284.html
Copyright © 2011-2022 走看看