Tools/Volatility

#2 Volatility - 플러그인 만들기 Tutorial 2

geunyeong 2021. 12. 8. 21:53

Table of Contents

    Abstract

    앞선 글에선 단순히 Volatility3의 플러그인 파일로 인식되게끔만 했다. 이번엔 실행 가능한 Hello World 플러그인을 만들어보자.

    https://geun-yeong.tistory.com/58

    How to make a Volatility Plugin

    Write a code

    앞선 글에서 만든 testplugin.py를 재활용했다. 아래 코드는 플러그인으로써 실행되기 위한 최소한의 코드다.

    from volatility3.framework import interfaces, renderers
    
    class TestPlugin(interfaces.plugins.PluginInterface):
        """My Test Plugin"""
        
        _required_framework_version = (1, 0, 0)
        _version = (1, 0, 0)
    
        def run(self) -> renderers.TreeGrid:
            return renderers.TreeGrid(
                [
                    # colums name and type
                    ('no', int),
                    ('msg', str)
                ],
                [
                    # level, values
                    (0, (1337, 'I\'m the Test Plugin')),
                    (0, (31337, 'Hello, World'))
                ]
            )

    먼저 volatility3/framework에 위치한 interfaces와 renderers라는 라이브러리를 import한다. 그리고 interfaces의 PluginInterface라는 클래스를 상속받는 우리만의 플러그인 클래스를 만든다. interfaces에는 Volatility 플러그인의 기본 틀을 정의한 PluginInterface 클래스가 존재하며 renderers에는 출력 결과를 나타낼 TreeGrid가 존재한다.우리가 Volatility를 사용하면 출력 결과가 테이블(표) 형태로 나온다는 걸 써본 사람들은 알텐데, 이러한 표를 만들기 위한 클래스다.

    Volatility 플러그인은 _required_framework_version과 _version이라는 변수를 포함해야 한다. _required_framework_version은 이 플러그인이 실행되기 위한 Volatility3 프레임워크의 버전을 의미하고, _version은 본 플로그인의 버전을 의미한다. _version은 없어도 동작하지만 _required는 필수로 있어야 한다. 본 글에서 사용하는 Volatility3 프레임워크 버전은 1.0.1인데, 만약 _required를 (1, 1, 0)이나 (2, 0, 0)으로 한다면 버전이 맞지 않다는 에러가 발생한다. 만약 내가 만든 플러그인을 다른 플러그인에서도 사용할 수 있도록 할 생각이라면 _version 값을 명시해주어야 한다.

    _required_framework_version이 맞지 않으면 발생하는 에러

    run 메소드는 Volatility가 해당 플러그인을 실행할 때 호출하는 메소드다. 즉 실질적으로 이 메소드가 결과값을 만들어낸다고 보면 된다. run 메소드는 TreeGrid를 반환하며 Volatility는 반환값을 보고 콘솔 창에 테이블 형태로 출력한다.

    TreeGrid는 2개의 list 타입을 파라메터로 받는데, 첫번째는 테이블의 Title과 해당 컬럼의 데이터 타입을 의미한다. 본 예제에서는 첫번째 컬럼의 타이틀은 "no"이며 데이터 타입은 int(정수)라는 의미고 두번째 컬럼의 타이틀은 "msg"이며 데이터 타입은 str이라는 의미다.

    두번째는 해당 컬럼에 들어갈 값들이 존재한다. 두번째 파라메터의 리스트는 또 다시 튜플로 나뉘는데, 튜플의 첫번째 값을 레벨을 의미하고, 두번째엔 각 컬럼마다 들어갈 값들이 존재한다. 두번째 튜플의 첫번째 원소엔 앞서 no 타이틀에 명시한 int 타입의 값이 들어가고, 두번째 원소엔 msg 타이틀에 명시한 str 타입의 값이 들어가야 한다.

    Run

    작성한 testplugin.py를 volatility3/framework/plugins에 저장하고 실행시켜보자.

    > python vol.py testplugin

    testplugin 실행 결과

    앞서 설명한대로 첫번째 컬럼엔 no라는 타이틀과 정수 값이, 두번째 컬럼엔 msg라는 타이틀과 문자열 값이 출력되는 것을 볼 수 있다. 

    Close

    이상으로 볼라틸리티 플러그인을 실행하기 위한 최소한의 요소들을 알아봤다. 이제 Volatility의 Windows 플러그인을 응용해 우리만의 플러그인을 만들어보자.