*本文作者:huluwa007,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
本文通过VB自写自逆,搞清楚VB逆向特点、p-code、native-coed、变量结构特点、默认浮点、epb-0x34法则等,不仅秒破Crackme8-10,以后遇到VB就不会头晕眼花了。
准备
网盘链接: https://pan.baidu.com/s/1j_38rOvm83zoyTcJxutwXw 提取码: awdv
【环境和工具】
1. win7/xp虚拟机环境
2. CrackMe008(Andrénalin.1.exe)
3. CrackMe009(Andrénalin.2.exe)
4. CrackMe010(Andrénalin.3.exe)
5. VB6写的研究程序(pcode版)
6. VB6写的研究程序(ncode版)
7. ollydbg
8. VB Decompiler
【学习层次】
1. 了解VB开发特点
2. 理解VB反汇编特点
3. 掌握VB反汇编技巧
VB自编自逆
这一段文章搞透后,不仅能秒破CrackMe8-10,以后在遇到VB就不会蒙圈了。
程序界面:
程序源码:
完整工程文件和源码在网盘。
VB反汇编特点汇总
1. 两种编译
VB6.0之后的版本,在选择编译最终程序的时候,是由两种选择的,分别是:
p-code模式
native-code模式
如下图:
p-code
伪代码,并不是真正编译的机器码,需要经过msvbvm60.dll的翻译和解释才能执行;
比较小;
VB特有;
字串很难搜索;
OD几乎无法分析,跟变态壳似的;
VB Decompiler可以直接逆出伪源码。
例如上方程序,用p-code编译的版本,od中甚至连MsgBox断点都不好下,各种绕的晕头转向。
然而,遇到p-code的,就直接上神器VB Decompiler吧,工具在网盘-常用工具里面,如图,可以直接翻译伪源码:
native-code
和其他开发环境类似,直接编译出真正的机器码,cpu直接执行;
既然cpu可以直接认识,那么od也就认识了;
OD可以逆向动态分析;
程序会比p-code大;
VB Decompiler也很好用,也是可以逆出伪源码。
如图,在od中,字符串搜索和堆栈跟踪符合正常预期。
VB Decompiler逆出伪源码:
2. native-code反汇编的变量结构特点
native-code编译的VB程序是可以用OD正常动态调试的,OD对其常用函数的识别也是很好的。但是对VB不熟的还是依然会茫然,其中一个原因就是变量结构问题。我们以自己写的这个探索程序为例子,整数1乘以2,逆向看看VB的计算过程。
OD中断在了即将进行计算之前,请仔细观看下图,识别相应的参数和寄存器和堆栈和内存数据,就可以看出端倪。
可以看出变量结构特性是:
寄存器接收变量的地址;
地址指向的是一个类似C++结构体一样的结构;
其中首地址存放的是变量类型编号;
首地址+0x8,存放的才是实质的数据。
我总结了几个常用的变量数据类型,编号对应如下:
编号 | 类型 | [首地址+0x8] |
---|---|---|
2 | int | 值 |
3 | long | 值 |
4 | 单精浮点 | 32位浮点值 |
5 | 双精浮点 | 64位浮点值 |
8 | 字符串 | 字符串地址 |
11 | byte | 值 |
3. 变量未声明类型,数值计算采用64位双精
VB声明变量,格式如下图:
AS后面是接类型,也可以不写AS,根据需要自动转换,那么当转换位数值类型时,默认是64位双精浮点型。我们依然利用这个乘法探索程序,逆向进行验证,源码如下图:
n1、n2、nRes三个变量;
均未指定类型;
Val是把字符串转换为数字;
其实不用val转换,直接用字符串向乘,VB在计算的时候也会转。
为了反汇编看起来条线清晰方便,我们就提前转一下。
程序操作如下图:
2和3相乘,点击默认类型计算结果;
我们用OD逆向分析计算过程。
OD中逆向计算过程如下图:
可见两个乘数2和3,默认类型编号是5,即双精浮点型。
切换内存显示模式为64浮点后,如下图:
可见,确实VB会把没有声明类型的数字类型变量,默认采用64位双精浮点。
4. 另外两个特性
VB字符串默认编码是unicode;
VB反汇编中很多时候会在[ebp-0x34]这个堆栈地址中看到最终的计算的结果。
秒破CrackMe8-10
知道了VB反汇编的特点后,CrackMe8-10其实很简单。若是直接用 VB Decompiler,那就更简单了。但是还是推荐用OD去好好分析分析,毕竟CrackMe的终极目标还是学习。
三合一注册机效果动图:
crackme008
固定码,SynTaX 2oo1 ,开发者都说了Very very easy!我们就直接pass了。
crackme009
1. 输入用户名123456,和伪码654321
2. OD中研究算法发现定义了循环,根据上文总结的VB的特点,可以轻易的得出结论,若是不知道这个特点,很容易跟看堆栈看的一脸懵逼。
循环体实质内容,我们用VB的另外一个特性就是[ebp-0x34]结果特性来分析,如下图:
每执行一次循环内容,[ebp-0x34]值得动态变化如下图:
可以看出,这个循环得实质就是"用户名字符asc码求和",用户名"123456",即0x31+0x32+0x33+0x34+0x35+0x36 = 0x135再继续往下,发现这个结果会去做一个乘法,如图:
再继续往下,相乘的结果,转化为十进制数字后进行字符串格式化,并且第4位和第九位换成"-“,如下图:
动态观察,[ebp-0x34]的变化。
根据以上分析,我们写出注册机源码:
crackme010
crackme010,我们依然是可以用OD逆向,好好熟悉VB反汇编特点,这里我们用另外一个神器VB Decompiler,网盘的常用工具里面有VB Decompiler直接逆出伪源码。
翻译为C++源码,注意这里有个转义符,如果一个"\"则被识别为转义符,而"\"则被转移为反斜杠"\" 如图:
这篇搞透,谈VB色变,不存在的!去网盘中下载,试试吧。
*本文作者:huluwa007,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。