飘云 发表于 2019-4-22 11:16:03

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

使用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,如下:# 安装
$ 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参数可以列出详细的使用提示,如下:$ frida -h
Usage: frida 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=HOSTconnect to remote frida-server on HOST
-f FILE, --file=FILEspawn 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=CODEevaluate 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”参数使得主线程继续跑下去,如下所示:
$ frida ./010\ Editor -l 010.js --no-pause

010.js就是我们新建的js文件,后续只需编辑它。
1.2 优雅调试
本次不需要使用LLDB、GDB等调试器,全程由IDA及Frida完成,你需要的仅仅是敲入一点点js。Go、Go、Go!!
1.2.1 寻找切入点
先输入注册码,弹出错误提示,如下图:
用IDA分析主程序,搜索字符串如下:

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

sub_1000E9680就是验证函数了,返回0xDB即可注册成功。
1.2.2 注入脚本
修改js文件内容如下: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”,如下图所示:
为了显示得更优雅,我们继续进行分析。
1.2.3 更改用户数
查看字符串的交叉引用,可以确定“qword_1006B4340 + 48”的位置控制了实际用户数量,而sub_1000EADA0则决定是否为“Site License”,如下图所示:

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

这里很简单,如果用户数大于999则表示是“Site License”。
现在来追踪qword_1006B4340,往上查看代码,发现sub_1000E9680函数再次引用了qword_1006B4340,如下图所示。

既然是这样,那我们在sub_1000E9680里面将“qword_1006B4340+48”修改掉不就好了么?看下一节分解。
1.2.4 再次注入
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.add(48), 10000);
      console.log("Enter CheckSN()")
    },
    onLeave: function(retval) {
      console.log("return:" + retval.toInt32());
      retval.replace(ptr(0xDB));
    },
});

加载脚本,效果如下:接下来,你就可以编写一个dylib进行注入,持久化破解它!
1.4 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优雅调试之门已经开启!!




wangwei628 发表于 2019-4-22 11:27:21

谢谢飘总分享!

dryzh 发表于 2019-4-22 11:28:01

飘总威武!过两天我也写个,分享个frida Python脚本hook Android 的。{:lol:}

Bu弃 发表于 2019-4-22 11:29:20

前排膜拜飘总

Rooking 发表于 2019-4-22 11:31:02

膜拜最近这个一下火起来了 好多人开始搞起了 学习了

wangwei628 发表于 2019-4-22 11:34:14

飘总再搞一个python的,现在python用的比较多

飘云 发表于 2019-4-22 11:35:36

wangwei628 发表于 2019-4-22 11:34
飘总再搞一个python的,现在python用的比较多

Python的模板就那么几句话,官方文档有~~ 我书里面也有写,到时可以有些高级用法{:lol:}

飘云 发表于 2019-4-22 12:38:45

应要求,补上Python脚本~~

不破不立 发表于 2019-4-22 14:19:12

跟着飘总学习,飘总出的书名是?

b23526 发表于 2019-4-22 14:52:18

坛主出书竟然没有在论坛里大力宣传?这不科学啊{:3_162:}@飘云
页: [1] 2 3
查看完整版本: 使用Frida优雅调试010 Editor[补上Python脚本]