IOS 聯真機簽名解決方案

1、目標

咱們以前介紹過 IOS 某電商App簽名算法解析 二 Frida RPC調用IOS Theos Tweak 之 HelloWorld 。 那麼他們搭配起來能解決什麼問題呢?html

在Android聯真機簽名方案中,咱們提到過Frida rpc方案的缺點:ios

  • frida不是很穩定,偶爾會崩潰出退
  • frida啓動須要連PC (不過這個缺點已經被 Xcube frida腳本持久化 給解決了)

那麼在Ios下有沒有相似Xposed的東東?c++

是的,就是 Tweak。git

2、步驟

GCDWebServer

GCDWebServer 是一個基於 GCD 的輕量級服務器框架,用於內嵌到 MacOS或者iOS 系統的應用中,提供 HTTP 的服務。github

他的代碼在這裏 github.com/swisspol/GC…web

咱們先建立一個 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上下載的代碼複製到工程目錄spring

code.png

編輯下MakeFile文件,把GCDWebServer的代碼加進去swift

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服務api

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/

hello.png

熟悉的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>"];                      

    }];

複製代碼

好了,繼續編譯安裝下

而後訪問一下咱們的新接口

rc.png

完美收工。

3、總結

勿在浮沙築高臺,咱們以前介紹的基礎知識都是有用的,疊加一下就能夠搞定複雜的項目了。

原理都是有相通性的,Frida、xposed、Tweak的開發均可以相互印證。

跨平臺的開發,不如原生開發上手快,以前搞Frida的 NSDictionary NSArray等ObjectC對象的構造和使用,搞了老半天,其實ObjectC的代碼也就幾行而已。

ffshow.jpeg

人們總以爲本身生活在騙局中,他們關心的不是真相,他們只是須要一個與他們從前所見不一樣,而又合情合理的解釋。

TIP: 本文的目的只有一個就是學習更多的逆向技巧和思路,若是有人利用本文技術去進行非法商業獲取利益帶來的法律責任都是操做者本身承擔,和本文以及做者不要緊,本文涉及到的代碼項目能夠去 奮飛的朋友們 知識星球自取,歡迎加入知識星球一塊兒學習探討技術。有問題能夠加我wx: fenfei331 討論下。

關注微信公衆號: 奮飛安全,最新技術乾貨實時推送

相關文章
相關標籤/搜索