import re
import yara
from bitstring import BitArray, ConstBitStream
# Bu program bir zararlının otamatik olarak nasıl tespit ve tespit edilen zararlının ayarlarını gösterir.
# Sadece Njrat için yazıldı ama daha fazla veri eklerseniz daha falza aileyi tespit eder.
# Tespit etme işlemi: 
# 1. İlk olarak hafıza imajını yara ile tarar eğer bir zararlı yazılım var ise bunun hangi aileye ağit olduğunu tespit eder burdaki yara kuralının ne kadar gelişmiş ve güncel olduğu önemlidir.
#      Paylaştığım yara kuralı sadece njrat için geçerlidir.
# 2. Zararlı ve bulunduğu ailesi tespit edildikten sonra bu aileye özel Config Extraction işlemi gerçekleşir.
#      Bu kod ise sadece tek bir aile ve tek bir sürüm için geçerlidir.
print("""
___  ___      _                          _____              __ _         _____     _                  _   _             
|  \/  |     | |                        /  __ \            / _(_)       |  ___|   | |                | | (_)            
| .  . | __ _| __      ____ _ _ __ ___  | /  \/ ___  _ __ | |_ _  __ _  | |____  _| |_ _ __ __ _  ___| |_ _  ___  _ __  
| |\/| |/ _` | \ \ /\ / / _` | '__/ _ \ | |    / _ \| '_ \|  _| |/ _` | |  __\ \/ | __| '__/ _` |/ __| __| |/ _ \| '_ \ 
| |  | | (_| | |\ V  V | (_| | | |  __/ | \__/| (_) | | | | | | | (_| | | |___>  <| |_| | | (_| | (__| |_| | (_) | | | |
\_|  |_/\__,_|_| \_/\_/ \__,_|_|  \___|  \____/\___/|_| |_|_| |_|\__, | \____/_/\_\\__|_|  \__,_|\___|\__|_|\___/|_| |_|
                                                                  __/ |                                                 
                                                                 |___/   @yafesonofnoah                                               
 """)

def burnthemall():
    fh = open('njyar.yar') # Taratacağınız yara dosyasının yolu.
    rules = yara.compile(file=fh)
    matches = rules.match('memoryrawdata.raw') # Dumpit veya FTKimager ile aldığınız memory datası. Bu datayı yara ile taranan kısmı.
    f = open('memoryrawdata.raw', 'rb')
    f1 = f.read()
    f.close

    # found_size fonksyonu yakalanan offset değerlerinin uzunluklarını ve genişliklerini hesaplar.
    def found_size(hexdata, kb):
        s = ConstBitStream(f)
        found = s.find(hexdata)
        s0f0, length, bitdepth, height, width = s.readlist(
            'hex:16, uint:16, uint:8, 2*uint:16')
        if found:
            print(kb, "'nın Offset Baslangici: %d." % found[0])
            print(kb, "'nin offset: Genislik: %d, Yukseklik: %d" %
                  (width, height))
        else:
            print('Uzunluk ve genişlik hesaplanamdı.')
    
    #  njrat ortak trick : WRK.m
    def getconfig_wrkm():
        wrkfind = re.compile(b'\x57\x52\x4B\x00\x6D')
        w1 = re.search(wrkfind, f1)
        if w1:
            print("Eşleşen deger:", w1.group())
            kb = bytearray.fromhex('57 52 4B 00 6D').decode(encoding="Latin1")
            print(kb, "'nın Baslangıcı:", w1.start())
            print(kb, "'nın Baslangıc ve Bitis:", w1.span())
            found_size(b'\x57\x52\x4B\x00\x6D', kb)
            print('\nNjrat Trick Kalıntısı:', kb)
        else:
            print('WRK.M Bulunamadı.')
    
    # Malware'in compile edilmiş versyonunu tespit eder.
    def getconfig_verssion():
        versionfind = re.compile(b'\x30\x00\x2E\x00\x37\x00\x64')
        w1 = re.search(versionfind, f1)
        if w1:
            print("\nEşleşen deger:", w1.group())
            kb = bytearray.fromhex('30 00 2E 00 37 00 64').decode(encoding="Latin1")
            print(kb, "'nın Baslangıcı:", w1.start())
            print(kb, "'nın Baslangıc ve Bitis:", w1.span())
            found_size(b'\x30\x00\x2E\x00\x37\x00\x64', kb)
            print('\nVersion numarası:', kb)
        else:
            print('Version Bulunamadı.')
    
    # Zararlının ismini tespit işlemini gerçeklerştiren fonksyon.
    def getconfig_exe():
        exefind = re.compile(b'\x73\x00\x65\x00\x72\x00\x76\x00\x65\x00\x72\x00\x2e\x00\x65\x00\x78\x00\x65')
        okunan = re.search(exefind, f1)
        if okunan:
            print("\nBulunan deger: ", okunan.group())
            kb = bytearray.fromhex('73 00 65 00 72 00 76 00 65 00 72 00 2E 00 65 00 78 00 65').decode(encoding="Latin1")
            print(kb, "'nın Baslangıcı:", okunan.start())
            print(kb, "'nın Baslangıc ve Bitis:", okunan.span())
            found_size(b'\x73\x00\x65\x00\x72\x00\x76\x00\x65\x00\x72\x00\x2e\x00\x65\x00\x78\x00\x65', kb)
            print('\nMalware Exe ismi :', kb)             
        else:
            print('Exe İsmi Bulunamadı')

    # Zararlının lokasyonunu tespit eden kısım.
    def getconfig_exeloc():
        exefind = re.compile(b'\x54\x00\x45\x00\x4D\x00\x50')
        okunan = re.search(exefind, f1)
        if okunan:
            print("\nBulunan deger: ", okunan.group())
            kb = bytearray.fromhex('54 00 45 00 4D 00 50').decode(encoding="Latin1")
            print(kb, "'nın Baslangıcı:", okunan.start())
            print(kb, "'nın Baslangıc ve Bitis:", okunan.span())
            found_size(b'\x54\x00\x45\x00\x4D\x00\x50', kb)
            print('\nMalware Exe Lokasyonu :', kb)
        else:
            print('Exe locasyonu İsmi Bulunamadı')

    # Registry değirini tespit eder.
    def getconfig_registryvalue():
        exefind = re.compile(b'\x41\x32\x00\x37\x00\x39\x00\x66\x00\x36\x00\x39\x00\x36\x00\x30\x00\x65\x00\x64\x00\x38\x00\x34\x00\x61\x00\x37\x00\x35\x00\x32\x00\x35\x00\x37\x00\x30\x00\x61\x00\x63\x00\x61\x00\x37\x00\x66\x00\x62\x00\x32\x00\x64\x00\x63\x00\x31')
        okunan = re.search(exefind, f1)
        if okunan:
            print("\nBulunan registy value : ", okunan.group())
            kb = bytearray.fromhex('41 32 00 37 00 39 00 66 00 36 00 39 00 36 00 30 00 65 00 64 00 38 00 34 00 61 00 37 00 35 00 32 00 35 00 37 00 30 00 61 00 63 00 61 00 37 00 66 00 62 00 32 00 64 00 63 00 31').decode(encoding="Latin1")
            print(kb, "'nın Baslangıcı:", okunan.start())
            print(kb, "'nın Baslangıc ve Bitis:", okunan.span())
            found_size(b'\x41\x32\x00\x37\x00\x39\x00\x66\x00\x36\x00\x39\x00\x36\x00\x30\x00\x65\x00\x64\x00\x38\x00\x34\x00\x61\x00\x37\x00\x35\x00\x32\x00\x35\x00\x37\x00\x30\x00\x61\x00\x63\x00\x61\x00\x37\x00\x66\x00\x62\x00\x32\x00\x64\x00\x63\x00\x31', kb)
            print('\nMalware Registy Value :', kb)
        else:
            print('Registy value bulunamadı')

    # Registry Key tespiti.
    def getconfig_registryvaluekey():
        text1 = re.compile(b'\x53\x00\x6f\x00\x66\x00\x74\x00\x77\x00\x61\x00\x72\x00\x65')
        text2 = re.compile(b'\x4d\x00\x69\x00\x63\x00\x72\x00\x6f\x00\x73\x00\x6f\x00\x66\x00\x74')
        text3 = re.compile(b'\x57\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\x00\x73')
        text4 = re.compile(b'\x43\x00\x75\x00\x72\x00\x72\x00\x65\x00\x6e\x00\x74\x00\x56\x00\x65\x00\x72\x00\x73\x00\x69\x00\x6f\x00\x6e')
        text5 = re.compile(b'\x52\x00\x75\x00\x6e')
        
        f = re.search(text1, f1)
        if f:
            kb1 = bytearray.fromhex('53 00 6F 00 66 00 74 00 77 00 61 00 72 00 65').decode(encoding="Latin1")
            print("\n1. Eşleşen Malware Registry Value Key:", f.group())   
        else:
            print('1. Değer Bulunamadı')

        f2 = re.search(text2, f1)
        if f2:
            kb2 = bytearray.fromhex('4D 00 69 00 63 00 72 00 6F 00 73 00 6F 00 66 00 74').decode(encoding="Latin1")
            print("2. Eşleşen Malware Registry Value Key:", f2.group())     
        else:
            print('2. Değer Bulunamadı')

        f3 = re.search(text3, f1)
        if f3:
            kb3 = bytearray.fromhex('57 00 69 00 6e 00 64 00 6f 00 77 00 73').decode(encoding="Latin1")
            print("3. Eşleşen Malware Registry Value Key:", f3.group())        
        else:
            print('3. Değer Bulunamadı')

        f4 = re.search(text4, f1)
        if f4:
            kb4 = bytearray.fromhex('43 00 75 00 72 00 72 00 65 00 6e 00 74 00 56 00 65 00 72 00 73 00 69 00 6f 00 6e').decode(encoding="Latin1")
            print("4. Eşleşen Malware Registry Value Key:", f4.group())       
        else:
            print('4. Değer Bulunamadı')

        f5 = re.search(text5, f1)
        if f5:
            kb5 = bytearray.fromhex('52 00 75 00 6e').decode(encoding="Latin1")   
            print("5. Eşleşen Malware Registry Value Key:", f5.group())      
        else:
            print('5. Değer Bulunamadı')

        print('\n Registy Value Key: ',kb1,'/',kb2,'/',kb3,'/',kb4,'/',kb5)

    # Malware'in bağlandığı servisi tespit eder(c2,C&C)
    def getconfig_c2():
        servertrick = re.compile(b'\x31\x00\x32\x00\x37\x00\x2e\x00\x30\x00\x2e\x00\x30\x00\x2e\x00\x31')
        f = re.search(servertrick, f1)
        if f:
            kb = bytearray.fromhex('31 00 32 00 37 00 2e 00 30 00 2e 00 30 00 2e 00 31').decode(encoding="Latin1")
            print("\nEşleşen Malware C2 offset:", f.group())
            print(kb, "'nın Baslangıcı:", f.start())
            print(kb, "'nın Baslangıc ve Bitis:", f.span())
            found_size(b'\x31\x00\x32\x00\x37\x00\x2e\x00\x30\x00\x2e\x00\x30\x00\x2e\x00\x31', kb)
            print("\nEşleşen Malware C2 :", kb)
        else:
            print('Eşleşen C2 Bulunamadı')

    # Bağlandığı portu tespit eder.
    def getconfig_c2port():
        servertrick = re.compile(b'\x35\x00\x35\x00\x35\x00\x32')
        f = re.search(servertrick, f1)
        if f:
            kb = bytearray.fromhex('35 00 35 00 35 00 32').decode(encoding="Latin1")
            print("\nEşleşen Malware POrtoffset:", f.group())
            print(kb, "'nın Baslangıcı:", f.start())
            print(kb, "'nın Baslangıc ve Bitis:", f.span())
            found_size(b'\x35\x00\x35\x00\x35\x00\x32', kb)
            print("\nEşleşen Malware C2 Port :", kb)
        else:
            print('Eşleşen Port Bulunamadı')
    
    # Tüm Fonksyonların çağrıldığı yer eğer kurallarla uyuşuyor ise.
    if matches:
        print('\nTespit Edilen Kurallar', matches)
        print('\nConfig Extraction Başlıyor..')
        getconfig_wrkm()
        getconfig_verssion()
        getconfig_exe()
        getconfig_exeloc()
        getconfig_registryvalue()
        getconfig_registryvaluekey()
        getconfig_c2()
        getconfig_c2port()
    else:
        print('Hata')
burnthemall()
