查看: 31|回复: 0

[公众号] mac使用frida

[复制链接]

2

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2008-1-5
发表于 2019-6-20 09:10:00 | 显示全部楼层 |阅读模式

mac使用frida

安装

https://github.com/frida/frida/releases

根据手机的cpu的版本,选择相应的文件,一般通过手机信息可以看到
我这里是frida-server-12.6.7-android-arm64.xz
下载地址
链接: https://pan.baidu.com/s/15_026MJ4RULG6AJ5L3rejw 密码: 7kn7
解压frida-server-12.6.7-android-arm64.xz,然后把解压后的文件重命名frida-server
后来我使用genymotion,查看系统为x86。


补充arm64手机截图

所以下载了frida-server-12.7.5-android-x86.xz文件,然后解压并重命名为frida-server。
执行命令frida-server。
依次执行下面命令

$ adb push frida-server /data/local/tmp/ 
$ adb shell "chmod 755 /data/local/tmp/frida-server"
$ adb shell "/data/local/tmp/frida-server &"

然后在电脑上测试手机是否连通

$ adb devices -l

Frida大致原理是手机端安装一个server程序,然后把手机端的端口转到PC端,PC端写python脚本进行通信,而python脚本中需要hook的代码采用javascript语言。所以这么看来我们首先需要安装开始安装frida了,直接运行命令:

 /Applications/Python\ 3.6/Install\ Certificates.command
python3.6 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn frida frida-tools

我这大概要等很长时间才下载完。
然后执行命令

frida-ps -U -ai | grep -v '@' | grep -v '    -  '

看到类似的结果

  PID  Name
-----  -----------------------------------------------------------------
 2681  .dataservices
  835  ATFWD-daemon
12174  adbd
  844  adsprpcd
  845  adsprpcd
  745  android.hardware.audio@2.

即可。

插曲okttp3

okhttp3没混淆的hook

try {

    var CertificatePinner = Java.use('okhttp3.CertificatePinner');

    quiet_send('OkHTTP 3.x Found');

    CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function () {

        quiet_send('OkHTTP 3.x check() called. Not throwing an exception.');
    }

} 

okhttp3混淆的话
改为混淆的名字我这里是d.k.a,
Java.use表示使用d包的k类,然后后面CertificatePinner.a.overload
表示hook a方法

/*** okhttp3.x unpinning ***/

// Wrap the logic in a try/catch as not all applications will have
// okhttp as part of the app.
try {
    var CertificatePinner = Java.use('d.k');

    quiet_send('OkHTTP 3.x Found');

    CertificatePinner.a.overload('java.lang.String', 'java.util.List').implementation = function () {

        quiet_send('OkHTTP 3.x check() called. Not throwing an exception.');
    }

} catch (err) {

    // If we dont have a ClassNotFoundException exception, raise the
    // problem encountered.
    if (err.message.indexOf('ClassNotFoundException') === 0) {

        throw new Error(err);
    }
}

application脚本

# -*- coding: utf-8 -*-
import frida, sys, re, sys, os
from subprocess import Popen, PIPE, STDOUT
import codecs, time 

if (len(sys.argv) > 1):
    APP_NAME = str(sys.argv[1])
else:
    APP_NAME = "com.loco.example.OkHttp3SSLPinning"

def sbyte2ubyte(byte):
    return (byte % 256)

def print_result(message):
    print ("[!] Received: [%s]" %(message))

def on_message(message, data):
    if 'payload' in message:
        data = message['payload']
        if type(data) is str:
            print_result(data)
        elif type(data) is list:
            a = data[0]
            if type(a) is int:
                hexstr = "".join([("%02X" % (sbyte2ubyte(a))) for a in data])
                print_result(hexstr)
                print_result(hexstr.decode('hex'))
            else:
                print_result(data)
                print_result(hexstr.decode('hex'))
        else:
            print_result(data)
    else:
        if message['type'] == 'error':
            print (message['stack'])
        else:
            print_result(message)


def kill_process():
    cmd = "adb shell pm clear {} 1> /dev/null".format(APP_NAME)
    os.system(cmd)

#kill_process()

try:
    with codecs.open("hooks.js", 'r', encoding='utf8') as f:
        jscode  = f.read()
        device  = frida.get_usb_device(timeout=5)
        #pid     = device.spawn([APP_NAME])
        session = device.attach("com.loco.example.OkHttp3SSLPinning")
        script  = session.create_script(jscode)
        #device.resume(APP_NAME)
        script.on('message', on_message)
        print ("
  • Intercepting on {} ...".format(APP_NAME)) script.load() sys.stdin.read() except KeyboardInterrupt: print ("[!] Killing app...") kill_process() time.sleep(1) kill_process()
  • 异常处理

    frida Unable to load SELinux policy from the kernel: Failed to open file ?/sys/fs/selinux/policy?: Permission denied

    主要原因是没有开启su权限。

    综合脚本:

    # -*- coding: utf-8 -*-
    # @时间 : 2020/10/28 10:48 下午
    # @作者 : 陈祥安
    # @文件名 : install_frida.py
    # @公众号: Python学习开发
    import subprocess
    import sys
    import six
    import os
    from loguru import logger
    import requests
    from tqdm import tqdm
    
    
    _temp = os.path.dirname(os.path.abspath(__file__))
    frida_server_path = os.path.join(_temp, "fs1280")
    if not os.path.exists(frida_server_path):
        os.makedirs(frida_server_path)
    
    
    def download_from_url(url, dst):
        response = requests.get(url, stream=True)  # (1)
        file_size = int(response.headers['content-length'])  # (2)
        if os.path.exists(dst):
            first_byte = os.path.getsize(dst)  # (3)
        else:
            first_byte = 0
        if first_byte >= file_size:  # (4)
            return file_size
        header = {"Range": f"bytes={first_byte}-{file_size}"}
        pbar = tqdm(
            total=file_size, initial=first_byte,
            unit='B', unit_scale=True, desc=dst)
        req = requests.get(url, headers=header, stream=True)  # (5)
        with(open(dst, 'ab')) as f:
            for chunk in req.iter_content(chunk_size=1024):  # (6)
                if chunk:
                    f.write(chunk)
                    pbar.update(1024)
        pbar.close()
        return file_size
    
    
    class IsNotPython3(ValueError):
        def __str__(self):
            return "请安装python3"
    
    
    def adb_operation(fs_file):
        """
    
        :param fs_file:
        :return:
        """
    
        command = f"""
            adb push {fs_file} /data/local/tmp/;
            adb shell "chmod 755 /data/local/tmp/fs1280";
            adb shell "/data/local/tmp/fs1280 &";
        """
        completed = subprocess.run(command, check=True, shell=True,
                                   stdout=subprocess.PIPE)
        logger.info(completed.stdout.decode("utf-8"))
    
    
    def get_python_version():
        python_version = sys.version_info
        py3 = six.PY3
        if py3:
            if python_version > (3, 6) and python_version < (3, 7):
                logger.info("完美的python3.6环境")
            else:
                logger.warning("如果出现问题请尝试使用Python3.6")
        else:
            raise IsNotPython3
    
    
    def get_frida_server():
        # arm64
        logger.info("开始下载frida-server 版本arm64")
        file_name = "fs1280"
        url = "https://github.com/frida/frida/releases/download/12.8.0/frida-server-12.8.0-android-arm64.xz"
        frida_full_path = os.path.join(frida_server_path, file_name)
        download_from_url(url, dst=frida_full_path)
        logger.info("下载frida-server成功!")
        adb_operation(frida_full_path)
    
    
    def main():
        get_python_version()
        install_list = ["frida==12.8.0", "frida-tools==5.3.0", "objection==1.8.4"]
        python_path = sys.executable
        for install_item in install_list:
            logger.info(f"当前安装的是:{install_item.split('==')[0]}")
    
            try:
                command = f'{python_path} -m pip install {install_item}'
                completed = subprocess.run(command, check=True, shell=True,
                                           stdout=subprocess.PIPE)
                result = completed.stdout.decode("utf-8")
                logger.info(result)
            except subprocess.CalledProcessError:
                raise ValueError(f"{install_item},安装失败")
        get_frida_server()
    
    
    if __name__ == '__main__':
        main()
    
    


    来源:https://www.cnblogs.com/c-x-a/p/11056627.html
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

    Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

    在本版发帖返回顶部