一、指标
咱们之前介绍过 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.plNIC 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_serviceChoose a Template (required): 15Project Name (required): ldqsignPackage Name [com.yourcompany.ldqsign]: Author/Maintainer Name [fenfei]: fenfei[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: XX4iPhoneInstantiating iphone/tweak in ldqsign/...Done.
而后把github上下载的代码复制到工程目录
编辑下MakeFile文件,把GCDWebServer的代码加进去
ARCHS = armv7 arm64TARGET := iphone:clang:latest:7.0INSTALL_TARGET_PROCESSES = JD4iPhoneADDITIONAL_OBJCFLAGS = -fobjc-arcinclude $(THEOS)/makefiles/common.mkTWEAK_NAME = ldqsignldqsign_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/Responsesldqsign_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的代码也就几行而已。
人们总感觉本人生存在骗局中,他们关怀的不是假相,他们只是须要一个与他们从前所见不同,而又荒诞不经的解释。