Assassin_ 发表于 2019-7-3 17:31

一款有意思的VB样本分析

# 一款有意思的VB样本分析
## 前言
VB - 这个本来不想分析的,不过这几天VB的木马程序逐渐增多,还是分析了。不过不分析还好,在分析的时候碰到一些有意思的东西,值得看一下。
首先在看的时候,你需要知道一些东西,VB的一些基础和Windows调试器的一些原理,这个就很有意思的地方了,因为之前没遇到过。以上不了解也没关系,在文章中我会以最简单的话来说一下这些部分。
## 分析
### 样本信息
文件名:uzi.exe
样本大小: 600K
MD5: D99D7FE10CC64F40C6168BFF11379292
SHA-256: E14A7CDB3043FC278A1E34839A968D6E99B7D4755B8297C198E17A8DFE2D5CBE
样本其他信息:


### 环境与工具
Windows32、OD、exeinfo、IDA、VB Decompiler、google

### 初探
这之前我看了一些VB相关的东西,但是感觉还是自己调试时,才能真正了解。
首先将样本拖入VB Decompiler,观察整体结构,但是静态看并不能分析出什么有价值的东西,于是动态调试起来


在调试过程中发现一些端倪


这里存在一个DllFuntionCall,该函数为VB的API接口
该接口首先会通过LoadLibrary和GetProcAddress动态获取其API地址



这里我们看到一个关键函数
EnumThreadWindows,该API会通过会调用程序定义的回调函数


查看代码,回调函数为0x0046e99d


查看回调,其实本能的就会发现这些代码肯定是有问题的


### 狐狸尾巴
找到这个回调直接下断点,运行,代码是结果膨胀的,而且还很多,至少中间几百行都是。看的眼花。


查找关键代码
1. 找到模块首地址

2. 调用关键API,申请空间大小为0xB02C


3. 拷贝代码

4. 异或0x9A88393C 解码

5.解码后代码通过jmp eax调用


### self-debugging
进入代码一路F7,不管乱跳的jmp,找到关键函数0x003B1423,该函数通过查找DllFuntionCall的API接口函数,动态调用API


当看到这些API时,发现这些为调试器的API


直接来到创建进程,可以清楚的看到进程是以调试状态运行的


> 这里说一下调试器中比较重要的一个函数 WaitForDebugEvent
>
> 该函数包含两个参数 BOOL WaitForDebugEvent(   LPDEBUG_EVENT lpDebugEvent,
> DWORD         dwMilliseconds );
>
> 第一个参数为指针,表明事件类型
> 第二个为等待调试事件的事件,一般为INFINITE
>
> 其中第一个参数指向一个结构体
> DEBUG_EVENT typedef struct _DEBUG_EVENT {   DWORD
> dwDebugEventCode;   DWORD dwProcessId;   DWORD dwThreadId;   union {
>   EXCEPTION_DEBUG_INFO      Exception;
>   CREATE_THREAD_DEBUG_INFOCreateThread;
>   CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
>   EXIT_THREAD_DEBUG_INFO    ExitThread;
>   EXIT_PROCESS_DEBUG_INFO   ExitProcess;
>   LOAD_DLL_DEBUG_INFO       LoadDll;
>   UNLOAD_DLL_DEBUG_INFO   UnloadDll;
>   OUTPUT_DEBUG_STRING_INFODebugString;
>   RIP_INFO                  RipInfo;   } u; } DEBUG_EVENT, *LPDEBUG_EVENT;
>
> 第一个参数为事件码 第二三个参数为进程、线程ID
> 最后一个为共用体,由第一参数决定,基本每种事件来,都会有与之对应的一个结构体,可以获取相应的信息,这里就不展开了。

接下来我们看样本的具体操作
查看调试器主体部分,已经采用注释


可以看到该基本所有来的事件都是通过ContinueDebugEvent 放过去了。
主要关注内存访问异常
首先获取ntdll模块的地址,与获取异常的模块地址进行比较,如果大于等于的话,就直接修改内存地址为可读可执行


我们猜测该调试程序如果直接调试可能通过引起内存访问异常,进而调试失败。

### 调试被调试程序

首先,找到调试开关,还是比较明显的


我们首先把ntdll 模块的属性修改为0x40,防止那个内存访问异常(内存访问异常可能不会到,我调试过程中,存在访问异常,之后再复现的时候,死活不出现访问异常了)
找到自身模块地址,并找到加密代码


代码复制解码


密钥解码


二者最后xor运算


解码之后得到一个PE文件


再次创建进程,以挂起的形式进行创建


之后就是常规操作了
模块卸载


申请空间,大小为A200


代码写入


获取进程上下文

设置进程上下文


最后恢复进程并退出


### RAT
该RAT为一个LOKI.bot,该文件文件具有信息窃取和键盘记录等功能,该RAT有时间再分析,很规矩rat,如果有兴趣,可以自行研究,不过之后应该也会写关于这个的相关报告。

## 总结
总体主要是有调试器的参与,其他比较基础,适合新手。

附件:52pojie

hxp.china.sh 发表于 2019-7-16 16:41

我有个VB写的工具,这个工具一运行就报个窗口,消息是不在服务期内,不能使用,确定后就关闭了。OD载入,运行,跳出窗口,F12暂停,ALT+k或ALT+F9都不能返回到程序领空上面,一直在user32调用循环,一直不能返回用户代码,有什么好方法吗!!!跳过这个窗口能正常运行登陆进去。。

sadness 发表于 2019-11-26 19:15

这几天收集到了几个VB样本,基础手法和这个很相似,怀疑是一个apt组织的,反调试增加了一个利用系统调用号+kisystemfastcall绕过ntdll的检测,不过我暂时还没分析完,才开始做分析,还是要好好努力哎。!

hexie666 发表于 2019-7-3 18:58

前排 很不错!!!!!

NB2665597272 发表于 2019-7-3 21:20

可以加精了

lovejoan 发表于 2019-7-4 08:18

这年代了还有人用VB写木马~~估计是重操旧业的吧

x163326 发表于 2019-7-4 09:28

这么古董了呀?

Joduska 发表于 2019-7-4 10:20

{:301_997:} 希望多分享分析流氓软件

uulive 发表于 2019-7-4 10:25

谢谢,我来学习一下。

yeqiang163 发表于 2019-7-4 13:34

古董木马啊 学习了!

jim19 发表于 2019-7-5 01:07

前排 很不错!!!!!

单调的调调 发表于 2019-7-5 07:22

这个必须支持楼主
页: [1] 2 3 4 5 6 7 8
查看完整版本: 一款有意思的VB样本分析