1.6.1 • Published 5 years ago

@paulll/siso v1.6.1

Weekly downloads
14
License
MIT
Repository
github
Last release
5 years ago

Simple Solve

build:unknown npm license:mit

Фреймворк для автоматического анализа чего бы то ни было. Изначально задумывался для автоматического решения CTF-задач.

Принцип

В основном похож на Dataflow Programming, но в данном случае мы оперируем единичными неизменяемыми единицами данных, а не их потоками, а "дуги" составляются автоматически в реальном времени, и не могут быть опредены заранее. Позаимствуем терминологию:

  • Узел - черный ящик, принимающий на вход одни данные и выдающий на выходе другие на основе входящих
  • Токен - единица данных, передаваемая между узлами. Помимо самих данных содержит так же информацию об их типе и показатель релевантности

На вход подается некоторый первоначальный набор токенов (обычно исходные данные для анализа), затем система из узлов создает новые токены на основе существующих. Вновь появившиеся токены рассматриваются наравне с первоначальными, и так пока не будут обработаны все токены.

Подобный принцип хорошо подходит для обработки данных, структура которых заранее неизвестна: анализ социального графа; решение типовых ctf-задач, декомпозирующихся в более простые

Пример

Рекурсивная распаковка Base64:

import {ProcessorNode, Token, Executor, Context} from "@paulll/siso";

class Base64DecodeTextNode extends ProcessorNode {
  public input = [["string"]];
  public async process(ctx: Context, tokens: Token[]) {
    const data = await tokens[0].data;
    const decoded = Buffer.from(data, "base64");

    // Если data в действительности содержала лишь base64
    if (decoded.toString("base64") === data) {
      return [new Token(["string"], decoded.toString("utf8"), 1)];
    }
  }
}

const executor = new Executor();
executor.addNode(new Base64DecodeTextNode());

const ctx = executor.run([
  new Token(["string"], "U0dWc2JHOGdWMjl5YkdRaA==", 1),
]);

ctx.on("newToken", async (token: Token) => {
  console.log(await token.data);
});

Здесь мы имеем всего один узел, который принимает на вход строку, и при обнаружении в ней base64-содержимого декодирует его, создавая новый токен. Новый токен поступает на вход того же узла, и так будет продолжаться, пока вся "матрешка" из base64 не декодируется.

1.6.1

5 years ago

1.6.0

5 years ago

1.5.1

5 years ago

1.5.0

5 years ago

1.4.1

5 years ago

1.4.0

5 years ago

1.3.2

5 years ago

1.3.1

5 years ago

2.0.0

5 years ago

1.3.0

5 years ago

1.2.1

5 years ago

1.2.0

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.0

5 years ago