frida-trace -H 172.16.91.189:3353 -f com.taptap -i dlopen
frida-trace -H 172.16.91.189:3353 -f com.taptap -i android_dlopen_ext

如果app使用strstr函数进行字符串比较,可以使用以下代码无脑过检测

console.log("注入")
var newStr = "change"
var newStrAddr = Memory.allocUtf8String(newStr)

Interceptor.attach(Module.findExportByName(null, "strstr"), {
    onEnter: function (args){
        args[0] = newStrAddr
        console.log('\nstrstr(s1="'+args[0].readCString() + '", s2="' + args[1].readCString() + '")')
    },
    onLeave:function (retval) {}
})
# 实测某我音乐、某红书可过(2022年10月前的版本)

更细致的替换:

console.log("注入")
var newStr = "change"
var newStrAddr = Memory.allocUtf8String(newStr)
var newStr2 = "/data/local/tmp/temp.txt"
var newStr2Addr = Memory.allocUtf8String(newStr2)

Interceptor.attach(Module.findExportByName(null, "strstr"), {
    onEnter: function (args){
        args[0] = newStrAddr
        console.log('\nstrstr(s1="'+args[0].readCString() + '", s2="' + args[1].readCString() + '")')
        // if(
        //     args[0].readCString().indexOf("frida")!==-1 ||
        //     args[1].readCString().indexOf("frida")!==-1 ||
        //     args[0].readCString().indexOf("gum-js-loop")!==-1 ||
        //     args[1].readCString().indexOf("gum-js-loop")!==-1 ||
        //     args[0].readCString().indexOf("gmain")!==-1 ||
        //     args[1].readCString().indexOf("gmain")!==-1 ||
        //     args[0].readCString().indexOf("linjector")!==-1 ||
        //     args[1].readCString().indexOf("linjector")!==-1
        // ){
        //     console.log('\nstrstr(s1="'+args[0].readCString() + '", s2="' + args[1].readCString() + '")')
        // }

    },
    onLeave:function (retval) {

    }
})

Interceptor.attach(Module.findExportByName(null, "readlink"), {
    onEnter: function (args){
        args[0] = newStr2Addr
        console.log('\nreadlink(arg1="'+args[0].readCString() + '", arg2="' + args[1].readCString() + '")')
        // if(
        //     args[0].readCString().indexOf("frida")!==-1 ||
        //     args[1].readCString().indexOf("frida")!==-1 ||
        //     args[0].readCString().indexOf("gum-js-loop")!==-1 ||
        //     args[1].readCString().indexOf("gum-js-loop")!==-1 ||
        //     args[0].readCString().indexOf("gmain")!==-1 ||
        //     args[1].readCString().indexOf("gmain")!==-1 ||
        //     args[0].readCString().indexOf("linjector")!==-1 ||
        //     args[1].readCString().indexOf("linjector")!==-1
        // ){
        //     console.log('\nstrstr(s1="'+args[0].readCString() + '", s2="' + args[1].readCString() + '")')
        // }

    },
    onLeave:function (retval) {

    }
})

Interceptor.attach(Module.findExportByName(null, "fopen"), {
    onEnter: function (args){

        if(
            args[0].readCString().indexOf("map")!==-1 ||
            args[0].readCString().indexOf("status")!==-1
        ){
            args[0] = newStr2Addr
            console.log('\nfopen(path="'+args[0].readCString() + '", arg2="' + args[1].readCString() + '")')
        }


    },
    onLeave:function (retval) {

    }
})

/proc 和 /task 目录下的文件主要用于提供进程及其任务的信息。它们不仅可以用于检测Frida,还可以用于获取其他与进程和任务相关的信息。以下是这些文件的主要作用:
/proc/[pid]/maps:此文件包含进程的内存映射信息。它列出了进程中各个内存区域的地址范围、权限、偏移量、设备及文件路径等信息。这些信息可用于分析进程的内存使用情况,如查找共享库、堆、栈等内存区域。除了检测Frida,还可以用于调试、性能分析、内存泄漏检测等。
/proc/[pid]/status 或 /task/[pid]/status:此文件包含进程或任务的状态信息,例如进程ID、父进程ID、线程组ID、状态、优先级、内存使用情况等。这些信息可用于分析进程或任务的运行状态、资源占用等。除了检测Frida,还可以用于进程监控、资源管理等。
/proc/self/fd 和 /proc/self/task/[pid]/fd:这些文件夹包含进程及其任务的文件描述符信息。它们提供了一个文件描述符到实际文件或资源的符号链接。通过分析这些文件描述符,可以了解进程或任务打开的文件、套接字、管道等资源。除了检测Frida,还可以用于调试、资源泄漏检测、安全分析等。
总之,这些 /proc 和 /task 目录下的文件提供了丰富的进程及任务相关信息,可以用于很多场景,如调试、性能分析、资源管理、安全分析等。在实际应用中,可以根据需要选择合适的文件来获取所需信息。






/proc/[pid]/maps文件

adb shell "cat /proc/`frida-ps -Ua | grep settings | awk '{print $1}'`/maps | grep -Ei 'frida|gum|REJECT|tmp|gmain|linjector'"
redfin:/data/local/tmp # ./frida-server-15.1.17-android-arm64
frida -Uf com.android.settings --no-pause

用frida启动“设置”应用 和 正常手动启动“设置”应用,对比一下 /proc/[pid]/maps 文件的不同

╰─$ adb pull /proc/`frida-ps -Ua | grep settings | awk '{print $1}'`/maps normal_maps
╰─$ adb pull /proc/`frida-ps -Ua | grep settings | awk '{print $1}'`/maps .

╰─$ charm diff maps normal_maps

frida 子进程检测 ios_Memory


找了一圈,好像只有“/data/local/tmp/re.frida.server/frida-agent-64.so”是可被检测的hluda呢?hluda会是这样

frida 子进程检测 ios_android_02

/proc/[pid]/status文件

adb shell "cat /proc/`frida-ps -Ua | grep settings | awk '{print $1}'`/status"

这个文件好像没有特征,有个TracerPid

frida 子进程检测 ios_android_03


被附加调试的app启动frida会有问题

frida 子进程检测 ios_Memory_04

/task/[pid]/task/[tik]/maps 文件

adb shell "for taskdir in /proc/`frida-ps -Ua | grep settings | awk '{print $1}'`/task/*; do cat "\$taskdir/status" | grep 'Name:'; done"

frida 子进程检测 ios_风控_05

frida 子进程检测 ios_android_06

/proc/[pid]/fd 目录下的文件

adb shell "ls -l /proc/self/fd | grep frida"
adb shell "ls -l /proc/`frida-ps -Ua | grep settings | awk '{print $1}'`/fd | grep -Ei 'frida|gum|REJECT|tmp|gmain|linjector'"

frida 子进程检测 ios_文件描述符_07


frida 子进程检测 ios_android_08

linker或libart

s1.indexOf("/apex/com.android.runtime/bin/linker64")!==-1
            ||
            s1.indexOf("/apex/com.android.art/lib64/libart.so")!==-1

frida 子进程检测 ios_文件描述符_09

inline hook 检测

.text段的内容在ELF加载前后没有发生变化,对比内存中的.text段和文件中的.text的crc是否相等

frida 子进程检测 ios_风控_10