1.abex‘crackme2

一.abex‘crackme2

打开程序

1

要求我们输入名字与Serial,先随便输一个试试,点击check按钮,弹出了一个Wrong serial!的窗口,开始调试。

2

二.VB专用引擎

VB文件使用名为MSVBVM60.dll ( Microsoft Visual Basic Virtual Machine 6.0 )的VB专用引擎(也称为The Thunder Runtime Engine )。
举个使用VB引擎的例子,显示消息框时,VB代码中要调用MsgBox)函数。其实,VB编辑器真正调用的是MSVBVM60.dll里的rtcMsgBox()函数,在该函数内部通过调用user32.dll里的MessageBoxW()函数(Win32 API)来工作(也可以在VB代码中直接调用user32.dll里的MessageBoxWO).

三.开始调试

运行OllyDbg,查看反汇编代码。

3

执行程序后,在EP代码中首先要做的是调用VB引擎的主函数(ThunRTMain() )。
EP的地址为401238。401238地址处的PUSH 401E14命令用来把RT_MainStruct结构体的地址( 401E14)压入栈。然后40123D地址处的CALL 00401232命令调用401232地址处的JMP DWORDPTR DS:[4010A0]指令。该JMP指令会跳转至VB引擎的主函数ThunRTMain()(前面压入栈的401E14的值作为ThunRTMain()的参数)。

1.检索字符串

5

消息框的标题(“Wrong serial!”)、内容(“Nope,this serial is wrong!”),还有实际调用消息框函数的代码(4034A6)都显示出来了。
从编程的观点来看,使用某种算法生成序列号,通过比较用户输入的序列号与字符串,代码分为TRUE(序列号相同)与FALSE(序列号不同)两大部分。换言之,上述代码的前后存在字符串比较代码,且序列号正确时程序代码会调用消息框输出成功消息.

6

调用403329地址的_vbaVarTstEq()函数,比较(TEST命令)返回值(AX)后,由403332地址的条件转移指令(JE指令)决定执行“真”代码还是“假”代码。

2.查找字符串地址

调至403329处

7

有两个push,这时候我们查看栈窗口

8

可以看到地址0019F298,0019F288这两处。右键数据段查找

9

CCD8CAC8应该就是加密过的名字,sssss就是我们输入的serial,我们再用CCD8CAC8作为serial输入

11

3.生成Serial的算法

很显然,条件转移代码属于某个函数。该函数可能就是Check按钮的事件处理程序。原因在于选择Check按钮后,该函数会被调用执行,且含有用户代码来弹出成功/失败消息框。
最好倒着向上一点点地查找函数开始部分。向上拖动滚动条即可见到图8-14所示的代码。仔细看一下00402EDO地址处的命令。

12

上述代码是典型的栈帧代码,开始执行函数就会形成栈帧。由此得知该位置就是函数开始部分,即Check按钮的事件处理程序。

我们预测到程序使用VB引擎的API获取用户输入的字符串,下面以CALL指令为主进行调试(请注意观察此时传递给API的参数及返回值)。开始调试后,遇到第四条CALL指令,如下所示。

13

查看00402F8E地址处的代码可以看到,函数的局部对象SS:[EBP-88]地址传递(PUSH)给了函数的参数。

加密方法

(1)从给定的Name字符串前端逐一读取字符(共4次)。

(2)将字符转换为数字(ASCII代码)。

(3)向变换后的数字加64。

(4)再次将数字转换为字符。

(5)连接变换后的字符。