内容简介:本文通过VB自写自逆,搞清楚VB逆向特点、p-code、native-coed、变量结构特点、默认浮点、epb-0×34法则等,不仅秒破Crackme8-10,以后遇到VB就不会头晕眼花了。
*本文作者:huluwa007,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
本文通过VB自写自逆,搞清楚VB逆向特点、p-code、native-coed、变量结构特点、默认浮点、epb-0×34法则等,不仅秒破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++结构体一样的结构;
其中首地址存放的是变量类型编号;
首地址+0×8,存放的才是实质的数据。
我总结了几个常用的变量数据类型,编号对应如下:
编号 | 类型 | [首地址+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″,即0×31+0×32+0×33+0×34+0×35+0×36 = 0×135再继续往下,发现这个结果会去做一个乘法,如图:
再继续往下,相乘的结果,转化为十进制数字后进行字符串格式化,并且第4位和第九位换成”-“,如下图:
动态观察,[ebp-0x34]的变化。
根据以上分析,我们写出注册机源码:
crackme010
crackme010,我们依然是可以用OD逆向,好好熟悉VB反汇编特点,这里我们用另外一个神器VB Decompiler,网盘的常用工具里面有VB Decompiler直接逆出伪源码。
翻译为C++源码,注意这里有个转义符,如果一个”\”则被识别为转义符,而”\”则被转移为反斜杠”\” 如图:
以上所述就是小编给大家介绍的《VB反汇编特点汇总:秒破Crackme8-10》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- iOS汇编入门教程(一)ARM64汇编基础
- iOS 汇编入门教程(一):ARM64 汇编基础
- iOS汇编入门教程(三)汇编中的 Section 与数据存取
- iOS汇编入门教程(二)在Xcode工程中嵌入汇编代码
- 汇编语言8086笔记
- python编程(反汇编)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员的自我修养
陈逸鹤 / 清华大学出版社 / 2017-5 / 49.00
程序员作为一个职业、也作为一个群体,正逐渐从幕后走向前台,并以他们自己的能力加速改变着世界,也改变着人们生活的方方面面。然而,对于程序员,特别是年轻程序员们来说,如何理解自己的职业与发展,如何看待自己的工作与生活,这些问题往往比那些摆在面前的技术难题更让他们难以解答。 这本书从一个成熟程序员、一名IT管理者的角度,以杂记的形式为大家分享关于国内程序员职业生涯、个人发展、编程中的实践与认知乃至......一起来看看 《程序员的自我修养》 这本书的介绍吧!