本文为看雪论坛优秀文章
看雪论坛作者ID:顾忧
一
Visual Basic文件特征
1.1、 VB专用引擎
VB文件使用名为MSVBVM60.dll的VB专用引擎。举个VB引擎的例子,显示消息框时,VB代码中要调用MsgBox()函数。其实,VB编辑器真正调用的是MSVBVM60.dll里的rtcMsgBox()函数,在函数内部通过调用user32.dll里的MessageBox()函数来工作。
1.2 、本地代码与伪代码
根据使用的编译选项不同,VB文件可以编译为本地代码与伪代码。本地代码使用方便调试器解析的IA-32指令;而伪代码是一个解释器语言,它使用由VB引擎实现虚拟机并可自解析的指令。
1.3 、事件处理程序
VB主要用于编写GUI程序。因为VB程序采用Windows操作系统的事件驱动,所以用户代码存在于各个事件处理程序之中。
1.4、未文档化的结构体
VB使用的各种信息以结构体形式存在于文件内部。
二
查看serial值
运行OD,打开abex’crackme #2.exe。执行程序后,首先调用的VB引擎的主函数ThunRTMain()。
EP的地址为00401238。00401238地址处的PSUH指令用来把RT_MainStruct结构体的地址(00401E14)压入栈。
然后40123D地址处的CALL 00401232指令来调用401232处的指令(跳转到主函数ThunRTMain())前面压入栈的值作为主函数的参数。
先运行abex’crackme #2.exe看看具体体现。可以看到输入错误的数据,会提示Nope,this serial is wrong!这就有捷径了啊。
这里本来想要查看字符串的方法需要定位到关键位置,但是我在使用OD下断点,然后运行之后就卡壳(不能进行任何操作,于是放弃这个方法,决定一步一步的调试到指定位置)。卡壳如下,有知道原因的师傅请指导一下:
重新调试。直接F8执行00401238 push abexcrac.00401E14 ,可以看到数据已经被压入右下角栈窗口,不要问为什么不F7,因为F7直接进入函数内部,太繁琐了。
再F8执行0040123D处的指令,熟悉的窗口再次出现。
随便输入一串数字,点击check。如果不下断点就会弹出上面的错误提醒。这里在00403324处下了一个断点,目的是让程序停留在这里。
那么为什么是停留在这里呢,我们在这个地址后面可以看见一个Yep,this key is right!,再往下面看可以看见,
可以看见Nope,this serial is wrong!。那么可以推断这两个就是输入数据之后弹出的提醒。那么要想二选一,在它们的前面必然会有一个判断语句。向上面看,可以发现两个push指令,可以猜测这就是我们输入的数据。这也是在00403324下断点的原因。接下来执行这两条push指令,执行之前先记录一下右上角寄存器窗口的数据。
然后依次执行两条push指令。
push edx
push eax
执行之后,从栈窗口可以看见两个熟悉的值。
三
分析生成serial的算法
00403243 . FF15 AC104000 call dword ptr ds:[<&MSVBVM60.__vbaVarAd>; msvbvm60.__vbaVarAdd
四
整理加密方法以及脚本实现
public class Decrypt {
public static void main(String[] args){
String str = "orange";
for(int i = 0;i<4;i++){
int s = str.charAt(i)-0;
s = s+100;
String hex_str = Integer.toHexString(s);
hex_str = hex_str.toUpperCase();
System.out.println(hex_str);
}
}
看雪ID:顾忧
https://bbs.kanxue.com/user-home-890008.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!
原文始发于微信公众号(看雪学苑):Visual Basic文件浅析及算法分析