Malware Analysis Lab07-02 EXP

Malware Analysis Lab07_02 EXP

Practical Malware Analysis Lab07_02 Experiment log.

这个实验的主要内容涉及Windows中的COM(Component Object Model)相关的接口。

Introduction to COM

COM被实现成一个客户-服务器架构,客户端是那些使用COM对象的程序,服务器是那些可复用的软件组间,也就是COM本身。

COM对象通过它们的全局唯一标识符(GUID)进行标识,而GUID又由类型标识符(CLSID)以及接口标识符(IID)组成,其中类型标识符用以标识提供COM的程序(服务器),而接口标识符则用以标识程序提供的接口。

在HKLM\SOFTWARE\Classes\CLSID和HKCU\SOFTWARE\Classes\CLSID注册表键中存储了关于那些代码执行这个COM服务器的信息,比如,在HKLM\SOFTWARE\Classes\CLSID\0002DF01-0000-0000-C000-000000000046的LocalServer32子键中保存了键值C:\Program Files\Internet Explorer\iexplore.exe,这就意味着当CoCreateInstance()函数被调用时要加载的可执行文件。通常,能够在HKLM\SOFTWARE\Classes\Interface目录下找到一些有关于IID的信息,但是也会有例外的情况。

COM有两种加载方式:#1,以自己的独立进程加载,LocalServer;#2,被作为DLL实现,加载到COM客户端可执行文件的进程空间,InproServer。

每一个使用COM的线程,必须在调用任何其他COM库函数之前,至少调用一次OleInitialize()和CoInitializeEx()函数,随后,该线程通过调用CoCreateInstance()函数来获取对COM函数的访问,也就是获取服务器所提供的接口的访问。

HRESULT OleInitialize()函数只接受一个参数,这个参数被保留并且必须为NULL,然后这个函数将会初始化COM库。

用以获取COM函数访问的接口定义如下:

1
2
3
4
5
6
7
HRESULT CoCreateInstance(
[in] REFCLSID rclsid,
[in] LPUNKNOWN pUnkOuter,
[in] DWORD dwClsContext,
[in] REFIID riid,
[out] LPVOID *ppv
);

这个函数用以创建并默认初始化由参数 CLSID 指定的类的单个对象。也就是根据参数所提供的CLSID以及IID,输出对应的COM对象。

HRESULT CoCreateInstance()接口所接受的参数的含义如下:

  • rclsid:这个参数就是所请求COM对象的CLSID,这个结构体的布局是4, 2, 2, 8字节的数据,其实就对应于HKLM\SOFTWARE\Classes\CLSID\目录下的名称,比如前面提到的iexplorer.exe所对应的CLSID的值就是0002DF01-0000-0000-C000-000000000046,这串数字会被存放到上面提到的这个4, 2, 2, 8布局的结构体中;
  • pUnkouter: 如果为 NULL,则表示该对象不是作为聚合的一部分创建的。如果非 NULL,则指向聚合对象的 IUnknown 接口;
  • dwClsContext:这个参数用以提示目标COM对象的加载方式,常见的由LocalServer和InproServer两种类型,如果这个COM对象是LocalServer类型的,那么注册表中对应的子键就是LocalServer,对应的键值就是一个EXE文件的路径;如果这个COM对象是LocalServer类型的,那么注册表中对应的子键就是InproServer,对应的键值就是一个DLL文件的路径;
  • riid:目标COM对象的IID;
  • ppv:当传入这个参数时,需要将其指定为指针的指针,即(void **)&ppv,因为这个值本身是一个指针,而API为了修改这个指针的值,需要传入这个指针的地址;

这个接口的返回值用以标示函数是否成功执行。但是实际上,我们通常以传入参数ppv指针是否为NULL来判断这个函数是否成功执行。

int __cdecl main

这个实验只有一个主函数,其代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
sub     esp, 24h
push 0 ; pvReserved
call ds:OleInitialize
test eax, eax
jl short loc_401085
lea eax, [esp+24h+ppv] ; eax = esp + 24h
push eax ; ppv
push offset riid ; riid
push 4 ; dwClsContext
push 0 ; pUnkOuter
push offset rclsid ; rclsid
call ds:CoCreateInstance
mov eax, [esp+24h+ppv] ; eax = *(esp + 24h)
test eax, eax
jz short loc_40107F
lea ecx, [esp+24h+pvarg]
push esi
push ecx ; pvarg
call ds:VariantInit
push offset psz ; "http://www.malwareanalysisbook.com/ad.h"...
mov [esp+2Ch+var_10], 3
mov [esp+2Ch+var_8], 1
call ds:SysAllocString
lea ecx, [esp+28h+pvarg]
mov esi, eax
mov eax, [esp+28h+ppv]
push ecx
lea ecx, [esp+2Ch+pvarg]
mov edx, [eax]
push ecx
lea ecx, [esp+30h+pvarg]
push ecx
lea ecx, [esp+34h+var_10]
push ecx
push esi
push eax
call dword ptr [edx+2Ch]
push esi ; bstrString
call ds:SysFreeString
pop esi
loc_40107F:
call ds:OleUninitialize
loc_401085:
xor eax, eax
add esp, 24h
retn
_main endp

这个实验相对比较简单,可以当作是一个COM的应用示例。

上述的代码还原如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
CLSID rclsid = {0x2DF01, 0, 0, {0xc, 0, 0, 0, 0, 0, 0, 0x46}};	// CLSID to Internet Explorer
GUID riid = {0xD30C1661, 0xCDAF, 0x11D0, {0x8A, 0x3E, 0, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E}}; // IID to IWebBrowser

int main()
{
LPVOID *ppv;
VARIANTARG pvarg;
HRESULT hr;
BSTR url;
__int16 bytes[0] = 3;

hr = OleInitialize(NULL);
if(hr < 0)
return 0;
CoCreateInstance(rclsid, NULL, CLSCTX_LOCAL_SERVER, riid, (LPVOID **)&ppv);
if(ppv == NULL)
{
OleUninitialize();
return 0;
}
VariantInit(&pvarg); // Initializes a variant.
url = SysAllocString("http://www.malwareanalysisbook.com/ad.html");
(*(void (__stdcall **)(LPVOID, OLECHAR *, __int16 *, VARIANTARG *, VARIANTARG *, VARIANTARG *))(*(_DWORD *)ppv + 44))(
ppv,
url,
bytes,
&pvarg,
&pvarg,
&pvarg,
);
SysFreeString(url);
OleUninitialize();
return 0;
}

可以注意到上面的代码中,调用COM对象的过程比较复杂。

而这整个程序其实就是使用Internet Explorer打开一个广告弹窗(http://www.malwareanalysisbook.com/ad.html)后退出。


Malware Analysis Lab07-02 EXP
https://2hyan9.github.io/2023/03/03/Malware-Analysis-Lab07-02-EXP/
作者
2hYan9
发布于
2023年3月3日
许可协议