Otopsi akan menunjukkan: Memecahkan crackme ringan dan menulis generator kunci

Selamat siang, pembaca. Saya ingin memberi tahu Anda tentang algoritme untuk memecahkan satu crackme ringan dan membagikan kode generator. Ini adalah salah satu crackme pertama yang saya pecahkan.



Dalam jaringan yang sangat luas, pod kami ditemukan. Ini crackme . Secara alami, itu perlu untuk mempelajarinya. Untuk otopsi kami membutuhkan:



  • Sedikit Assembler
  • Logika dengan debugger (IDA PRO)


Mari kita buat obat bisa ular Australia dengan menggunakan Python. Jangan buang waktu.



gambar







Crackme ini tidak terlalu rumit. Pertimbangkan algoritma untuk menghasilkan kunci pada kunci yang benar 8365-5794-2566-0817 . Di IDA Pro, saya menambahkan komentar tentang kode tersebut.



Pemeriksaan pasien



Sekilas, perilakunya normal. Ekstensi .Exe. Tidak dikemas. Ayo mulai.











Apa itu? Membutuhkan kunci. Perlu disembuhkan :)



Otopsi pasien



Jika ada error, maka muncul tulisan “Fail, Serial is invalid!”. Mari kita ambil tempat di mana itu digunakan dalam program.







Kami melihat 1 fungsi key_check_func sebelum cabang bersyarat. Mari kita periksa dia.



Ternyata pohon yang menarik.







Kami menetapkan breakpoint dan mulai men-debug.



Panjang kunci harus 19 karakter.







Kemudian program memeriksa keberadaan tanda hubung di kunci setiap 5 karakter, memasuki loop 3 kali.











Setelah memeriksa keberadaan tanda hubung, program memeriksa apakah blok kunci (1/4 kunci) terdiri dari angka. Ada asumsi untuk memahami digit mana yang ditransfer ke kompiler untuk menjalankan perintah. add eax, 0FFFFFFD0h







Misalnya, tambahkan 8 (38h) dengan nomor ini. Angka yang dihasilkan terlalu besar ( 10000008h) dan pada akhirnya adalah 8, oleh karena itu, dipotong. Sisa 8. Ini adalah angka yang kami berikan. Ini terjadi 4 kali dalam satu siklus.







Sekarang apa? Sekarang, kode dari setiap digit dari blok yang dicentang ditambahkan satu sama lain, tetapi 4 digit terakhir ditambahkan 3 kali berturut-turut. Jumlah yang dihasilkan dijumlahkan lagi. Kode dari digit terakhir blok + jumlah yang dihasilkan adalah 150 jam. Hasilnya ditambahkan ke r10d. Seluruh siklus ini diulangi 4 kali untuk setiap blok kunci.







Dalam kasus kami, pertimbangkan contoh blok pertama dari kunci 8365: 38h (8) + 33h (3) + 36h (6) + 35h (5) + 35h (5) + 35h (5) = 140h + 35h - 150h = 25h. 25 ditambahkan ke r10d dan ditulis ke memori. Mari kita tandai tempat ini sebagai A. Jumlah balok kunci lainnya juga sama dengan 25 jam. Karenanya, kita mengalikan 25h * 4 = 94.



Selanjutnya, terjadi pergeseran bitwise ke kanan sebesar 2 byte. Kami akan menandai tempat ini untuk diri kami sendiri sebagai B.







Kami memiliki nilai yang ditetapkan sebagai A (25 jam) dan B (25 jam). Selanjutnya, angka-angka ini akan dibandingkan. Mereka pasti sama. Operasi ini terjadi untuk setiap blok kunci.







Hal terakhir yang dilakukan program ini adalah memeriksa apakah angka-angka di blok serupa. Pertama, angka dari blok ke-1 dibandingkan dengan angka-angka dari blok ke-2. Kemudian periksa 2 blok dengan 3 blok. Pemeriksaan terakhir 3 blok dengan 4 blok. Semua verifikasi ini tidak segera terjadi, tetapi secara bertahap dalam satu siklus.











Analisisnya selesai. Pasien telah dipelajari.



Waktunya menyembuhkan



Kami akan menggunakan sesuatu yang tidak biasa untuk menghasilkan kunci. Python + Library acak.

Kode itu sendiri ada di bawah. Komentar dalam kode:



import random

def gen_key_part():
    #  
    num1 = str(random.randint(0, 9))
    num2 = str(random.randint(0, 9))
    num3 = str(random.randint(0, 9))
    num4 = str(random.randint(0, 9))

    #    (1 )
    final = num1 + num2 + num3 + num4
    return final

def sum_ord(key_part):
    #      
    num1 = key_part[0]
    num2 = key_part[1]
    num3 = key_part[2]
    num4 = key_part[3]

    #    crackme
    sum = ord(num1) + ord(num2) + ord(num3) + ord(num4) + ord(num4) + ord(num4)
    sum_final = ord(num4) + sum - 336
    return sum_final

def shr(key):
    #    
    a = key[0:4]
    b = key[5:9]
    c = key[10:14]
    d = key[15:19]

    #      crackme
    x = sum_ord(a) + sum_ord(b) + sum_ord(c) + sum_ord(d)
    x = x >> 2
    return x

def check_key(key):
    i = 0 # 
    while i != 4:
        #  i    1  4.      
        first = 0 + i
        second = 5 + i
        third = 10 + i
        four = 15 + i

        #           ( ,  A  B)
        if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):
            return False

        #     
        if int(key[first]) == int(key[second]):
            return False
        if int(key[second]) == int(key[third]):
            return False
        if int(key[third]) == int(key[four]):
            return False
        i += 1 # #  

def generate_key():
    #  
    key = gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part()

    #     true  false
    while True: #
        if check_key(key) == False:
            #     
            key = gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part()
            print('Checking this key -> ' + key)
        else:
            #  
            print('This is the correct key -> ' + key)
            break


#  ,  
if __name__ == "__main__":
    generate_key()



Kami meluncurkan.







Masukkan kunci dan lihat.







Pasien sembuh.



Terima kasih atas perhatiannya. Saya menantikan komentar dan kritik Anda. Jangan sakit



All Articles