本帖最后由 w1512320695 于 2024-9-13 20:07 编辑
[Java] 纯文本查看 复制代码 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 源代码如下
[Java] 纯文本查看 复制代码 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进程,代码如下
[JavaScript] 纯文本查看 复制代码
'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[0]);
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进程启动的过程
|