Как импортировать несколько файлов / функций Frida JS в CLI среды выполнения?

Я собираю тестовый стенд Frida для коллег и незнаком с JavaScript и Node.JS. Я хотел бы создать один файл JS, который импортирует несколько других файлов JS, каждый с несколькими функциями. Но когда я использую frida-compile для некоторого кода Node.JS, который импортирует другие функции, интерпретатор REPL не вытягивает функции / переменные в область видимости. Так, например:

У меня есть плоский каталог, состоящий из 3 файлов JavaScript:

in1.js:

'use strict';
var a = 'test';
function b() { console.log("function b"); };

in2.js:

'use strict';
var c = 'test2';
var d = function () { console.log("function d"); };

in3.js:

'use strict';
require('./in1.js');
require('./in2.js');

Затем я запускаю frida-compile в Windows 10 + Python 3.6 + Node.JS 9.5:

frida-compile in3.js -o out.js

Что приводит к следующему выводу:

(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
'use strict';

var a = 'test';
function b() {
  console.log("function b");
};

},{}],2:[function(require,module,exports){
'use strict';

var c = 'test2';
var d = function () {
  console.log("function d");
};

},{}],3:[function(require,module,exports){
'use strict';

require('./in1.js');
require('./in2.js');

},{"./in1.js":1,"./in2.js":2}]},{},[3])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJpbjEuanMiLCJpbjIuanMiLCJpbjMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTs7QUFDQSxJQUFJLElBQUksTUFBUjtBQUNBLElBQUksSUFBSSxZQUFZO0FBQUUsVUFBUSxHQUFSLENBQVksWUFBWjtBQUE0QixDQUFsRDs7O0FDRkE7O0FBQ0EsSUFBSSxJQUFJLE9BQVI7QUFDQSxJQUFJLElBQUksWUFBWTtBQUFFLFVBQVEsR0FBUixDQUFZLFlBQVo7QUFBNEIsQ0FBbEQ7OztBQ0ZBOztBQUNBLFFBQVEsVUFBUjtBQUNBLFFBQVEsVUFBUiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIn0=

И наконец, когда я пытаюсь импортировать его в Frida CLI, используя в качестве примера проект OWASP iGoat, я не могу получить доступ ни к одной из этих функций:

    frida -R -f com.swaroop.iGoat -l out.js
     ____
    / _  |   Frida 10.6.52 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at http://www.frida.re/docs/home/
Spawned `com.swaroop.iGoat`. Use %resume to let the main thread start executing!
[Remote::com.swaroop.iGoat]-> %resume
[Remote::com.swaroop.iGoat]-> a
ReferenceError: identifier 'a' undefined
[Remote::com.swaroop.iGoat]-> b
ReferenceError: identifier 'b' undefined
[Remote::com.swaroop.iGoat]-> c
ReferenceError: identifier 'c' undefined
[Remote::com.swaroop.iGoat]-> d
ReferenceError: identifier 'd' undefined
[Remote::com.swaroop.iGoat]-> module
ReferenceError: identifier 'module' undefined
[Remote::com.swaroop.iGoat]-> require
ReferenceError: identifier 'require' undefined
[Remote::com.swaroop.iGoat]-> exports
ReferenceError: identifier 'exports' undefined
[Remote::com.swaroop.iGoat]->

Чего мне не хватает... Как мне получить доступ к a,b,c и d в CLI Frida?

2 ответа

Решение

Я не думаю, что вы можете напрямую получить доступ к любой из переменных из скрипта.

Читая исходники Frida (в частности, bindings/gumjs/runtime/core.js из репозитория frida-gum), они добавляют свойства в переменную globalкоторый, кажется, ведет себя как глобальный объект (объект, который действует как хранилище для всех глобальных переменных, например, window в браузере) для JS, выполняемого в REPL.

И действительно, этот вид кода в сценарии:

global.test = "success";

Определяет новую переменную в REPL:

[iPhone::Foo]-> test
"success"

(Также спасибо, что познакомили меня с frida-compile, это делает мою жизнь намного проще прямо сейчас.)

Просто, чтобы дать прямой ответ, вам нужно «экспортировать» их с помощью глобальной переменной. Итак, чтобы вызвать вашу функцию, вы должны добавить эту строку в конец скрипта:

global.d = d;

Затем вы можете вызвать функцию в своем cli, просто позвонив:

d()

или с параметрами

d("parameter")

Другие вопросы по тегам