飘云阁(PYG官方)

 找回密码
 快速注册

QQ登录

只需一步,快速开始

查看: 2095|回复: 28

[macOS] 使用Frida优雅调试010 Editor[补上Python脚本]

    [复制链接]
  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2019-4-22 11:16:03 | 显示全部楼层 |阅读模式
    使用Frida优雅调试010 Editor


    010 Editor(http://www.sweetscape.com/010editor)是目前少有的、功能极其强大的十六进制编辑工具,最出色的就是它独特的二进制模板技术,能够方便的分析任何二进制文件格式。它也是跨平台的,同时支持Windows、Linux及macOS。
    对010 Editor的分析已经很成熟了,论坛里面的教程也非常多,C版也写了在线注册机本文的目的是抛砖引玉介绍Frida在破解软件中的应用。我本人工作中使用Frida多年,但是一直没有时间对此做教程,这么好的工具没得到推广实属遗憾,今天抽空用010 Editor为例来讲解一些优雅的方法。

    1.1 Frida
    Frida是一个跨平台的轻量级Hook框架,支持所有主流操作系统,它可以帮助逆向人员对指定的进程进行分析。它主要提供了精简的Python接口和功能丰富的js接口,除了使用自身的控制台交互以外,还可以利用Python将js脚本库注入到目标进程。使用Frida可以获取进程详细信息、拦截和调用指定函数、注入代码、修改参数、从iOS应用程序中dump类和类方法信息等。
    Frida源代码托管在GitHub:https://github.com/frida/,感兴趣的读者可以下载回来阅读。

    1.1.1 安装方法
    对于调试本地应用来说,只需要安装主控端即可。可以安装到Windows、macOS、Linux等,本文仅以macOS端为例讲解。
    使用sudo权限,利用pip安装或升级frida及frida-tools,如下:
    [JavaScript] 纯文本查看 复制代码
    # 安装
    $ sudo pip install frida
    $ sudo pip install frida-tools
    $ frida --version
    12.4.8
    # 升级
    $ sudo pip install frida --upgrade
    $ sudo pip install frida-tools --upgrade

    1.1.2 基本使用
    使用-h参数可以列出详细的使用提示,如下:
    [JavaScript] 纯文本查看 复制代码
    $ frida -h
    Usage: frida [options] target
    
    Options:
      --version             show program's version number and exit
      -h, --help            show this help message and exit
      -D ID, --device=ID    connect to device with the given ID
      -U, --usb             connect to USB device
      -R, --remote          connect to remote frida-server
      -H HOST, --host=HOST  connect to remote frida-server on HOST
      -f FILE, --file=FILE  spawn FILE
      -n NAME, --attach-name=NAME
                            attach to NAME
      -p PID, --attach-pid=PID
                            attach to PID
      --debug               enable the Node.js compatible script debugger
      --enable-jit          enable JIT
      -l SCRIPT, --load=SCRIPT
                            load SCRIPT
      -c CODESHARE_URI, --codeshare=CODESHARE_URI
                            load CODESHARE_URI
      -e CODE, --eval=CODE  evaluate CODE
      -q                    quiet mode (no prompt) and quit after -l and -e
      --no-pause            automatically start main thread after startup
      -o LOGFILE, --output=LOGFILE
                            output to log file

    本次我们调试只需要使用“-l”参数加载脚本,并使用“--no-pause”参数使得主线程继续跑下去,如下所示:

    [Bash shell] 纯文本查看 复制代码
    $ frida ./010\ Editor -l 010.js --no-pause


    010.js就是我们新建的js文件,后续只需编辑它。

    1.2 优雅调试
    本次不需要使用LLDB、GDB等调试器,全程由IDA及Frida完成,你需要的仅仅是敲入一点点js。Go、Go、Go!!

    1.2.1 寻找切入点
    先输入注册码,弹出错误提示,如下图:
    15559001257391.jpg

    用IDA分析主程序,搜索字符串如下:
    15559003646476.jpg

    我们顺藤摸瓜往上可以查看到注册成功的提示:
    15559005761284.jpg

    sub_1000E9680就是验证函数了,返回0xDB即可注册成功。

    1.2.2 注入脚本
    修改js文件内容如下:
    [JavaScript] 纯文本查看 复制代码
    function get_rva(module, offset) {
        var base_addr = Module.findBaseAddress(module);
        if (base_addr == null)
            base_addr = enum_to_find_module(module);
        console.log(module + ':' + base_addr);
        var target_addr = base_addr.add(offset);
    
        return target_addr;
    }
    
    
    var target_addr = get_rva("010 Editor", 0xE9680);
    console.log("target_addr:" + target_addr);
    Interceptor.attach(ptr(target_addr), {
        onEnter: function(args) {
            console.log("Enter CheckSN()")
        },
        onLeave: function(retval) {
            console.log("return:" + retval.toInt32());
            retval.replace(ptr(0xDB)); // 修改返回值为0xDB
        },
    });


    get_rva()获取内存地址,Interceptor.attach是Frida提供的API,用来对某个地址实施附加,附加后就可以进行返回值替换等~,只需要处理onEnter(进入函数触发)、onLeave(离开函数触发)两个回调函数即可。这里使用retval.replace(ptr(0xDB))对返回值进行修改。
    将脚本注入后,发现破解成功了,但是有点遗憾的是显示“0 User License”,如下图所示:

    15559010502022.jpg
    为了显示得更优雅,我们继续进行分析。

    1.2.3 更改用户数
    查看字符串的交叉引用,可以确定“qword_1006B4340 + 48”的位置控制了实际用户数量,而sub_1000EADA0则决定是否为“Site License”,如下图所示:

    15559013825593.jpg

    先进入sub_1000EADA0函数看一下逻辑,如下图:

    15559015130455.jpg

    这里很简单,如果用户数大于999则表示是“Site License”。

    现在来追踪qword_1006B4340,往上查看代码,发现sub_1000E9680函数再次引用了qword_1006B4340,如下图所示。
    15559016206900.jpg

    既然是这样,那我们在sub_1000E9680里面将“qword_1006B4340+48”修改掉不就好了么?看下一节分解。

    1.2.4 再次注入
    [JavaScript] 纯文本查看 复制代码
    function get_rva(module, offset) {
        var base_addr = Module.findBaseAddress(module);
        if (base_addr == null)
            base_addr = enum_to_find_module(module);
        console.log(module + ':' + base_addr);
        var target_addr = base_addr.add(offset);
    
        return target_addr;
    }
    
    var target_addr = get_rva("010 Editor", 0xE9680);
    console.log("target_addr:" + target_addr);
    Interceptor.attach(ptr(target_addr), {
        onEnter: function(args) {
            Memory.writeInt(args[0].add(48), 10000);
            console.log("Enter CheckSN()")
        },
        onLeave: function(retval) {
            console.log("return:" + retval.toInt32());
            retval.replace(ptr(0xDB));
        },
    });


    加载脚本,效果如下:
    15559017968997.jpg
    接下来,你就可以编写一个dylib进行注入,持久化破解它!

    1.4 Python脚本
    应要求,补上Python脚本:
    [Python] 纯文本查看 复制代码
    import codecs
    import frida
    import sys
    
    def on_message(message, data):
        print("[%s] => %s" % (message, data))
    
    def main(pid):
        session = frida.attach(pid)
    
        with codecs.open('./010.js', 'r', 'utf-8') as f:
            source = f.read()
    
        #script = session.create_script('''js脚本''')
        script = session.create_script(source)
        script.on('message', on_message)
        script.load()
        sys.stdin.read()
        session.detach()
    
    if __name__ == '__main__':
        pid = frida.spawn("010 Editor")
        frida.resume(pid)
        main(pid)
    
    1.5 总结
    采用Frida你不需要关心Hook细节,只需要把重点放到分析上,是不是非常爽呢?当然,Frida对移动端的应用也是相当精彩的,有时间再给大伙分享。Frida优雅调试之门已经开启!!





    点评

    666,我要努力学习  发表于 2019-4-23 09:08

    评分

    参与人数 13威望 +28 飘云币 +28 收起 理由
    AssasinC + 1 + 1 期待移动端更新。
    xdnice + 1 + 1 赞一个,这个帖子很给力!
    小范 + 1 + 1 PYG有你更精彩!
    九层楼 + 1 + 1 感谢发布原创作品,PYG有你更精彩!
    small-q + 8 + 8 赞一个,这个帖子很给力!
    Master.lu + 1 + 1 感谢发布原创作品,PYG有你更精彩!
    610100 + 1 + 1 感谢发布原创作品,PYG有你更精彩!
    yxg888 + 5 + 5 感谢发布原创作品,PYG有你更精彩!
    风轻云淡 + 1 + 1 感谢发布原创作品,PYG有你更精彩!
    不破不立 + 1 PYG有你更精彩!

    查看全部评分

  • TA的每日心情
    开心
    2019-12-18 15:33
  • 签到天数: 244 天

    [LV.8]以坛为家I

    发表于 2019-4-22 11:27:21 | 显示全部楼层
    谢谢飘总分享!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-9 22:48
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2019-4-22 11:28:01 | 显示全部楼层
    飘总威武!过两天我也写个,分享个frida Python脚本hook Android 的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-11-15 10:08
  • 签到天数: 104 天

    [LV.6]常住居民II

    发表于 2019-4-22 11:29:20 | 显示全部楼层
    前排膜拜飘总
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-25 15:21
  • 签到天数: 487 天

    [LV.9]以坛为家II

    发表于 2019-4-22 11:31:02 | 显示全部楼层
    膜拜最近这个一下火起来了 好多人开始搞起了 学习了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-12-18 15:33
  • 签到天数: 244 天

    [LV.8]以坛为家I

    发表于 2019-4-22 11:34:14 | 显示全部楼层
    飘总再搞一个python的,现在python用的比较多

    点评

    Python的模板就那么几句话,官方文档有~~ 我书里面也有写,到时可以有些高级用法  详情 回复 发表于 2019-4-22 11:35
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-22 11:35:36 | 显示全部楼层
    wangwei628 发表于 2019-4-22 11:34
    飘总再搞一个python的,现在python用的比较多

    Python的模板就那么几句话,官方文档有~~ 我书里面也有写,到时可以有些高级用法
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-22 12:38:45 | 显示全部楼层
    应要求,补上Python脚本~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 806 天

    [LV.10]以坛为家III

    发表于 2019-4-22 14:19:12 | 显示全部楼层
    跟着飘总学习,飘总出的书名是?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 247 天

    [LV.8]以坛为家I

    发表于 2019-4-22 14:52:18 | 显示全部楼层
    坛主出书竟然没有在论坛里大力宣传?这不科学啊@飘云
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 快速注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|飘云阁安全论坛 ( 粤ICP备15107817号-2 )|扫码赞助

    Powered by Discuz! X3.3© 2001-2017 Comsenz Inc.

      
    快速回复 返回顶部 返回列表