美文网首页
钉钉打卡定位修改

钉钉打卡定位修改

作者: wesk痕 | 来源:发表于2022-08-03 22:34 被阅读0次

    钉钉打卡修改定位

    分析

    常规方案:

    1. Xcode debug模式下的模拟定位,可直接修改手机定位;
    2. 爱思助手等工具修改虚拟定位
    3. 根据打卡页面的定位服务功能类去hook定位结果数据;
    4. 拦截系统的定位回调API方法,修改定位信息,抛回给应用业务。

    上述方案分析:

    方案1 肯定不在本次的实践里,因为实在太简单了~;
    方案2 最新实践了下,钉钉已经能识别了,打不了卡衰;


    方案3 需要了解钉钉的业务场景,去查看钉钉dump后的部分代码,会相对耗时;
    方案4 这里是在系统和应用之间,做一次拦截,这个方案不需要考虑业务实现,具有普适性,后续其他应用也能使用该方案,价值更高。

    逆向步骤:

    1. 第一步 越狱机上安装钉钉应用。 砸包导出DingTalk.ipa,获取bundleId等信息

    1. 手机越狱和砸包,这里就不细说了哈, 教程实在太多了

      对DingTalk可执行文件dump,获取到对应的.h文件

      class-dump -H Payload/DingTalk.app/DingTalk -o DingTalk
      

    2. 获取应用进程名 DingTalk,作为tweak注入的应用

    这个方法比较多,ipa里的info.plist文件可以查看,手机通过USB线 连接Mac,控制台中可以看到进程日志打印

    控制台打印日志

    3. 书写定位信息hook的核心代码

    我们知道系统的单点定位API,是如下接口,我们只需要拦截,修改定位信息,然后修改后的定位信息抛回去,那是不是OK了?

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
    

    是的,我们就是拦截这个方法。

    在钉钉的dump文件夹中搜了一下didUpdateLocations, 有好多类使用到了。

    钉钉类检索结果

    在这里,不针对具体业务场景处理了,我们还是使用最简单有效的方式来hook。对系统类CLLocationManager 的setDelegate 和delegate做一次hook,然后拦截方法- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations 的代理实现。

    + (void)load {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            Method orignalMethod = class_getInstanceMethod(self, @selector(setDelegate:));
            Method swizzledMethod = class_getInstanceMethod(self, @selector(wesk_setDelegate:));
            method_exchangeImplementations(orignalMethod, swizzledMethod);
    
            Method orignalMethod2 = class_getInstanceMethod(self, @selector(delegate));
            Method swizzledMethod2 = class_getInstanceMethod(self, @selector(wesk_delegate));
            method_exchangeImplementations(orignalMethod2, swizzledMethod2);
        });
    }
    
    - (void)wesk_setDelegate:(id<CLLocationManagerDelegate>)delegate {
        if (delegate) {
            WLocationProxy *proxy = [[WLocationProxy alloc] initWithTarget:delegate];
            self.weskProxy = proxy;
            [self wesk_setDelegate:proxy];
        } else {
            self.weskProxy = nil;
            [self wesk_setDelegate:delegate];
        }
    }
    
    - (id<CLLocationManagerDelegate>)wesk_delegate {
        id delegate = [self wesk_delegate];
        if (delegate == self.weskProxy) {
            return self.weskProxy.target;
        }
        return delegate;
    }
    
    

    这里用了NSProxy中间代理对象,进行消息处理,WLocationProxy 重要代码:

    @implementation WLocationProxy
    
    - (instancetype)initWithTarget:(id)target {
        _target = target;
        return self;
    }
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
        // 使用mock 定位.
        CLLocation *mockLocation = [[CLLocation alloc] initWithLatitude:[WLocationInstance sharedInstance].mockLatitude longitude:[WLocationInstance sharedInstance].mockLongitude];
        locations = @[mockLocation];
        [self.target locationManager:manager didUpdateLocations:locations];
    }
    
    @end
    

    4. 工程创建及编译修改

    创建Tweak 工程 ddhook。

    钉钉app的bundleId: com.laiwang.DingTalk

     ![工程创建](https://img.haomeiwen.com/i2906485/46cf07ed7d025b9b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/940)
    

    创建好工程之后,修改Makefile 编译文件如下:

    TARGET := iphone:clang:latest:7.0
    INSTALL_TARGET_PROCESSES = DingTalk
    
    THEOS_DEVICE_IP = 10.1.50.123
    THEOS_DEVICE_PORT = 22
    
    ARCHS = armv7 arm64
    
    iOSRE_FRAMEWORKS=UIKit Foundation
    
    include $(THEOS)/makefiles/common.mk
    
    SRC = $(wildcard src/WLocation/*.m)
    
    TWEAK_NAME = DDHook
    
    DDHook_FILES = $(wildcard src/WLocation/*.m) src/Tweak.x
    DDHook_CFLAGS = -fobjc-arc
    
    include $(THEOS_MAKE_PATH)/tweak.mk
    
    after-install::
     install.exec "killall -9 DingTalk"
    

    PS: 这里将Twea.x的文件层级 进行了拖动,同时创建了文件夹WLocation, 这个在Tweak.x文件里 访问WLocation目录下的类时,需要加上路径,如

    #import "WLocation/WLocationInstance.h"
    
    工程目录.png

    Tweak.x 文件中选一个启动必调用的类,地图上随便拾取了一个北京的定位坐标(116.433598,39.911103),然后进行定位数据mock赋值,如下:

    %hook UIViewController 
    
    - (void)viewDidLoad {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
          [WLocationInstance sharedInstance].customLocation = YES;
            [WLocationInstance sharedInstance].mockLatitude = 39.911103;
            [WLocationInstance sharedInstance].mockLongitude = 116.433598;
        });
        %orig;//调用原始方法
    }
    
    %end
    

    最终打卡页效果如下:

    定位修改

    总结:

    钉钉打卡定位的修改,在越狱机上实现,总体来说,技术不是很难。 主要是思路,怎么去做是最简单有效。

    怎么在我们其他应用上拦截?
    如果是在非越狱机上修改,我们有没有什么更好的方案?

    相关文章

      网友评论

          本文标题:钉钉打卡定位修改

          本文链接:https://www.haomeiwen.com/subject/eivewrtx.html