في اتساع الشبكة ، تم العثور على جرابنا. هذا هو الكراك . بطبيعة الحال ، من الضروري دراستها. لتشريح الجثة نحتاج:
- قليلا من المجمع
- المنطق مع المصحح (IDA PRO)
لنصنع دواء
هذا الكراك ليس معقدًا للغاية. ضع في اعتبارك الخوارزمية الخاصة بإنشاء مفتاح على المفتاح الصحيح 8365-5794-2566-0817 . في IDA Pro ، أضفت تعليقات حول الكود.
فحص المريض
للوهلة الأولى ، السلوك طبيعي. التمديد. غير معبأ. لنبدأ.
ما هذا؟ يتطلب مفتاح. بحاجة للشفاء :)
تشريح جثة المريض
في حالة حدوث خطأ ، كان هناك نقش "فشل ، المسلسل غير صالح!" لنأخذ مكانًا حيث يتم استخدامه في البرنامج.
نرى وظيفة واحدة key_check_func قبل الفرع الشرطي. دعونا نفحصها.
تظهر شجرة مثيرة للاهتمام.
وضعنا نقطة توقف وبدء التصحيح.
يجب أن يكون طول المفتاح 19 حرفًا.
ثم يتحقق البرنامج من وجود شرطة في المفتاح كل 5 أحرف ، ويدخل الحلقة 3 مرات.
بعد التحقق من وجود شرطة ، يقوم البرنامج بفحص ما إذا كانت كتلة المفتاح (مفتاح 1/4) تتكون من أرقام. هناك افتراض لفهم الرقم الذي تم نقله إلى المترجم لتنفيذ الأمر ،
add eax, 0FFFFFFD0h
على سبيل المثال ، أضف 8 (38 ساعة) بهذا الرقم. الرقم الناتج كبير جدًا ( 10000008 س) وفي النهاية 8 ، يتم قطعها. يبقى 8. هذا هو الرقم الذي نقلناه. يحدث هذا 4 مرات في دورة.
ماذا الآن؟ في الوقت الحاضر ، تتم إضافة رموز كل رقم من الكتلة المحددة إلى بعضها البعض ، ولكن تتم إضافة آخر 4 أرقام 3 مرات على التوالي. يتم إضافة المبلغ الناتج مرة أخرى. كود الرقم الأخير من الكتلة + المقدار الناتج هو 150 ساعة. يتم إضافة النتيجة إلى r10d. تتكرر هذه الدورة بأكملها 4 مرات لكل كتلة مفتاح.
في حالتنا ، ضع في اعتبارك مثال الكتلة الأولى للمفتاح 8365: 38 ساعة (8) + 33 ساعة (3) + 36 ساعة (6) + 35 ساعة (5) + 35 ساعة (5) + 35 ساعة (5) = 140 ساعة + 35 ساعة - 150 ساعة = 25 ساعة. تتم إضافة 25 إلى r10d وكتابتها في الذاكرة. لنحدد هذا المكان على أنه أ. مجموع الكتل الأخرى للمفتاح يساوي أيضًا 25 ساعة. ومن ثم نضرب 25 س * 4 = 94.
بعد ذلك ، يحدث إزاحة قليلاً إلى اليمين بمقدار 2 بايت. سنضع علامة على هذا المكان لأنفسنا على أنه "ب"
لدينا قيمة محددة على أنها A (25 ساعة) و B (25 ساعة). بعد ذلك ، سيتم مقارنة هذه الأرقام. يجب أن يكونوا نفس الشيء. تحدث هذه العملية لكل كتلة مفتاح.
آخر شيء يفعله البرنامج هو التحقق مما إذا كانت الأرقام في الكتل متشابهة. أولاً ، تتم مقارنة أرقام الكتلة الأولى بأرقام الكتلة الثانية. ثم تحقق من كتلتين مع 3 كتل. الفحص النهائي 3 كتل مع 4 كتل. كل هذا التحقق لا يحدث على الفور ، ولكن بشكل تدريجي في حلقة.
انتهى التحليل. تمت دراسة المريض.
حان وقت العلاج
سنستخدم شيئًا غير عادي لتوليد المفتاح. مكتبة بايثون + عشوائية.
الرمز نفسه أدناه. التعليقات في الكود:
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()
نطلق.
أدخل المفتاح وانظر.
تم شفاء المريض.
شكرا للاهتمام. إنني أتطلع إلى تعليقاتكم وانتقاداتكم. لا تمرض.