社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 556阅读
  • 3回复

[分享]动态获得VBA中获取敏感函数

楼层直达
z3960 
级别: 茶馆馆主
发帖
770593
飞翔币
207694
威望
215657
飞扬币
2511651
信誉值
8

之前项目在对VBA宏代码进行免杀得时候,发现某些杀软会针对VBA的WinAPI函数隐式调用部分进行字符串查杀,而这个部分当有过一个想法,就是能否向C/C++那样能够显式加载API,当时搜寻一翻没有发现相关的资料,而最近在一个机缘巧合下我看到了一篇关于COM接口的文章,其中提到了相关技术的介绍.Cobalt Strike默认生成:                以下为Cobalt Strike 4.1默认生成VBA宏代码的声明:               Private Declare Function AllocStuff Lib "kernel32" Alias "VirtualAllocEx" (ByVal hProcess As Long, ByVal lpAddr As Long, ByVal lSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long                我们注意到对WinAPI引用的规则,其中要使用这些API必须按照VBA的规则来进行声明,且Kernel32VirtualAllocEX                这两个字符串是无法进行加密解密的,必须按照规定在VBA中进行声明.大家都知道一般的检测引擎检测VBA的方式基本是静态匹配,所以VBA的规避方式一般是通过混淆脚本块来进行规避的,但是有个别杀软的检测比较狠,只要存在隐式声明,就对其声明的字符串进行规则匹配,当然这个声明是无法被混淆的.                修改隐式声明:                在C/C++中,可以通过LoadLibrary和GetProcAddress来获得”倚天剑和屠龙刀”,为什么说是倚天剑和屠龙刀呢,原因很简单通过这两个API可以动态加载Windows上所有的导出函数,包括未公开的函数通过动态加载API可以很大程度规避杀软对于导入表的查杀,之前就一直有这个想法是否能够在VBA中实现这个功能,很遗憾的是相关的资料少之又少,直到最近我偶然间看到了下面的介绍.                                正如介绍中说的那样,我们可以通过DispCallFunc函数来实现我们需要的功能.                该函数的声明如下:                               pvInstance                接口的实例.               oVft                要执行的API的函数地址.                cc                用约定.CALLCONV值之一,例如CC_STDCALL.               vtReturn                函数返回值的变量类型.使用VT_EMPTY表示空白.                cActuals                函数参数的数量.                prgvt                函数参数的变量类型的数组.                prgpvarg                函数参数.                pvargResult                函数返回值.                根据上述函数的调用约定我们构造一个简单的例子.                修改导入方式:                我们都知道PE文件的导出方式有两种,分别是名称导入和序号导出,是否可以在VBA中实现序号导入的方式呢.                首先通过PE工具得到我们需要使用的API的序号值.                                                                这里的值是16进制的,转换成对应的10进制即可,值得注意的是该序号的值可能根据操作系统版本的不同会有有所变化,所以说要在之前加入判断当代码,函数的名称也可以随之修改为任意函数名.                在野样本:                我们在VT上进行关联发现了个别使用该方法的样本,该样本比较简单,调用了2次APICall.                                首先看下Decode64函数,这个是Base64的解码函数.                                第一个参数首先被Base64编码,之后调用了decrypt函数解密.                                我们可以看到根据Decode64函数返回的数据与Base64解码后的数据相同,证明我们的分析是没错的.                                                如下图所示,将加密字符串和密钥解码出来.[font=-apple-system, BlinkMacSystemFont, &quot]                [font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]                [font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]                接下来我们看下decrypt函数,该函数的算法比较简单,转换成伪C代码即:[font=-apple-system, BlinkMacSystemFont, &quot]                for(int i =0 ,i<strlen(strInput),++i)[font=-apple-system, BlinkMacSystemFont, &quot]                {        [font=-apple-system, BlinkMacSystemFont, &quot]                         strInput=strInput-second                }                也就是说将传入字符串的ASCII码-8即还原了被加密的字符串.                                为了方便看,我整理了下对应的代码,可以看到第一次调用APICall,使用了5次解密函数.                第一次:                                第二次:                                第三次:                                第四次:                                第五次:                                APICall的功能没什么可说的,就是将部分需要以指针传入的数据进行转换,然后通过LoadLibrary和GetProcAddress获得需要执行API的地址后,通过DispCallFunc执行.                                URLDownloadToFileW功能是下载指定URL的内容到指定位置,也就是说调用该API会下载"http://taroba.fm.br/sistema/exploit.exe"数据到系统目录的"APPDATA"下命名为"Example.exe".                第二次调用APICall,如果我猜得不错应该是运行下载的PE文件,这里5调用了解码函数.                                第一次:                                第二次:                                第三次:                                第四次:                                第五次:                                ShellExecuteW功能是运行一个外部程序或打开某个文件/目录,也就是说.通过ShellExecuteW API运行系统目录下的"APPDATA"目录中名为:"Example.exe"的程序.总结:                至此该样本的宏代码部分就执行完成了.也就是说该样本实际上是一个下载者,VBA的语法实际与VB大都相同,随着VB语言的没落该方向的资料也比较少或比较老旧,但是其有部分灵活的用法依旧值得研究并能够应用在免杀当中.IOC:                hxxp://taroba.fm.br/sistema/exploit.exe                9f8bc3cfcab3056fd71076bed82664b2
本帖最近评分记录: 1 条评分 飞扬币 +50
爱我中华 飞扬币 +50 2021-04-23 您的帖子很精彩,感谢您的付出!
关键词: 系统 下载
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。
级别: 茶馆馆主
发帖
563849
飞翔币
199303
威望
3696
飞扬币
2869959
信誉值
0

只看该作者 1 发表于: 2021-04-23
长知识了
级别: 超级版主
发帖
837530
飞翔币
228834
威望
224673
飞扬币
2467694
信誉值
0

只看该作者 2 发表于: 2021-04-23
来看一下
级别: 超级版主
发帖
837530
飞翔币
228834
威望
224673
飞扬币
2467694
信誉值
0

只看该作者 3 发表于: 2021-04-23
不错,了解了