用户
搜索
  • TA的每日心情
    开心
    2018-9-11 11:32
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]经常看看I

    i春秋-核心白帽

    Rank: 4

    80

    主题

    105

    帖子

    1153

    魔法币
    收听
    0
    粉丝
    19
    注册时间
    2016-6-6
    发表于 2018-10-22 15:11:04 111180

    上期的Android逆向之动态分析so篇大家学习的如何啦?本期斗哥将带来Android逆向之动态分析Frida篇。主要内容有Frida环境搭建与Frida在Android环境下的运行与使用。

    0X01 Frida框架安装详解

    1.简述:

    Frida是以Python为载体,注入Javascript作为Android中执行代码的一款Hook框架,可用Android、ios、linux、win等平台。

    2.安装客户端:

    在已有python和pip环境的系统下安装frida,如windows则使用pip install frida-tools命令安装frida包。

    da.webp.jpg

    使用frida命令查看版本(成功查看到frida版本表示安装成功)。

    成功.webp.jpg

    2. 安装服务端:

    首先到github上下载frida-server,网址为https://github.com/frida/frida/releases
    下载与客户端相同版相同的frida-server(注意位数)。
    在客户端(windows)上使用adb push命令将frida-servser传到Android设备目录中。
    目录.webp.jpg

    修改frida-servser权限,让frida-servse拥有可执行权限。

    执行.webp.jpg

    运行frida服务器。
    服务器.webp.jpg

    在客户端开启端口转发。
    adb forward tcp:27042 tcp:27042
    adb forward tcp:27043 tcp:27043
    043.webp.jpg

    使用frida-ps -U或者frida-ps -R命令查看手机端进程(成功查看到进程表示Frida环境搭建成功)。

    成功.webp.jpg

    0X02 Frida框架的初步使用

    将frida服务器运行起来后,客户端就可以利用frida API对Android设备中的进程以及APP应用进行操作。

    例一:

    使用Frida获取android手机当前最前端Activity所在的进程。
    [PHP] 纯文本查看 复制代码
    import frida
    
    rdev = frida.get_usb_device()
    
    front_app = rdev.get_frontmost_application()
    
    print(front_app)


    例1.webp.jpg

    例二:

    查看手机所有已安装的android APP应用。
    [PHP] 纯文本查看 复制代码
    import frida
    
    rdev = frida.get_usb_device()
    
    apps = rdev.enumerate_applications()
    
    for app in apps:
    
       print(app)


    应用.webp.jpg

    例三:
    frida自带的Messages机制与进程交互模板。

    [PHP] 纯文本查看 复制代码
    import frida, sys
    
    def on_message(message, data):
    
       if message['type'] == 'send':
    
           print("[*] {0}".format(message['payload']))
    
       else:
    
           print(message)
    
    jscode = """
    
    //分析hook点,编写javascript代码
    
    //javascript代码,重点
    
    """
    
    process = frida.get_usb_device().attach('ds.tetris.android')
    
    script = process.create_script(jscode)
    
    script.on('message', on_message)
    
    script.load()
    
    sys.stdin.read()



    0X03 Frida框架解题技巧

    Frida可以用来解决CTF中移动安全题,如Frida官网的一个APP例子,就是一道CTF题。以如下的CTF题为例,通过解题过程深入了解Frida的使用。

    1. 题目描述:

    寻一名可以拿到20000分的高手,在线等很急!

    2. 寻找hook点:

    MainActivity部分代码如下:
    静态分析得到getScore()方法是记录分数的关键。

    [PHP] 纯文本查看 复制代码
    public final void invoke(@NotNull Score arg6) {
    
       Intrinsics.checkParameterIsNotNull(arg6, "$receiver");
    
       if(arg6.getScore() > 20000) {
    
           Game.access$getView$p(Game.this).setScore(0xFFFFFFFF);
    
       }
    
       else {
    
           Game.access$getView$p(Game.this).setScore(arg6.getScore());
    
       }
    
       if(Game.access$getView$p(Game.this).getLevel() < arg6.getLevel() && Game.access$getView$p(Game.this).getLevel() != 0 && (Game.this.getSoundEnabled())) {
    
           DefaultImpls.play$default(Game.access$getSoundtrack$p(Game.this), Sound.LEVEL_UP, 0, 2, null);
    
       }
    
       Game.access$getView$p(Game.this).setLevel(arg6.getLevel());
    
    }
    
    


    Hook点:setScore方法值置为-1,程序将就会自动为我们解密flag。

    [PHP] 纯文本查看 复制代码
    public void setScore(int arg4) {
    
       if(arg4 == -1) {
    
           UtilsKt.errorhandler(this);
    
       }
    
       this.score = arg4;
    
       View v0 = this._$_findCachedViewById(id.scoreLabel);
    
       Intrinsics.checkExpressionValueIsNotNull(v0, "scoreLabel");
    
       ((TextView)v0).setText("Score: " + arg4);
    
    }


    3. 解题过程:

    (请先阅读Android逆向之静态分析文章)
    静态分析完应用逻辑后可知只要将 MainActivity 中的 setScore方法参数值设为-1,程序就会自动为我们解密flag,所以可以通过Frida框架重写setScore方法将值直接设为-1。

    -1.webp.jpg

    用frida-ps -R发现应用进程。

    发现.webp.jpg

    Javascript脚本如下:

    [PHP] 纯文本查看 复制代码
    Java.perform(function() {
    
       var clz = Java.use("ds.tetris.android.MainActivity");
    
     clz.setScore.overload('int').implementation = function(args){
    
     args = -1
    
     clz.setScore.overload('int').call(this,args)
    
     }
    
     });



    运行服务器frida-server,客户端使用Frida运行以下命令:

    命令.webp.jpg

    点击游戏开始,程序会解密并弹窗。

    弹窗.webp.jpg

    完整的python代码如下:

    [PHP] 纯文本查看 复制代码
    import frida, sys
    
    def on_message(message, data):
    
       if message['type'] == 'send':
    
           print("[*] {0}".format(message['payload']))
    
       else:
    
           print(message)
    
    jscode = """
    
    Java.perform(function() {
    
       var clz = Java.use("ds.tetris.android.MainActivity");
    
     clz.setScore.overload('int').implementation = function(args){
    
     args = -1
    
     clz.setScore.overload('int').call(this,args)
    
     }
    
     });
    
    """
    
    process = frida.get_usb_device().attach('ds.tetris.android')
    
    script = process.create_script(jscode)
    
    script.on('message', on_message)
    
    script.load()
    
    sys.stdin.read()



    0X04小小总结

    本期Android逆向之动态分析Frida篇就为大家介绍到这里啦!各位小伙伴如果在学习的过程中有疑问或者是其他的见解,都可以给斗哥留言!我们下周见!

    qrcode_for_gh_223e082fe8a7_344.jpg

    发表于 2018-10-22 20:18:01
    学习了。。。
    http://www.anonymou5.com
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册