170613 逆向-CrackMe之023

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.明日计划

计算思维

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值