关于安全:IOS-联真机签名解决方案

34次阅读

共计 4662 个字符,预计需要花费 12 分钟才能阅读完成。

一、指标

咱们之前介绍过 IOS 某电商 App 签名算法解析 (二) Frida RPC 调用和 IOS Theos Tweak 之 HelloWorld。那么他们搭配起来能解决什么问题呢?

在 Android 联真机签名计划中,咱们提到过 Frida rpc 计划的毛病:

  • frida 不是很稳固,偶然会解体出退
  • frida 启动须要连 PC (不过这个毛病曾经被 Xcube frida 脚本长久化 给解决了)

那么在 Ios 下有没有相似 Xposed 的东东?

是的,就是 Tweak。

二、步骤

GCDWebServer

GCDWebServer 是一个基于 GCD 的轻量级服务器框架,用于内嵌到 MacOS 或者 iOS 零碎的利用中,提供 HTTP 的服务。

他的代码在这里 https://github.com/swisspol/GCDWebServer

咱们先创立一个 Tweak 工程

fenfeiNewMac:ldqtweakrpc fenfei$ nic.pl
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iphone/activator_event
  [2.] iphone/activator_listener
  [3.] iphone/application_modern
  [4.] iphone/application_swift
  [5.] iphone/cydget
  [6.] iphone/flipswitch_switch
  [7.] iphone/framework
  [8.] iphone/library
  [9.] iphone/notification_center_widget
  [10.] iphone/notification_center_widget-7up
  [11.] iphone/preference_bundle_modern
  [12.] iphone/theme
  [13.] iphone/tool
  [14.] iphone/tool_swift
  [15.] iphone/tweak
  [16.] iphone/tweak_with_simple_preferences
  [17.] iphone/xpc_service
Choose a Template (required): 15
Project Name (required): ldqsign
Package Name [com.yourcompany.ldqsign]: 
Author/Maintainer Name [fenfei]: fenfei
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: XX4iPhone
Instantiating iphone/tweak in ldqsign/...
Done.

而后把 github 上下载的代码复制到工程目录

编辑下 MakeFile 文件,把 GCDWebServer 的代码加进去

ARCHS = armv7 arm64
TARGET := iphone:clang:latest:7.0
INSTALL_TARGET_PROCESSES = JD4iPhone

ADDITIONAL_OBJCFLAGS = -fobjc-arc
include $(THEOS)/makefiles/common.mk

TWEAK_NAME = ldqsign

ldqsign_FILES = Tweak.x $(wildcard ./GCDWebServer/Core/*.m) $(wildcard ./GCDWebServer/Requests/*.m) $(wildcard ./GCDWebServer/Responses/*.m)
ldqsign_CFLAGS += -I./GCDWebServer/Core -I./GCDWebServer/Requests -I./GCDWebServer/Responses
ldqsign_LDFLAGS += -lz.1.2.5 -lc++ -framework CFNetwork -framework Security -framework MobileCoreServices -weak_framework UIKit 

include $(THEOS_MAKE_PATH)/tweak.mk

而后编辑 Tweak.x 文件,创立一个根本框架,启动 web 服务

void RunWebServer()
{NSLog(@"zytc: ======================== Run MyServerXX");
    GCDWebServer* _webServer;
    _webServer = [[GCDWebServer alloc] init];

    NSLog(@"zytc: ======================== Run MyServerXX 2");
    // Add a handler to respond to GET requests on any URL
    [_webServer addDefaultHandlerForMethod:@"GET"
                              requestClass:[GCDWebServerRequest class]
                              processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {return [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];

                              }];

    // Start server on port 8181
    [_webServer startWithPort:8181 bonjourName:nil];
    NSLog(@"zytc: xx Visit %@ in your web browser", _webServer.serverURL);
    
}



%ctor {NSLog(@"zytc: xxDev !!!");
        RunWebServer();
        %init(_ungrouped);
}

编译下

make package install

我的 mac 是 10.14.6 Xcode 是 11.3.1
编译时会遇到

ld: warning: building for iOS, but linking in .tbd file (/opt/theos/vendor/lib/CydiaSubstrate.framework/CydiaSubstrate.tbd) built for iOS Simulator

这时候 把 /opt/env/theos/vendor/lib/CydiaSubstrate.framework/CydiaSubstrate.tbd 文件用文本关上,删除 两处 archs 前面的 i386, x86_64,就能够编译胜利了。

运行

先启动 控制台

再启动某电商 App

从 控制台的音讯外面能够看到

zytc: xx Visit http://192.168.2.108:8181/ in your web browser

的日志输入,阐明 web 服务启动胜利。从浏览器外面拜访下 http://192.168.2.108:8181/

相熟的 HelloWorld 呈现了,没问题

被动调用 getSignWithDic

先申明要调用的类和函数

@interface XXSignService : NSObject
{

}

+ (id)getSignWithDic:(NSDictionary*)arg1 keys:(NSArray*)arg2;
@end

而后创立一个 sign 接口来调用他,(失常应该是创立 POST 接口,把参数 post 进来,这里为了不便 Demo 还是用 GET)

具体参数剖析能够参照 IOS 某电商 App 签名算法解析 (二) Frida RPC 调用

    // @"POST"
[_webServer addHandlerForMethod:@"GET"  
                           path:@"/sign"
                   requestClass:[GCDWebServerURLEncodedFormRequest class]
                   processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {// NSString* body = [[(GCDWebServerURLEncodedFormRequest*)request arguments] objectForKey:@"body"];
        // NSString* functionId = [[(GCDWebServerURLEncodedFormRequest*)request arguments] objectForKey:@"functionId"];

        NSString* body = @"{\"api-version\":\"1.1.0\"}";
        NSString* client = @"apple";
        NSString* clientVersion = @"10.0.1";
        NSString* functionId = @"xview2Config";
        NSString* openudid = @"078593ee2fda3d54aae5879cb841b2faa62a4985";

        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        [dict setObject:body forKey:@"body"];
        [dict setObject:client forKey:@"client"];
        [dict setObject:clientVersion forKey:@"clientVersion"];
        [dict setObject:functionId forKey:@"functionId"];
        [dict setObject:openudid forKey:@"openudid"];

        NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"body",@"client",@"clientVersion",@"functionId" ,@"openudid",nil];

        NSString* strRc =  [%c(XXSignService) getSignWithDic: dict keys:array];

        NSLog(@"zytc: xx sign %@",strRc);

        NSString* html = [NSString stringWithFormat:@"{\"rc\":\"0\",\"sign\":\"%@\"}", strRc];
        return [GCDWebServerDataResponse responseWithHTML:html];

        // return [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>error!!!</p></body></html>"];                      

    }];

好了,持续编译装置下

而后拜访一下咱们的新接口

完满出工。

三、总结

勿在浮沙筑高台,咱们之前介绍的基础知识都是有用的,叠加一下就能够搞定简单的我的项目了。

原理都是有相通性的,Frida、xposed、Tweak 的开发都能够互相印证。

跨平台的开发,不如原生开发上手快,之前搞 Frida 的 NSDictionary NSArray 等 ObjectC 对象的结构和应用,搞了老半天,其实 ObjectC 的代码也就几行而已。

人们总感觉本人生存在骗局中,他们关怀的不是假相,他们只是须要一个与他们从前所见不同,而又荒诞不经的解释。

正文完
 0