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