w1512320695 发表于 2024-9-13 20:03

frida 如何第一时间hook shell启动的app_process呢

本帖最后由 w1512320695 于 2024-9-13 20:07 编辑

package com.example.studycreateprocess1;

import static androidx.constraintlayout.helper.widget.MotionEffect.TAG;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

//com.example.studycreateprocess1
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Log.d(TAG,"我是主线程");
      new Thread(() -> {
            try {
                // 启动 sh 进程
                //Process process = Runtime.getRuntime().exec("sh");
                //通过简单的脚本也能hook到
                Process process = Runtime.getRuntime().exec("sh");
                Log.d(TAG,"Parent PID: " + process);
                // 获取进程的输出流
                OutputStreamWriter writer = new OutputStreamWriter(process.getOutputStream());
                // 向进程中写入命令
                writer.write("app_process32 -Djava.class.path=/data/local/tmp/HelloWorld.dex /data/local/tmp HelloWorld &\n");
                writer.flush();
                //执行之后 app_process变成野进程
                writer.close();
               
                // 等待进程完成
                process.waitFor();
            } catch (IOException e) {
                Log.e(TAG, "IOException: " + e.getMessage());
            } catch (InterruptedException e) {
                Log.e(TAG, "InterruptedException: " + e.getMessage());
            }
      }).start();

    }
}


HelloWorld.dex 源代码如下
public class HelloWorld {
    public static void main(String[] strArr) {
      while (true) {
            System.out.println("Hello, I am started by app_process!");
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
      }
    }
}


一共会产生三个进程 1_app主进程2_sh进程3_app_process32进程
我想用frida 第一时间hook到这个app_process32的pid该怎么办呢
试过hook   fork 和 execve没有生效 只能hook到sh进程,代码如下


'use strict';

// 尝试 hook execve 和 fork
const libc = Module.findBaseAddress('libc.so');

if (!libc) {
    console.log('libc.so not found');
}

const execveAddr = Module.findExportByName('libc.so', 'execve');
const forkAddr = Module.findExportByName('libc.so', 'fork');

Interceptor.attach(forkAddr, {
    onEnter: function(args) {
      console.log('fork called');
    },
    onLeave: function(retval) {
      // retval 是新创建的子进程的 PID
      const pid = retval.toInt32();
      console.log('Created child process with PID: ' + pid);
    }
});

Interceptor.attach(execveAddr, {
    onEnter: function(args) {
      const pathname = Memory.readUtf8String(args);
      console.log('execve called with pathname: ' + pathname);
      
      // 这里可以添加更多代码去读取 argv 和 envp
    },
    onLeave: function(retval) {
      // 处理 execve 返回值
      if (retval.isNull()) {
            console.log('execve failed');
      } else {
            console.log('execve executed successfully');
      }
    }
});

在sh进程启动app_process32之前断点,frida -p sh进程id    也hook不到这个app_process32进程启动的过程

w1512320695 发表于 2024-9-22 10:52

经过好多天的努力,已经换其他方法解决了问题

w1512320695 发表于 2024-9-15 06:53

感觉能监控安卓所有app_process启动的进程也可以    有大佬能教一下吗

kouyuu 发表于 2024-10-19 17:54

w1512320695 发表于 2024-9-22 10:52
经过好多天的努力,已经换其他方法解决了问题

楼主怎么解决的?能分享一下吗?
页: [1]
查看完整版本: frida 如何第一时间hook shell启动的app_process呢