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 | |
这个函数用以创建并默认初始化由参数 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 | |
这个实验相对比较简单,可以当作是一个COM的应用示例。
上述的代码还原如下:
1 | |
可以注意到上面的代码中,调用COM对象的过程比较复杂。
而这整个程序其实就是使用Internet Explorer打开一个广告弹窗(http://www.malwareanalysisbook.com/ad.html)后退出。