frida环境搭建及hook入门

admin 2024年8月6日20:58:481 119 views字数 6497阅读21分39秒阅读模式

frida是什么

frida环境搭建及hook入门

frida环境搭建

frida为CS架构,需要安装客户端和服务端

  1. 安装客户端
    需要提前准备好python3环境,执行pip install frida-tools命令即可完成frida客户端的安装(可以通过-i参数指定国内镜像源,加快安装过程,如阿里镜像源地址为https://mirrors.aliyun.com/pypi/simple/),客户端安装完成后将支持frida、frida-ps、frida-trace、frida-discover、frida-ls-devices、frida-kill等一系列命令。
  2. 安装服务端
    server端需要安装在要hook的主机上,server端的安装版本必须与客户端版本一致,且server端的安装包文件必须和主机的CPU架构匹配。这里以mumu android模拟器12为例,首先使用adb shell getprop ro.product.cpu.abi查看CPU架构,如下结果为x86_64,则下载frida-server-16.1.3-android-x86_64.xz,解压后上传到/data/local/tmp目录下,并赋权777。
PS C:Usersxxx> adb shell getprop ro.product.cpu.abi
x86_64

frida环境搭建及hook入门

执行adb shell "/data/local/tmp/frida-server-16.1.3-android-x86_64 &"启动服务端

server端下载链接:https://github.com/frida/frida/releases

3. 检查安装是否成功
在客户端执行frida-ps -U,如果能返回手机端运行的进程则说明frida环境搭建成功

PS C:Usersxxx> frida-ps -U
 PID  Name
----  ------------------------------------------------
1450  adbd
1568  android.ext.services
...
2437  应用中心
2666  抖音
2008  设置

4. 端口转发
后续执行frida注入可能会提示找不到设备,这时尝试添加端口转发,27042是默认客户端和服务端通信端口,不确定27043是不是必须的,网上搜索的结果都是两个端口都加入了转发。

adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

hook入门

frida环境搭建只是第一步,怎么使用frida才是真正的挑战,因为掌握它需要软件开发技能、软件逆向技能、操作系统等各种能力,能力越强越能发挥出它的威力,这里仅给出简单的入门示例,因为我也是新手。

1. 开发一个简单的android app
因为我不熟悉android开发,为了让自己对android app结构有个初步的认识,我参考网上的教程开发了一个简单的app,这个app就是求两个数的和。如果你已经很熟悉android app开发请直接忽略这一步。

frida环境搭建及hook入门

布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="a:">

</TextView>
<EditText
android:id="@+id/a"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
tools:ignore="TouchTargetSizeCheck,SpeakableTextPresentCheck"
android:ems="10">

</EditText>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="b:">

</TextView>
<EditText
android:id="@+id/b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
tools:ignore="TouchTargetSizeCheck,SpeakableTextPresentCheck"
android:ems="10">

</EditText>
</LinearLayout>

<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sum">

</Button>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="a+b = ">

</TextView>
<TextView
android:id="@+id/c"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textColor="#0aaaaa"
android:text=""
android:ems="10">

</TextView>
</LinearLayout>
</LinearLayout>

MainActivity.java,调用了
com.example.hookdemo.HookDemo的Add方法

package com.example.appdemo;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.example.hookdemo.HookDemo;
public class MainActivity extends AppCompatActivity {
private TextView tvc;
private EditText edta, edtb;
private Button btn;
private int numC;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)this.findViewById(R.id.btn);
edta = (EditText)this.findViewById(R.id.a);
edtb = (EditText)this.findViewById(R.id.b);
tvc = (TextView)this.findViewById(R.id.c);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String inputA = edta.getText().toString();
String inputB = edtb.getText().toString();
int numA = Integer.valueOf(inputA).intValue();
int numB = Integer.valueOf(inputB).intValue();
numC = HookDemo.Add(numA, numB);
tvc.setText(String.valueOf(numC));
}
});
}
}

HookDemo.java

package com.example.hookdemo;

public class HookDemo {
public static int Add(int a, int b) {
return a + b;
}
}

接下来我们就hook这个求和的Add方法,注入我们自己的代码实现直接修改求和的入参。

2. 运行python代码进行注入
frida的脚本是通过python来编写的,但是真正的注入代码是使用JavaScript来写,下面的示例python代码将注入js代码写在jscode变量中,这里需要特别注意的是frida官网给出的示例frida.get_usb_device().attach方式传入的是包名,但是实际测试发现报错frida.ProcessNotFoundError: unable to find process with name 'com.example.appdemo',提示找不到这个进程。解决的办法是通过adb shell ps命令找到对应的pid,直接传入pid可以正常运行。

import frida, sys

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

jscode = """
// 确保当前线程附件到虚拟机并调用其中的方法
Java.perform(() => {
// hook的包名
var hookdemo = Java.use('com.example.hookdemo.HookDemo');
// 注入hook方法的代码
hookdemo.Add.implementation = function (a, b) {
// 直接修改入参a、b为固定值
a = 12;
b = 13;
var res = this.Add(a, b);
console.log(a, b, res);
// 向frida客户端发送消息
send(JSON.stringify({
"a": a,
"b": b,
"c":res
}));
return res;
}
});
"""

# 通过adb shell ps找到注入app对应的pid
# process = frida.get_usb_device().attach("com.example.appdemo")
process = frida.get_usb_device().attach(2620)
script = process.create_script(jscode)
# 当收到message时调用on_message
script.on("message", on_message)
script.load()
sys.stdin.read()

运行python脚本,然后在mumu模拟器输入两个数并点击求和按钮就会触发调用Add方法,这时控制台会打印message消息以及console.log的打印信息,而app显示的求和结果也被改变了,说明我们的代码成功注入app并实现了改变原有方法的行为。

frida环境搭建及hook入门

frida环境搭建及hook入门

3. 命令行形式进行注入

除了运行python脚本的方式进行注入之外,也可以在客户端输入命令方式进行代码注入,直接将js代码单独保存为hook.js文件

// 确保当前线程附件到虚拟机并调用其中的方法
Java.perform(() => {
    // hook的包名
    var hookdemo = Java.use('com.example.hookdemo.HookDemo');
    // 注入hook方法的代码
    hookdemo.Add.implementation = function (a, b) {
        // 直接修改入参a、b为固定值
        a = 12;
        b = 13;
        var res = this.Add(a, b);
        console.log(a, b, res);
        // 向frida客户端发送消息
        send(JSON.stringify({
            "a": a,
            "b": b,
            "c":res
        }));
        return res;
    }
});

frida-ps -U列出运行的进程id和进程名,找到需要注入的app名称,示例为appDemo

PS C:Usersxxx> frida-ps -U
 PID  Name
----  ------------------------------------------------
2228  abb
1302  adbd
...
2620  appDemo
1041  audioserver
1064  cameraserver

执行frida -U 进程名 -l xx.js即可进行注入测试,注入成功会显示如下打印信息

C:Usersxxx>frida -U hello_world -l hook1.js
     ____
    / _  |   Frida 16.1.3 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at https://frida.re/docs/home/
   . . . .
   . . . .   Connected to PGAM10 (id=127.0.0.1:16384)
Attaching...
start
<class: com.example.hookdemo.Student>
[PGAM10::hello_world ]->

然后在mumu模拟器输入两个数并点击求和按钮触发调用Add方法,求和结果始终为25,因为注入的代码将a、b改为了固定的值。控制台也会打印相应的信息,说明我们注入的代码已经工作了。

frida环境搭建及hook入门

frida环境搭建及hook入门

原文始发于微信公众号(网络安全与取证研究):frida环境搭建及hook入门

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月6日20:58:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   frida环境搭建及hook入门https://cn-sec.com/archives/2001865.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.
评论  1  访客  1
    • Ali 0

      骗局,在建议我存入一大笔钱后,现在再也没有人接听我的电话或电子邮件,88,200 美元没了。我在谷歌上看到了一篇关于如何获得 OLIVIATRADER44 @ GMAIL. COM 帮助的评论,我联系了他们,我的钱被取回了。如果您也需要帮助,请通过他们的 WhatsApp +1 (423) 248-2140 联系他们

    发表评论

    匿名网友 填写信息