1625-5 王子昂 总结《2017年6月13日》 【连续第254天总结】
A.CrackM(19)
B.PEiD显示是TASM/MASM写的,貌似是纯汇编?居然有界面
打开,没有弹窗和按钮,只是通过一个文本框来显示正确和错误
在OD中用CTRL+N查看GETWINDOWTEXTA的调用就找到了主程序段
也可以通过查找字符串来锁定
往下拖一些看到了两个字符串,在之前是cmp和je,估计是关键跳转了,改成jmp,爆破成功
下断发现运行后过几秒会自动再次断住,估计是隔几秒调用一次检查密码是否正确
在主进程处发现一个Switch语句,找到判断的地方发现分别有0x10,0xF,0x1三个判断,一共有四个分支可跳
而跟进Switch发现是这样的形式:
0040145F |. 8D25 52314000 lea esp,dword ptr ds:[0x403152]
00401465 |. 0FBE05 663140>movsx eax,byte ptr ds:[0x403166]
0040146C |. 03E0 add esp,eax
0040146E \. C3 retn
实际上相当于jmp ds:[0x403152+eax],即实际上有一个地址表来跳转
本程序中利用0x403166作为循环变量,0x403188作为结果保存变量,着实让人头疼
首先是获取了Name的ASCII,并且当长度不满0x14(即20)时自动以0填充,接着获取了Serial转化成整型存储
值得一提的是获取Serial使用了GetDlgItemInt的函数,这个函数的作用是获取文本框并将字符串转换为整型。它有一个参数pSuccess,表示转换失败的出错信息(当字符串中出现了非数字字符或浮点型数据,以及超出取值范围时都会返回1)。本程序中使用了一个全局变量保存它,并验证是否出错,出错则跳过。回溯了好久才找到这个全局变量哪来的,什么用处。
然后就是处理:将结果+1,然后与Name的第n个字节后四个字节的ASCII进行异或。重复16次
下一个Case中,将结果+0x9112478,如果结果为0则进入下一个Case,否则归零重来
最后一个Case当然就是成功啦
这个Swtich的检测变量整的我很迷茫,最后是连猜带蒙,又看了两篇分析总结才明朗的。不过以后就熟悉了。
http://www.shadowxh.com/?p=2210 这一篇的分析非常清晰,写出了算法的伪代码很简洁
C.明日计划
计算思维