android frida hook 逆向入门 如何自己写一个apk并hook它

本文介绍了如何使用Frida进行Android应用的逆向工程,包括创建简单的Android程序,设置按钮点击事件,以及使用Frida的JavaScripthook功能修改程序逻辑,实现特定函数返回值的控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

frida hook 如何下载  安装 使用暂且不讲,网上例子很多

以下文章只是相当于frida hook的helloword ,如何能hook成功,简单演示,成手直接跳过

机器可以用AS开发工具自己的模拟器或者物理机

我用的google pixel 4 伊拉克战损成色,话说成色好像不影响apk运行

第一步,我们先自己简单写一个Android 程序

里面一个文本框,一个按钮,点击按钮文本框显示test1方法传回的数据

在android stdio new一个项目

项目创建好之后,进入工程目录,选择res->layout

在这里新建按钮

<?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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/txt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:id="@+id/bu1"
        android:layout_width="120dp"
        android:layout_height="120dp"/>
</LinearLayout>

好了,我们的按钮加好了,给textview也给了一个id

看到此处干过android开发的同学已经对我这种粗犷邋遢的代码写法已经忍不了了

没关系 往下看

之后我们给我们的按钮添加点击事件

以及更新textview的显示内容

回到MainActivity

package com.example.hookjavaapk20231101;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.service.autofill.Validator;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv=findViewById(R.id.txt1);
        findViewById(R.id.bu1).setOnClickListener(this);

    }


    @SuppressLint("SetTextI18n")
    @Override
    public void onClick(View v) {
        Log.d("--","按钮被点击");
        int a1 = 1;
        int b1 = 2;
        tv.setText("a+b="+addab(a1,b1));
    }
    public int addab(int a,int b){
        return a+b;
    }
}

别说话,照抄,就这代码水平,没办法

运行起来点击按钮就是这样的

好了,apk搞定了,我们生成apk文件并安装到手机上

如果是在低版本的真机上执行,可能最小支持版本这里需要改一下

改完需要同步一下之后再构建,导出apk文件安装

安装好之后,我们模拟一下一个纯java层的apk,且没有加壳的一种逆向思路

首先使用jeb 打开apk,之后分析程序主入口,找到主入口,分析代码逻辑

我们几天的目的就是让原本a+b=3 变成a+b=88

所以,我们得找到a+b结果怎么来的

JEB这步可以忽略,因为上面代码里面已经将apk逻辑写出来的

找到主入口之后,在主入口上面右键选择decompile反编译,之后看反编译之后的java代码

好,我们已经看见了加法的实现逻辑就在主入口这个类里面

我们的目的就是让a+b=88

所以我们可以通过控制addab方法的返回值来实现目的

首先,打开python 开发环境, 用啥都行

新建一个py文件,里面敲入如下代码


import sys
import frida
#coding:utf-8

#

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

with open("./hookjava20231101.js", "r", encoding="utf-8") as fp:
    hook_string = fp.read()

# 方式一:attach 模式,已经启动的 APP
#frida-ps -Ua   i  pid  a  packa
process = frida.get_usb_device(-1).attach("hookjavaapk20231101")
script = process.create_script(hook_string)
script.on("message", on_message)
script.load()
sys.stdin.read()

简单说一下,这里面加载的js是hook的实际逻辑,使用js实现的

这个js可以使用独立文件也可以直接和py文件写一起

attach("hookjavaapk20231101")这里面的hookjavaapk20231101是怎么来的

首先在手机上运行你的apk,之后再命令行 敲入如下命令  frida-ps -Ua

就可以获取当前运行的进程信息,这里要填入进程的name

py文件这个基本是固定模板,根据不同使用场景

变化的是js里面hook逻辑

之后我们在py文件同目录下新建一个hookjava20231101.js文件

在里面实现我们的逻辑

Java.perform(
    function () {
        console.log("hook 开始")
        var mainActivity = Java.use("com.example.hookjavaapk20231101.MainActivity");//此处填写的是要hook的方法所在的类
        mainActivity.addab.implementation = function (a, b) {
            console.log("--","返回88")
            return 88//此处控制返回值
        }
    }
)

之后需要在手机上启动frida服务端

这里不详细写了,因为网上教程很多,照着操作就行

运行好服务端之后,服务端是区分64和32位的

我们运行py文件

如果此处控制台打印了此信息,证明没报错,成功了

之后我们点击apk上的按钮,我们看到,a+b=88

原理部分不展开讲了,网上很多,此文章如同hellword

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值