吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 5295|回复: 6

[转载技术] 第二十六章-Visual Basic程序的逆向-Part1

[复制链接]
Shark恒 发表于 2015-1-20 16:38 | 显示全部楼层 |阅读模式

                    第二十六章-VisualBasic程序的逆向-Part1
接下来几章我们将介绍如何使用OllyDbg逆向VisualBasic编写的程序,有人可能会说逆向VB有更好的工具,比如SmartCheck,但是本系列教程主要是围绕OllyDbg展开的,所以会尽可能的尝试少使用其他工具,如果OllyDbg实在解决不了的时候,我们再来使用其他工具。
首先,给大家准备了一个好用的OllyDbg。
名字叫做olly_parcheado_para_vb(翻译过来就是:打过补丁的OD,专门用于定位OEP),也就是说用其在脱壳过程中定位OEP比较方便。但是实际上,用它分析VB编写并编译成Native code的程序也比较方便(但并不适用于VB编写的并编译成为P-CODE的程序)。
VB编写的应用程序有两种编译方式,一种是Native code方式,另一种是P-code方式。实际上,VB 4.0以前只采用P-code编译,VB 4.0以前只采用P-code编译,VB NativeCode是在VB 5.0以后发展起来的,其目的是为了在一定程序上改善VB应用程序的运行速度。VB P-Code的运行速度较慢,这是由它本身的运行机制所决定的。P-code,即PseudoCode(伪代码),这一概念最早出现在Pascal编译器中,它是为了提供跨平台可移植性而产生的,实现这一编译机制的Pascal编译器被称之为”Pascal P Comiler”。Sun公司在其推出的Java语言上也成功实现了这种机制。Java程序的伪编译代码由一系列代表一定意义的字节码(byte code)组成。它们同属于一套特定的指令集,这种字节码不能由不同的CPU直接执行,而是通过特殊的解释器翻译为CPU可以识别的指令才能执行,这种解释器就是我们常说的”虚拟机”。只要在不同的平台上提供虚拟机,把字节码翻译为对应的CPU指令集,也就实现了所谓的跨平台特性。微软推出的VB P-code,实际上也是一组自定义的指令集,必须通过基于堆栈的虚拟机翻译为80X86上的指令集才能执行,担任虚拟机任务的就是msvbvm50.dll和msvbvm60.dll这两个动态链接库文件。由于在文件执行过程中多出了解释的步骤,自然要影响到其执行的速度。正如我们所看到的,VB P-code并没有实现所谓的跨平台运行特性,这对于Pseudo这一词的起源就不恰当了,另一方面,采用P-code形式编译的VB应用程序的体积要小于Native Code形式编译的同样程序(这是由于P-code指令集的每条指令对应于一组80X86指令所完成的任务),所以VB P-code实际上意味着VBPacked-code(压缩代码),用以强调VBP-code程序较小的代码体积。所以说这两者之间还是存在显著差别的。
关于P-code的具体原理我们后面章节再讨论。
那么刚刚那个打过补丁的OllyDbg有什么特别的地方呢?其特别之处在于:如果你设置一个内存访问断点,正常情况下应该是内存读取(ONREAD)或者执行(ON EXECUTE)都断下来。但是该OllyDbg(前面提到的Patch过的)只会在执行(ONEXECUTE)的时候断下来。这样更有助于我们寻找应用程序的OEP,对于分析非P-code的VB程序也非常有帮助。
另外,我们要逆向VB程序的话,首先应该了解一些VB的API函数,但是VB相关的API函数在MSDN中查不到。
并且网络上也可以找到很多专门针对VB的教程,你可以通过阅读COCO等人的VB系列逆向教程来提高自己分析VB程序的功力。我这里的话直接使用这个Patch过的OD来逆向VB程序了。
我们可以将这个Patch过的OD放到原版OD的根目录下,我们分析普通程序的时候使用原版的OD,当我们需要逆向VB程序,或者需要定位OEP,再或者需要内存访问断点仅对内存执行断点生效的时候我们就可以使用这个Patch过的OD。
但是如果我们需要读取或者执行都能生效的话,我们就可以使用硬件访问断点来替代。
现在最纠结的问题是MSDN中并没有提供VB API函数相关的解释,如果你想知道某个VB API函数的解释,只能Google了,如果你运气好的话,也许会搜索到一些对该API进行相应解释的页面。好了,我们介绍如何逆向VB程序之前,先来看一看我收集的一些重要的VB API函数资料。
VB的主要数据类型以及API函数
函数名称中缩写形式归纳:
bool - 布尔型
str - 字符串型
i2 - 双字节整型
ui2 - 无符号双字节整型
i4 - 长整型
r4 - 单精度浮点型
r8 - 双精度浮点型
cy - 货币型
var - 变体类型
fp - 浮点型
cmp - 比较
comp - 比较
下面是VB基本数据类型的图表:
image002.jpg
例如:
__vbaI2Str可以将一个字符串转化2个字节的数值形式。
更多的定义如下:
1)数据类型转换类函数:
  I)__vbaI2Str 将一个字符串转化为整型
  II)__vbaI4Str 将一个字符串转化为长整型
  III)__vbar4Str 将一个字符串转化为单精度浮点型
  IV)__vbar8Str 将一个字符串转化为双精度浮点型
  V)VarCyFromStr 将字符串转化为货币类型
  VI)VarBstrFromI2 将整型数据转化为字符串
  以上是几个缩写形式的VBAPI函数,我们再来看看其他的VBAPI。
2)数据移动:
  I)__vbaStrCopy 将一个字符串拷贝至指定内存单元中
  II)__vbaVarCopy 将一个变量的值拷贝至指定内存单元中
  III)__vbaVarMove 将一个变量的值移动到指定内存单元中
3)数学运算:
  I)__vbavaradd  两个变量值相加
  II)__vbavarsub  第一个变量减去第二个变量
  III)__vbavarmul  两个变量值相乘
  IV)__vbavaridiv  第一个变量除以第二个变量,得到一个整数商
  V)__vbavarxor 两个变量值做异或运算
4)程序设计杂项:
  I)__vbavarfornext 这里VB程序里的循环结构,For...Next...(Loop)
  II)__vbafreestr 释放掉指定字符串所占的内存,也就是把指定内存单元中字符串抹掉
  III)__vbafreeobj 释放掉VB的一个对象(一个窗口或者一个对话框)所占的内存,也就是把指定内存中窗口或者对话框对象抹掉
  IV)__vbastrvarval 获取字符串指定的子串
  V)multibytetowidechar 将多字节字符串转化为宽字节字符串
  VI)rtcMsgBox 弹出一个消息框,类似于WINDOWS API中的MessageBoxA/MessageBoxExA函数
  VII)__vbavarcat 将两个变量值相连,如果是两个字符串,就直接连接在一起
  VIII)__vbafreevar 释放变量所占的内存空间,也就是把指定内存中的变量值抹掉
  IX)__vbaobjset 给对象赋值或者实例化
  X)__vbaLenBstr 获取一个字符串的长度,注意:VB中一个汉字的长度也是1个字节
  XI)rtcInputBox 显示一个VB标准的输入窗口,类似于WINDOWSAPI函数GetWindowTextA,GetDlgItemTextA
  XII)__vbaNew 显示一个对话框,类似于WINDOWS API函数DialogBox
  XIII)__vbaNew2 显示一个对话框,类似于WINDOWS API函数DialogBoxParamA
  XIV)rtcTrimBstr 将字符串左右两边的空格去掉
  XV)__vbaEnd 结束进程
  XVI)__vbaLenVar 获取一个变量的大小
  XVII)rtcMidCharVar 从字符串中间去相应的字符,VB中的MID函数,用法 MID(“字符串”,“开始的位置”,“取几个字符”)
  XVIII)rtcDir 获取当前路径
  XIX)__vbaFileOpen 打开文件
5)比较函数:
  I)__vbastrcomp 比较两个字符串,类似于WINDOWS API函数lstrcmp
  II)__vbastrcmp 比较两个字符串,类似于WINDOWS API函数lstrcmp
  III)__vbavartsteq 比较两个变量值是否相等
  IV)__vbaFpCmpCy 浮点变量值与货币变量值进行比较
  V)__vbavartstNe 判断两个变量值是否不相等
以上函数可能在以后我们分析VB程序的时候经常遇到,虽然并没有提供VB API函数的完整说明,但是你知道了这些函数,对你分析VB程序还是大有裨益的。
虽然我们不使用Smart Check来进行逆向,但是其分析VB程序时常会显示的一些函数我们还是有必要知道的,函数列表见W3school中的介绍:
http://www.w3schools.com/vbscript/vbscript_ref_functions.asp
例如:Smartcheck分析VB程序显示的报告中会出现Asc或者Mid这种函数,我们在OllyBbg也可以见到这类函数,但是这类函数并不属于VisualBasic。以上网址中有对Smartcheck分析报告中出现的这类函数的详细解释。
例如:在Smartcheck中出现了Len函数,其对应的VB API函数是__vbaLenVar。
image004.jpg
单击超链接我们可以看到Len函数的完整说明。
image006.jpg
以上是大家以后使用SmartCheck分析VB程序过程中可能会遇到的问题,尽管我们并不使用它来逆向VB程序,但是我们这里还是简单提一下,因为我暂时还没看到关于SmartCheck的教程中有相关函数的说明。
好了,可能会涉及到的知识点我们都知道了,现在我们来看一个CrackMe,名字叫做CrackMePls。
我们用本章开始介绍过的Patch过得OllyDbg来加载这个CrackMe。
image008.jpg
这个CrackMe很简单,首先会弹出一个NAG窗口(何谓NAG:软件未注册或软件的试用版经常会弹出一些提示窗口要求注册,这些窗口被称为NAG窗口),我们首先需要将该NAG窗口除去掉,然后找到正确的Password即可,好了,现在我们运行起来看看。
image010.jpg
(PS:如果你的系统中,文字显示的是乱码的话,可以使用英文版的操作系统来运行该程序,即可显示正常的英文字符)
弹出了一个NAG窗口,该窗口跟我们Windows API函数MessageBoxA弹出的消息框很相似,VB中对应的API函数为rtcMsgBox,我们给该函数设置一个断点。
image012.jpg
现在我们重新启动OD并运行起来,看看在弹出NAG窗口之前会不会断下来。
image014.jpg
我们可以看到断了下来,但是并没有看到参数情况,也没有看到其他有用的信息,其实这无关紧要。
我们可以查看栈顶的值即函数的返回地址。
image016.jpg
根据OD的提示信息我们可以看到当前断下来的这个API函数是rtcMsgBox以及在哪里调用的。
image018.jpg
返回地址是4032D9,其上一行就是调用rtcMsgBox这个API函数。
image020.jpg
我们给rtcMsgBox调用处,以及其返回地址处都设置断点,然后运行起来。
image010.jpg
我们单击OK,断在了返回地址处。
image022.jpg
我们可以看到EAX=1表示该API函数执行成功了。现在,我们重启该CrackMe,并尝试NOP掉弹出该NAG窗口的代码。
我们重启之后断在了rtcMsgBox这个API函数的调用处。
image024.jpg
我们这里可以在下一行4032D9处单击鼠标右键选择-Neworigin here,这样就会从4032D9处开始执行,而上面的rtlMsgBox的调用代码并没有执行,这样我们就相当于模拟了NOP掉上一行代码的效果。
image026.jpg
接着我们继续运行起来看看会发生什么。
image028.jpg
程序终止了,显示,NOP掉rtcMsgBox的调用并没有出现我们想要的效果。我们再来尝试另一种方式。我们重启该CrackMe。
image030.jpg
我们断在了rtcMsgBox的调用处,我们继续运行,弹出NAG窗口,我们单击NAG窗口中的OK按钮后,就返回到了4032D9处,我们接着继续按F8键单步跟踪。
image032.jpg
我们可以看到这里有个JMP指令,我们继续按F8键跟踪。
image034.jpg
JMP指令之前是PUSH 403341,然后跳转到RET指令处,表示将返回到403341处,OllyDbg将该处返回识别成了RET used as a jump to 403341,这样就能够避免分析者注意到堆栈中的返回地址,干扰我们的视线,我们继续跟踪。
image036.jpg
我们跟踪到RETN 8处。
image038.jpg
我们返回到了上层调用的返回地址402F9B处,但是刚刚堆栈中并没有提示调用来至于哪里以及返回地址是哪里等等信息。
现在我们给402F95处的CALL指令设置一个断点,然后重启该CrackMe。
image040.jpg
我们断在了402F95处的CALL指令处,现在我们NOP掉这个CALL,然后运行起来,看看还会不会弹出烦人的NAG窗口。
image042.jpg
我们运行起来。
image044.jpg
Good Bye,NAG窗口,嘿嘿,我们以后还会看到更多去除NAG窗口的例子,这个例子虽然简单,但是我们也学习到了其在上面设的一些小把戏。
好了,我们接着来找正确的Password。
image046.jpg
现在这个Patch过的OllyDbg就可以派上用场了。我们来试试给代码段设置内存访问断点(仅仅执行断点生效)。我们单击工具栏中的M按钮打开内存窗口。
image048.jpg
我们选中代码段所在的区段,单击鼠标右键选择-Setmemory breakpoint on access。
接着单击OK按钮。
image050.jpg
我们断在了401E45处,往下跟几步。
image052.jpg
我们可以看到402C5C处有一个CALL指令,我们可以跟进这个CALL里面看看内部调用什么API函数。
现在我们按F7键跟进。
image054.jpg
诶,我们好像达到了比较关键的地方,我们可以看到下面有一个__vbaStrCmp,这个API函数是用于比较两个字符串的,这里我们给__vbaStrCmp调用处设置一个断点,然后清除掉之前设置的内存访问断点,然后运行起来。
image056.jpg
我们可以看到这里是将我们输入的字符串“989898”与正确的序列号进行比较,我们将其复制下来。
image058.jpg
我们将剪切板上的内容粘贴到记事本中。
image060.jpg
这样我们将可以很容易的将正确序列号复制下来了。
image062.jpg
我们将正确的序列号粘贴到序列号的输入框中然后单击OK。
image064.jpg
我们可以看到提示序列号正确了,接下来我们需要将刚刚NOP掉的地方保存到文件中,这样NAG窗口就被永久的去除掉了。
下一章我们将继续介绍VB应用程序逆向的相关话题,届时我们将接触到更加复杂的例子。

本系列文章汉化版转载看雪论坛

感谢原作者:RicardoNarvaja(西班牙人)
原作者个人主页:http://www.ricardonarvaja.info/

感谢热心翻译的朋友:
1~3章译者:BGCoder
4~58章译者:安于此生

全集配套程序下载地址:
链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv



评分

参与人数 11HB +8 THX +7 收起 理由
花盗睡鼠 + 2 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
Jawon + 1
太阳神 + 2 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
一路走来不容易 + 1
Soul1999 + 1
消逝的过去 + 1
l278785481 + 1
hackysh + 1
jaunic + 1
hnymsh + 1
lies + 1

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
hackysh 发表于 2022-2-20 12:56 | 显示全部楼层


[快捷回复]-软件反汇编逆向分析,软件安全必不可少!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一道彩虹屁 发表于 2022-2-23 02:48 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-3-1 03:47 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-11-19 17:36 | 显示全部楼层

牛啊,感谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-4-4 10:20 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2023-4-21 21:56 | 显示全部楼层

老大推荐必是精品
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表