验尸将显示:解决一个小问题并编写密钥生成器

早上好,读者。我想告诉您有关解决一个轻裂纹的算法,并分享生成器代码。这是我解决的第一个破解程序。



在广阔的网络中,找到了我们的吊舱。这是骗子自然,有必要对其进行研究。对于尸检,我们需要:



  • 一点汇编器
  • 带有调试器的逻辑(IDA PRO)


让我们使用Python从澳大利亚蛇的毒液中制成药物不要浪费时间。



图片







这个crackme不是很复杂。考虑用于在正确密钥8365-5794-2566-0817上生成密钥的算法在IDA Pro中,我添加了有关代码的注释。



病人检查



乍一看,这种行为是正常的。.exe扩展名。没有包装。开始吧。











它是什么?需要一个密钥。需要治愈:)



病人尸检



如果有错误,则显示“失败,序列号无效!”字样。让我们在程序中使用它的地方。







我们在条件分支之前看到1个功能key_check_func。让我们检查一下她。



结果是一棵有趣的树。







我们设置一个断点并开始调试。



密钥必须为19个字符长。







然后,程序每5个字符检查键中是否有破折号,并进入循环3次。











在检查破折号的存在之后,程序检查键块(1/4键)是否由数字组成。有一个假设可以理解哪个数字传递给了执行命令的编译器add eax, 0FFFFFFD0h







。例如,在此数字后加8(38h)。结果数太大(10000008h),最后是8,因此将其截断。仍然是8。这是我们传送的数字。一个周期中发生4次。







怎么办?如今,已检查块的每个数字的代码相互添加,但最后4个数字连续添加3次。再次将所得的金额相加。块的最后一位数字的代码+结果量为150h。结果添加到r10d。对于每个关键块,将整个循环重复4次。







在我们的情况下,请考虑密钥8365的第一个块的示例:38h(8)+ 33h(3)+ 36h(6)+ 35h(5)+ 35h(5)+ 35h(5)= 140h + 35h-150h = 25h。 25被添加到r10d并写入内存。让我们将此位置标记为A。该键的其他块的总和也等于25h。因此,我们乘以25h * 4 = 94。



接下来,向右移2个字节。我们将自己标记为B。







我们将其值分别指定为A(25h)和B(25h)。随后,将对这些数字进行比较。它们必须相同。每个键块都会发生此操作。







程序要做的最后一件事是检查块中的数字是否相似。首先,将第一个块的数字与第二个块的数字进行比较。然后检查2块与3块。最后检查3块与4块。所有这些验证不是立即进行,而是逐步进行。











分析结束。该患者已被研究。



治疗时间



我们将使用一些不常见的东西来生成密钥。Python +库随机。

代码本身在下面。代码中的注释:



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



我们启动。







输入密钥并查看。







病人已经治愈。



感谢您的关注。我期待您的评论和批评。不要生病。



All Articles