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
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