freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

    VB反汇编特点汇总:秒破Crackme8-10
    2019-03-06 10:00:29

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

    # CrackMe # VB反汇编
    本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
    被以下专辑收录,发现更多精彩内容
    + 收入我的专辑
    + 加入我的收藏
    相关推荐
    • 0 文章数
    • 0 关注者