序言:
本题采用TLS、SMC等反调试、反分析手段,算法为索引一个64字节“环”匹中密文再进行加密和隐藏比较,
并利用注册码进行SMC解码,想爆破都不容易!本题算法和防护手段都算上乘之作,无奈碰到了大神而饮恨。
本文是在提交答案之后重新写的,假设输入答案:BwnsAtPediy2017KX9Ok,节省笔墨纸砚,努力把文章写好。
一、查壳,试运行,分析TLS反调试
//首先查壳,Microsoft Linker(14.0)[EXE32],OD加载直接运行,OEP停不下来,噶么鬼?
//检查PE格式发现TLS
//勾选SOD插件“Break On Tls”,重新加载,跟踪40C120 TLS函数,看看都做了什么小动作
//加载停在了40C120
//使用6字节密钥“EB 74 58 CC E8 75”分别异或OEP入口0xC8字节代码,还原并清除了OD自动设置的OEP断点,所以载入就跑飞了。
//接下来对代码段设置内存访问断点,几次运行后就能断到OEP
二、分析主体流程
//断点 bp GetDlgItemTextA,输入注册码,单击“开始验证”
//断下来之后,返回主程序
//用“PEDIY”作为密钥,解密426字节,对应“CALL 00411B30”所需要的主算法程序
//处理前
//处理后
//继续跟踪主程序
三、分析算法程序
//断点410558,断下后单步跟进 CALL 00411B30
//Array1:(用户输入与0xCC异或后)
Array2:(64字节)
//在Array2环中索引查询结果
//Array3:
//对Array3再次异或、移位、与等加密,结果还是更新到Array3中
//加密后的Array3
四、分析验证程序
//返回主程序
//加密“CALL 00411B30”对应主算法流程的426字节,主算法程序加密掉,理念不错,用完弃之!
//CHECK,跟进 CALL 00411825
//检验Array3是否满足,如果不满足就不进行后续SMC解码
//再跟进 CALL 00411975
//Array3 未转换之前:
//索引表,字符串、十六进制转换:
//Array3转为字符串Array4 "A30B1B828ABB4A9BA9BB93AAA36B82AA024AB243"
//确定输入位数20位,这里才能达到80(0x50),异或后为0才能触发跳转
//目的是为了将Array4每个字母作为十六进制数进行除以4,取商和余数变形,阻止破解者轻易理解算法,藏得好辛苦,作者辛苦了!
//下记录断点,查看40组变形结果
//找到要比较的表,必须相同
//正确值
//Array4校验值
//算法破解思路:
//根据40位校验值按“4的倍数+余数”,求出40个字符Array4,然后转Array3,再进行20位字符串,逐位穷举,限定合法字符
五、分析关键CHECK的SMC解码程序(隐含注册码筛选要求)
//返回到上级程序,分析后续SMC过程
//申请内存4096字节,用于SMC,这种方法可取,防止爆破和静态分析
//待解码数据拷贝
//源:
//目的:
//SMC解码,异或
六、算法破解
//1、根据40位校验值按“4的倍数+余数”,求出40个字符Array4,然后转Array3,再进行20位字符串,逐位穷举,限定合法字符
//Python
//穷举合法字符注册码如下:第1、3、11、19位只有唯一解,而其他位都存在好几个解,为了进一步筛选注册码,需要分析SMC解码
//2、根据SMC解码,结合对反汇编代码的认知进行推理,在待选注册码范围中人工筛选出最终答案:(作者你也太狠了吧,呵呵)
//对不确定的第7、8位手工验证,最多4次:
//当输入第2组:BwnsAtPediy2017KX9Ok 弹出信息成功提示“Well Done!:)”
//当输入第4组:BwnsAtiediy2017KX9Ok 弹出空白信息提示,确定后退出程序
//因此最终答案为:BwnsAtPediy2017KX9Ok
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!