调试 Win32.Upatre - 为什么 Ollydbg 无法分析这个?

逆向工程 ollydbg 恶意软件 混淆 反调试 去混淆
2021-06-20 10:17:01

所以我一直在看这个线程 -作为个人,我可以在哪里获取恶意软件样本进行分析? 并从Halvar Flake 的博客中获取了Win32.Upatre的二进制样本

我开始在我的 VM (Win XP SP 3) 中分析文件并在 Olly 中加载恶意软件。我注意到代码看起来是加密的——我搜索了代码中的所有调用并得到了这个:

在此处输入图片说明

这似乎不太正常。

所以我继续前进并开始从 EP 踏出希望登陆一些解密程序 -

在此处输入图片说明

我将简要解释我从调试这段代码中得出的结论:

1 - 获取传递给这个可执行文件的参数 - 我很确定在此之前的任何代码都是无关紧要的,但我可能是错的。

2 - 调用 GetStartupInfo - 不太清楚为什么

3 - 调用 00401C80 将 EP 作为参数传递

所以我继续跳00401C80过去检查这是怎么回事,发现这段代码对我来说有点像垃圾代码 -

在此处输入图片说明

我怀疑是因为有一些指令对我来说似乎不合逻辑,例如:

MOV EAX, 64
CMP EAX,3E8

但我可能错了。

问题是在函数结束后,一个值被复制到ECX然后CALL ECX被调用,最终以内存访问冲突结束:

在此处输入图片说明

无论我做什么或如何使用此函数中的标志,我都会遇到访问冲突或代码退出。

SOOOOOOOOO,我的第一个想法是我正在处理某种反调试技术,所以我尝试在 VM 内运行恶意软件并从中拦截一些数据 -

在此处输入图片说明

看起来它运行正常,甚至创建了一个 UDP 套接字,没有访问冲突或类似的东西。

我尝试在网上查找有关此病毒的报告,但找不到有关如何绕过此障碍的任何资源。

任何人都知道我应该如何处理这个问题?为什么奥利失败了?这段代码如何知道它正在被调试?它似乎没有为此使用某种 API(例如 IsDebuggerPresent)。

提前感谢大家。

2个回答

关于 "??3@YAXPAX" 调用,它被称为Name Mangling,看看这个线程以获得更多解释。

“YAXPAX”调用实际上是deleteC++ 运算符。

关于__set_app_type__getmainargsGetStartupInfo等,是由编译器生成的调用和之前usally叫main功能。它们不是您愿意分析的程序源代码的一部分,因此您不必分析它们。

您的 main 似乎位于00401C80,因为它通常在调用 之前exit这是您开始认真分析事物的地方。

关于反调试保护,很少有指令让我觉得程序中有一些可以捕获异常的东西: 在此处输入图片说明

cmp [0], 0应该会崩溃,所以也许某处安装了一些自定义异常处理程序。我会说检查 TLS 回调函数,但我可能错了。您应该能够通过按 Shift+F7 来传递异常,中断 NtContinue,读取 CONTEXT结构并继续执行程序。

这里列出了您可能会发现的最常见的反调试技巧——包括线程本地存储技巧。

import base64
import zipfile
import os
import hashlib
infile = open("c:\\halvar\\halvfem.bin","rb")
outfile = open("c:\\halvar\\halvfem.zip","wb")
base64.decode(infile,outfile)
infile.close()
outfile.close()
if (zipfile.is_zipfile("c:\\halvar\\halvfem.zip")):
    myzip = zipfile.ZipFile("c:\\halvar\\halvfem.zip",'r')
    myzip.extractall('c:\\halvar\\',myzip.namelist(),'infected')
    os.rename(myzip.namelist()[0],"halvar_challenge.exe")
    print hashlib.md5(open('c:\\halvar\\halvar_challenge.exe','rb').read()).hexdigest()

这是你说的文件吗

C:\halvar>python decode.py
172aed81c4fde1cf23f1615acedfad65

C:\halvar>f:\odbg110\OLLYDBG.EXE halvar_challenge.exe

在调用 ecx 之前,exe 正在设置结构化异常处理程序,您应该遵循异常处理程序可能多次

提示在 msvcrt 中检查此功能

77C2275C MSVCRT._JumpToContinuation    $  8BFF          MOV     EDI, EDI

如果您遵循它们,您应该能够看到 LoadLibrary 和 GetProcAddress 正在解析 0x89 导入

在发布此之前,我一直关注到 CreateEvent

0013FD90   0040F520  /CALL to CreateEventA from halvar_c.0040F51D
0013FD94   00000000  |pSecurity = NULL
0013FD98   00000001  |ManualReset = TRUE
0013FD9C   00000000  |InitiallySignaled = FALSE
0013FDA0   0013FDCC  \EventName = "{AB8D393B-9177-440d-B3F8-1C1FE0CF9692}"