手把手教你搭個Frida + Sekiro Rpc框架

語言: CN / TW / HK

一、目標

聯手機簽名是個比較取巧的方案,之前我們介紹過

android連真機簽名公網ip更新方案

http://91fans.com.cn/post/androidipsend/

Sekiro + Xposed 簽名解決方案

http://91fans.com.cn/post/sekiroone/

現在frida用的比較多,並且Sekiro也升級了新版本,我們今天就來手把手教你搭個 Frida + Sekiro Rpc框架。

二、步驟

我們以這個手機號加密演算法為例

http://91fans.com.cn/post/smallvideosignthr/

先執行伺服器端

官網在這裡 http://github.com/virjar/sekiro

git clone下來;

在Linux或者mac上,執行指令碼 build_demo_server.sh,之後得到釋出壓縮包:sekiro-service-demo/target/sekiro-release-demo.zip

如果是windows,或者不想自己構建,可以在這裡直接下載

http://oss.virjar.com/sekiro/sekiro-demo

把zip包傳到伺服器上去解壓

sekirorun.png

window下執行 sekiro.bat

Linux/mac下執行 sekiro.sh

這樣伺服器端就跑起來。

firda開發sekiro客戶端

sekiro是個相當牛X的庫,基本上就是開箱即用了。

// 在普通Android應用中使用sekiro new SekiroClient("test-android", UUID.randomUUID().toString()) .setupSekiroRequestInitializer(new SekiroRequestInitializer() { @Override public void onSekiroRequest(SekiroRequest sekiroRequest, HandlerRegistry handlerRegistry) { handlerRegistry.registerSekiroHandler(new ClientTimeHandler()); } }).start();

在Android程式碼裡面這樣一條api就可以了,然後在ClientTimeHandler類裡面寫邏輯

frida使用就稍稍有點複雜,複雜的點就在於要建立一個java類 ClientTimeHandler 來處理呼叫邏輯。

``` function initSekiro() { const SekiroClient = Java.use('com.virjar.sekiro.business.api.SekiroClient'); const ActionHandler = Java.use('com.virjar.sekiro.business.api.interfaze.ActionHandler'); const SekiroRequestInitializer = Java.use('com.virjar.sekiro.business.api.interfaze.SekiroRequestInitializer');

//  註冊一個ClientTimeHandler類,繼承 ActionHandler
const ClientTimeHandler = Java.registerClass({
    name: 'ClientTimeHandler',
    implements: [ActionHandler],
    methods: {
        action: function () {
            return 'mobile';
        },
        handleRequest: function (sekiroRequest, sekiroResponse) {
            const requestJsonData = sekiroRequest.getJsonModel();
            const requestData = JSON.parse(requestJsonData)['requestData'];

            if(!requestData){
                sekiroResponse.failed(JavaString.$new('requestData 不能為空'));
            }else{
                try{
                    sekiroResponse.success(callMobile(requestData));
                }catch(error){
                    sekiroResponse.failed(JavaString.$new(error.stack));
                    throw error;
                }
            }
        }
    }
})

// 註冊一個 SekiroRequestDefault類, 繼承SekiroRequestInitializer const SekiroRequestDefault = Java.registerClass({ name: "SekiroRequestDefault", implements: [SekiroRequestInitializer], methods: { onSekiroRequest: function (sekiroRequest, handlerRegistry) { handlerRegistry.registerSekiroHandler(ClientTimeHandler.$new()); } } });

const clientID = guid();
const group = 'fridaHook_atlasEncrypt';
const ip = '110.42.246.110';

 // 服務端埠號 預設是 conf/config.properties 裡面配置5620, 這裡改成了 8989
const sekiro = SekiroClient.$new(group, clientID, ip, 8989);
sekiro.setupSekiroRequestInitializer(SekiroRequestDefault.$new());
sekiro.start();

} ```

這就可以了,掛上frida跑起來

sekiro狀態檢視和訪問服務

http://110.42.246.110:8989/business-demo/groupList 展示當前系統中註冊過的所有 group

{"data":["fridaHook_atlasEncrypt"],"ok":true,"status":0}

http://110.42.246.110:8989/business-demo/clientQueue?group=fridaHook_atlasEncrypt 展示特定 group 下,註冊過那些客戶端/手機。

{"data":["65c8e8b5-1a67-2036-5b38-769cb670aeb3"],"ok":true,"status":0}

執行一下看看結果

```

-- coding: utf-8 --

import requests

url = 'http://110.42.246.110:8989/business-demo/invoke'

mobileid = '18913872618'

data = { 'group': 'fridaHook_atlasEncrypt', 'action': 'mobile', 'requestData': mobileid }

res = requests.post(url,json=data).json() print(res['data']) ```

結果很完美

3sCt3iAAMzIwOTAxMjA4AM8HAO7Jtk8ia8xTExAAAACFS7z70nRA3Ppgtdz9Kefb

收工上鮮啤

三、總結

基本上java的庫,frida都可以無縫利用。比Xposed玩起來方便多了。

有個小小的問題是 frida hook的app有崩潰的機率, 這個就需要搞個看門狗來實現了。

sekiro 官方文件

http://sekiro.virjar.com/sekiro-doc/index.html

frida 載入 sekiro dex 檔案 實現與服務端互動

http://www.qinless.com/387

ffshow.jpeg

這才知道我全部的努力,不過是完成了普通的生活。

TIP: 本文的目的只有一個就是學習更多的逆向技巧和思路,如果有人利用本文技術去進行非法商業獲取利益帶來的法律責任都是操作者自己承擔,和本文以及作者沒關係,本文涉及到的程式碼專案可以去 奮飛的朋友們 知識星球自取,歡迎加入知識星球一起學習探討技術。有問題可以加我wx: fenfei331 討論下。

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