Как я могу обнаружить вызов метода в Java? - PullRequest
0 голосов
/ 13 октября 2019

Не уверен, что это должно быть в StackOverflow или на другом сайте StackExchange, поэтому, пожалуйста, простите меня, если я поставил его не в том месте!

В настоящее время я работаю в системе, которая выполняет код, которыйотправлено к нему. Можно ли каким-то образом использовать инструмент статического анализа, чтобы узнать, например, вызван ли Runtime.getRuntime().exec()? Я знаю, что PMD и все существует, но я не могу понять, как использовать их в этом примере.

Я знаю, что мог бы использовать менеджеры безопасности Java, но это не то, что мне нужно, поскольку я буквально просто получаю код, помещаю его в файл, запускаю на нем javac и затем запускаю его.

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

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

public static void foo(){ 
        Thread.currentThread();
        Map<Thread,StackTraceElement[]> allLiveThreads = Thread.getAllStackTraces(); 
        Set<Entry<Thread,StackTraceElement[]>>  entries = allLiveThreads.entrySet();

        for(Entry<Thread,StackTraceElement[]> entry : entries){

            System.out.print("Thread: '"+ entry.getKey().getName()+"'");

            if(entry.getValue().length>1) {
                String nameofMethod = entry.getValue()[1].getMethodName(); 
                System.out.println(" and method name '"+ nameofMethod+"()'");
            }
            else {
                System.out.println(" with no methods.");
            }
        }
    }
0 голосов
/ 13 октября 2019

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

В исходном коде вы можете заменить импортJava Runtime с вашим классом-оболочкой перед его выполнением.

...