新160个CrackMe026-KeygenMe、027-MexeliteCRK1、029-figugegl.1逆向分析
026无壳暴力破解发现关键跳转nop掉即可获得破解版算法分析向上可以找到函数头顺着函数头分析发现有一部分汇编代码是与序列号检验算法无关的接续向下找发现读取用户名和序列号的函数在这个关键点下断点先取用户名的的第一个字符将其ASCII值求二次幂存到esi里再对字符ASCII码值算术右移0x1再0x3*字符ASCII码值得到的结果-字符ASCII码值加到esi里面去最后对esi求2倍用户名长度-1eax1一直循环到用户名为空将其结果与之前读取的序列号进行对比相等则判断成功否则失败可以生成keygen:usernameinput(fInput username:).strip() def arithmetic_right_shift(x: int, n: int, width: int 32) - int: n % width if n 0: return x mask (1 width) - 1 x mask sign_bit (x (width - 1)) 1 shifted x n if sign_bit: high_mask ((1 n) - 1) (width - n) shifted | high_mask return shifted mask sum0 for ch in username: sumord(ch)**2 indexarithmetic_right_shift(ord(ch),1)3 sum(index*ord(ch))-ord(ch) sumsum*2 print(fSerial:{sum:08x})但是生成的序列号有些是不可打印字符没办法验证可以在x32dbg调试中观察是否生成的是正确的序列号027无壳暴力破解该程序只有一个关键跳转给改成jmp即可获取破解版本算法分析深入分析函数发现该程序只是将用户名获取之后与固定字符串Benadryl进行对比没有进行任何其他操作将该字符串Benadryl输入未被破解的程序并随便输入序列号进行测试发现成功该程序只关心用户名是否为Benadryl029无壳暴力破解根据字符串追踪初步判断这是一个获取输入之后循环判断是否相等的简单程序只需要将两个跳转给nop掉。发现这两个跳转给nop掉也不会达到预期效果发现是上面还有一个检验输入长度的跳转没有处理现在将三个跳转都给nop掉即可发现获得破解版软件算法分析首先对输入的用户名和序列号的要求是用户名长度不得小于5序列号存在下面进行了一个循环从下标0开始每个用户名对应的的字符ASCII码值-下标的差将其与该下标对应的序列号的值进行判断如果在用户名结束时全都相等则验证成功可以生成keygenusernameinput(fInput username:).strip() serial for i,ch in enumerate(username): serialchr(ord(ch)-i) print(fSerial:{serial})