054无壳暴力破解字符串查找找到相关跳转将该跳转给nop掉即可获取破解版本软件算法分析先是获取用户名和序列号之后将这两个参数利用函数调用根据返回结果判断跳转成功或者跳转失败步进函数继续分析先是判断用户名和序列号的第一位是否相等之后再判断序列号第二位是不是“-”之后经过循环将用户名的每一位ASCII码值累加再将和0x6064求出a之后构造字符串“用户名第一位-用户名最后一位大写字母-a的十进制整数”之后再构造了一个整数b,ba0x6064之后将十进制的数b添加到之前生成的字符串生成真正的序列号“用户名第一位-用户名最后一位大写字母-a的十进制整数-b的十进制整数”将生成好的序列号与用户输入的序列号进行逐位对比不相等就直接跳转到函数末尾最后可以生成keygenusernameinput(Input username:).strip() sum0 serial for ch in username: sumord(ch) sum0x6064 print(fsum:{sum}) serialusername[0:1]-username[len(username)-1:len(username)].upper()-str(sum) print(serial) sum0x6064 print(fsum:{sum}) serial-str(sum) print(serial)055ASPack壳脱壳暴力破解X32dbg调用脱壳后的程序可以发现他需要一个文件还有一个神秘数字在程序对应目录下创建文件之后在文件内填写神秘数字继续运行分析程序向下找到关键跳转将该跳转给改成jmp即可获取破解版本软件算法分析验证存在文件文件内容全为X循环验证056无壳暴力破解根据字符串查找可以知道输入的字符串长度限制关键跳转下断点可以发现经过一个循环之后相等才跳转成功直接将判断相等的跳转额判断序列号是否验证结束的跳转给改成jmp判断序列号长度的前两个跳转给nop掉即可获取破解版本软件算法分析先是获取用户名判断长度是否在5-32之间之后将前五个字符进行循环操作生成新的序列号每个字符异或0x29再(5-i)之后判断是否处在A-Z之间如果不是就用0x52(5-i)来作为新生成的序列号字符。这里的用例是admin,对应生成的前五个字符为MQGBH之后再对前五个字符进行操作先是异或0x27,再(5-i)1将结果判断是否处在A-Z之间如果不是就用0x4D(5-i)来作为新生成的序列号字符。这里的用例是admin,对应生成的前五个字符为LHNQK之后验证序列号是否为MQGBHLHNQK的变形为KZMKAFADZB获取每个字符先0x5如果ASCII码值大于‘Z’则-0xD之后再异或0xC判断小于‘A’则将0x4B字符串下下标作为生成后的字符判断大于‘Z’则将0x4B-字符串下下标作为生成后的字符可以生成keygen:usernameinput(Input username:).strip() se1 se2 for i,ch in enumerate(username): if i5: break char1(ord(ch)^0x29)(5-i) if char10x41 or char10x5A: char10x52(5-i) se1chr(char1) for i,ch in enumerate(username): if i5: break char2(ord(ch)^0x27)(6-i) if char20x41 or char20x5A: char20x4D(5-i) se2chr(char2) sese1se2 serial for i,ch in enumerate(se): charord(ch)0x5 if char0x5A: char-0xD charchar^0xC if char0x41: char0x4Bi if char0x5A: char0x4B-i serialchr(char) print(serial)