在广阔的网络中,找到了我们的吊舱。这是骗子。自然,有必要对其进行研究。对于尸检,我们需要:
- 一点汇编器
- 带有调试器的逻辑(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()
我们启动。
输入密钥并查看。
病人已经治愈。
感谢您的关注。我期待您的评论和批评。不要生病。