打开程序crackme
- 这个程序是使用VB编写,目标是知晓其中密码计算的算法
- 当密码输入错误时会弹出一下对话框
附加到OD
-
在这里介绍一下Visual Basic 文件的特征
-
VB 专用引擎
- VB 文件使用名为MSVBVM60.dll 的VB专用引擎,VB代码中使用MsgBox()函数来显示消息框,而实际上,VB编译器真正调用的时MSVBVM60.dll 内的rtcMsgBox()函数,而该函数内部通过调用user32.dll内的MessageBoxW()函数(WIN 32 API)来工作
-
本地代码与伪代码
-
VB文件可以编译成本地代码和伪代码。本地代码一般使用易于调试器解析的IA-32指令;伪代码时一种解释器语言,它是由VB引擎实现虚拟机并且可以自解析的指令(字节码)。
伪代码具有于JVM(java虚拟机)和Python专用引擎类似的心态结构,具有方便移植的优点
-
-
开始调试
-
EP 地址为0x401238
-
通过观察
00401232 $- FF25 A0104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>] ; MSVBVM60.ThunRTMain 00401238 > $ 68 141E4000 PUSH 00401E14 ; EP 压入ThunRTMain()函数所需参数 RT_MainStruct 结构体 0040123D . E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100> ; 通过CALL 401232 去间接调用ThunRTMain()
-
00401238处,压入地址00401E14,而此处为ThunRTMain()函数所需参数 RT_MainStruct 结构体
-
0040123D处,通过调用<JMP.&MSVBVM60.#100>跳转到00401232间接调用MSVBVM60.ThunRTMain()(间接调用)
-
进入ThunRTMain()
开始分析crackMe
-
查找需要“打补丁的位置”
-
搜索字符串
发现了之前提示错误对话框的字符串,点击定位到该地址
-
-
定位过去之后,会看到以下代码
-
从此处向上查找,找到CALL 的头,即check 触发事件
-
定位到:00402ED0 > \55 PUSH EBP ; Check 按键的事件
并且在此处下断(F2)
-
开始调试,输入Name和Serial(注意,这里不要输入一样的,最好容易分辨)
我这里输入的Name:1238 Serial:4321
-
按F8进行单步步过,并且查看寄存器内值的变化
此处过程省略
-
最后在00403197 处发现存在应该循环,并且循环次数由Name 输入的字符串长度确定
则该处较大可能是加密算法
-
继续调试,最后得出1234所对应的正确密码为95969798
-
而在00403233 处存在该指令
00403233 . C785 2CFFFFFF>MOV DWORD PTR SS:[EBP-D4], 64 ; |密钥 UNICODE + 64
得出,密钥是0x64