代码之家  ›  专栏  ›  技术社区  ›  Robert

Frida:使用命令行参数生成Windows/Linux进程

  •  0
  • Robert  · 技术社区  · 3 年前

    启动frida时,您可以提供frida应该执行的可执行文件的路径并将其附加到该可执行文件:

    frida -l myscript.js process_to_spawn.exe
    

    我有一个可执行文件需要用额外的参数启动,否则它会直接终止。有没有办法启动一个新的可执行文件,并为新启动的进程提供命令行参数?

    我已经试过了

    frida -l myscript.js process_to_spawn.exe --argForProcess
    frida -l myscript.js "process_to_spawn.exe --argForProcess"
    

    但这两种变体都不起作用。Frida试图解释所有参数,因此无法将参数传递给派生的进程。第二种变体也不起作用,因为frida无法找到要启动的可执行文件。

    有没有一种方法可以通过frida在本地操作系统(如Windows或Linux)上生成可执行文件并提供命令行参数?

    我不能连接到正在运行的进程,因为我想挂接的函数在启动后只直接执行一次,所以我必须使用frida生成进程。

    0 回复  |  直到 3 年前
        1
  •  1
  •   Robert    3 年前

    问题似乎是争论始于 - 。对于不以 - 使用frida选项 -f 作品:

    frida -l myscript.js -f process_to_spawn.exe argForProcess
    

    但我需要这个论点 --argForProcess 我找到的唯一方法是挂接main方法,该方法处理命令行参数并在调用main之前修改参数。

    以下代码适用于Windows 10,它似乎以wchar/“Unicode”/UTF-16字符串的形式传递参数。它改变了 argc argv 的参数 main 从一个参数(可执行文件本身)到两个参数(可以执行文件加一个参数)。

    let mainPointer = DebugSymbol.fromName("main").address;
    Interceptor.attach(mainPointer, {
        onEnter(args) {
            // args[0] = int argc
            // args[1] = wchar *argv[]
    
            let myarg1 = Memory.allocUtf16String("Myexecutable.exe");
            let myarg2 = Memory.allocUtf16String("--argumentX");
            let newArgv = Memory.alloc(2 * Process.pointerSize); // allocate space for the two argument pointers
            newArgv.writePointer(myarg1);
            newArgv.add(Process.pointerSize).writePointer(myarg2);
    
            // save all created memory blocks so they don't get garbage collected before main method is completed
            this.myarg1 = myarg1; 
            this.myarg2 = myarg2;
            this.newArgs = newArgv;
            
            // Overwrite the argument counter and the argument char**
            args[0] = ptr(2);
            args[1] = newArgs;
            
            console.log("main(" + args[0] + ", " + args[1].readPointer().readUtf16String() + ", " + args[1].add(Process.pointerSize).readPointer().readUtf16String() + ")");
        }
    });