악성코드와 백신/백신 개발일지

[백신 개발](5)[시그니처 탐지]

황올뱀 2026. 3. 13. 22:06

내가 만든 바이러스를 잡아보자

(악성코드 개발일지 10에서 이어짐)

바이러스 분석 (local_shellcode_injection.c)


지난번에 드디어 뭔가 악성코드라고 할 수 있는 것을 만들었다!
(물론 calc.exe를 실행하는 쉘코드가 아니라 reverse shell 같은 걸 넣으면 진짜 악성이 되고...)

 

조금 더 분석하자면

  • 자체 실행형: .exe 파일을 클릭해서 직접 실행시켜줘야 한다.
  • dropper: 페이로드를 가지고 있다가 타겟의 메모리에 drop한다
  • local injector: 다른 프로그램이 아닌 자신이 실행된 프로세스에 injection한다.

이걸 어케 잡느냐가 문제인데...
저번처럼 파일 전체의 해시로 잡는 방법도 있겠으나, 만약 악성코드의 문자열 하나라도 바뀌면 무용지물이 될 것이다...
이번에는 사용된 페이로드의 시그니처를 잡아 탐지해보자!

 

시그니처 백신 만들기

대부분의 쉘코드들은 FC 48 83 E4 F0으로 시작한다고 한다
    플래그 초기화 및 스택 정렬
따라서 이걸 시그니처로 잡으면 좋을 것 같다.
그리고 내 쉘코드 기능인 calc.exe를 탐지한다면?
local_shellcode_injection만의 탐지기가 완성된다!

 

단순하게 read byte 모드로 exe 바이너리를 긁어온 후,
in으로 안에 시그니처 바이트가 존재하는지만 탐지하면 된다

def scan_exe_for_signature(file_path):
    signature_shellcode = b"\xfc\x48\x83\xe4\xf0" # 쉘코드 시그니처
    signature_calc = b"calc.exe\x00"              # calc 시그니처

    print(f"[*] scanning... {file_path}")

    try:
        with open(file_path, 'rb') as f:
            file_data = f.read()

        found = False
        if signature_shellcode in file_data:
            print("[!] detected!: shellcode pattern")
            found = True

        if signature_calc in file_data:
            print("[!] detected!: calc.exe")
            found = True

        if not found:
            print("[-] safe: no signature")

    except FileNotFoundError:
        print("[-] error: no file")
    except Exception as e:
        print(f"[-] error with {e}")

if __name__ == "__main__":
    target_exe = "../z_malware/Malware_dev.exe" 
    scan_exe_for_signature(target_exe)

(치료부분은 안넣음)

 

실제로 파일을 탐지하게 시키면 잘 잡아준다!

 

모든 자료는 여기에
https://github.com/VeryBigsilver/malware-vaccine/tree/main/4_signature

반응형