App逆向Frida--hook

一、引言

做爬虫的朋友,经常会遇到逆向app的场景,大多数app通过反编译,然后硬撸代码,不过效率很低,因为没办法像js一样动态调试加断点得出传递的参数与返回的结果。不过运用frida 实现hooke可以用一个新的函数替代原来的函数,在这个新的函数中你可以通过自定义实现调试拿取你想要的数据。

二、Frida简介

  • Frida是一个动态代码检测工具箱。
  • 它使您可以将JavaScript片段或自己的库片段注入Windows,macOS,GNU /Linux,iOS,Android和QNX上的本机应用程序中。
  • Frida还提供了一些基于Frida API的工具。

三、Frida安装

3.1 根据Frida官网记载,可以通过pyhton,pip下载,如下
App逆向Frida--hook_第1张图片

3.2 使用pip命令下载

 pip install frida-tools

3.3 也可以手动从Frida的GitHub版本页面中获取
3.4 安装AndroidSDK(省略…后期补上)
3.5 配置模拟器(推荐可以用夜深模拟器)
3.5 配置Frida-server(省略…后期补上)

四、实现Hook

4.1 Frida官网有一个猜拳小游戏的app例子:CTF 2015 APK
4.2 安装apk到模拟器,如下所示
App逆向Frida--hook_第2张图片
4.3 python代码

import frida, sys


def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)


jscode = open("1.js","r",encoding="utf-8").read()



process = frida.get_remote_device().attach('com.example.seccon2015.rock_paper_scissors')

"""注入"""
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
"""是设置消息传出时的回调"""
sys.stdin.read()

4.4 js代码

/**
 * Java.perform
 * 确保当前线程已经连接VM
 * **/
Java.perform(function () {
    // Function to hook is defined here
    var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');   //Java.use 指向某个类的指针,参数中com.example.seccon2015.rock_paper_scissors.MainActivity就是我i们需要HOOK的哪个类

    // Whenever button is clicked

    //
    /**
     * Call the original onClick handler
     * 思就是Hook前面获取到的类中的onClick方法,后面跟着的赋值函数的部分,函数的参数为对应要Hook方法的参数,
     * 内部执行的部分就是在对应方法被调用时所执行的代码,
     * 这里它是先打了一个onClick日志,
     * 然后调用了原始方法(如果不调用的话原始方法不会被执行),
     * 接着它将m、n、cnt(变量具体含义请自行反编译APP后查看代码)的值做了修改,
     * 最后,它又打了一个携带着cnt变量值的日志。
     * **/
    var onClick = MainActivity.onClick;
    onClick.implementation = function (v) {
        // Show a message to know that the function got called
        send('onClick');


        onClick.call(this, v);

        // Set our values after running the original onClick handler
        this.m.value = 0;
        this.n.value = 1;
        this.cnt.value = 999;

        // Log to the console that it's done, and we should have the flag!
        console.log('Done:' + JSON.stringify(this.cnt));
    };

    console.log('Done:'+name)
});

4.5 hook结果
App逆向Frida--hook_第3张图片

你可能感兴趣的:(Python)