VB反汇编特点汇总:秒破Crackme8-10 – 作者:huluwa007

*本文作者: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 原创奖励计划,未经许可禁止转载。

来源:freebuf.com 2019-03-06 10:00:29 by: huluwa007

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论