【CrackMe】003-AfKayAs.2

本程序目前只做到暴破,序列号算法设计浮点寄存器操作,实在头疼,有空再继续搞吧~~~

一、查看程序信息

这里写图片描述
VB,没壳,说实话看VB程序确实有点头疼。
坚持,这才第三个!

二、观察程序特点

欢迎界面
欢迎界面过几秒会自动关闭,弹出主页面
这里写图片描述
用户名、序列号输入各种类型,都是无差别错误提示

三、从最容易入手的字符串开始

我也不知道能搜到什么,总之先搜了再说
将程序运行起来
代码区右键->中文搜索引擎->智能搜索
这里写图片描述
运气还不错哦,正好是错误消息框内文本。
双击定位对应代码。

四、寻找消息弹框

这里写图片描述
定位代码处首先是调用了两次字符串拼接函数
将三段字符串,拼接成最终错误提示信息
然后在下面发现消息框调用

0040871C    FF15 24B14000   CALL DWORD PTR DS:[<&MSVBVM50.#595>]               ; msvbvm50.rtcMsgBox

五、寻找关键跳转

推测,此处调用了错误提示框,附近应该有正确的提示框
果然,在我们定位的字符串的上方,又发现了一个消息框
这里写图片描述
通过字符串信息,可以肯定,就是正确提示框。
0x00408677位置的JE跳转,理论上就应该是关键跳转了
查看跳转的目标地点,正好是两个消息框之间。

六、暴力破解

选中0x00408677->右键->二进制->用NOP填充
将修改后的程序dump,OK,爆破搞定
这里写图片描述

七、寻找序列号算法

从爆破点向上浏览代码。
代码量不小啊,还有N多看不懂的VB函数。
一直浏览到0x004080F0,貌似应该是起始点
下个断点,跑下程序,果然断下了
好了,代码范围已经圈定
这里写图片描述
虽然范围内大部分代码现在都看不懂
但中间的几个还是看懂了,比如:取长度函数

004081F5    FF15 F8B04000   CALL DWORD PTR DS:[<&MSVBVM50.__vbaLenBstr>]       ; msvbvm50.__vbaLenBstr

取字符ASCII函数

0040820D    FF15 0CB14000   CALL DWORD PTR DS:[<&MSVBVM50.#516>]               ; msvbvm50.rtcAnsiValueBstr

字符串转换函数

0040821F    FF15 F4B04000   CALL DWORD PTR DS:[<&MSVBVM50.__vbaStrI4>]         ; msvbvm50.__vbaStrI4

虽然就懂个大概,但估计生成序列号的代码应该就是这段
F8黑盒跑一遍,重点关注上面三个函数的参数及返回值

果然和预想的一样,一堆代码没鸟用。
直到调用取长度函数才开始是算法代码。
这里写图片描述
这个程序和上一个CrackMe序列号算法几乎一样
所以看的也非常顺
不知道接下来是不是再拼个字符串也就结束了

看来是我太乐观了
随着不断F8,程序下走,堆栈里出现了一些数字
“444491”、“1333471”、“1333486”
我感觉肯定又要开始挨虐了
果然,还没看明白什么呢,就跳到错误提示框了
你够狠,偷个懒的机会都不给。
好吧,死磕~

这里写图片描述

判断显示消息框的JE是根据标志位进行跳转
而影响标志位的上上面的TEST
而影响TEST结果的,是上面的NEG ESI
下个断,看看什么情况,走你~

果然,在0x00408653处,ESI为0,导致显示错误消息框。
再往上寻找影响ESI的操作。

这里写图片描述

上方不远处,原来是这给ESI清零了

0040862E    33F6            XOR ESI,ESI                                        ; msvbvm50.__vbaStrCat

再上面我们会看到,是JE直接跳到了XOR。
如果JE条件不满足,ESI应该就不会为0。
这里写图片描述
就是因为0x00408620的FSTSW命令
将浮点寄存器的0120给了AX
导致TEST结果ZF=1
在上面取长度函数断下来的时候,留意了一下
那时候浮点寄存器的值是4020
如果中间没被改变的话,肯定就能通过
那现在我们就查浮点寄存器改变的位置

猜你喜欢

转载自blog.csdn.net/chy_chenyang/article/details/80794620