如何从 IDA 中的 CoCreateInstance 中找到 CLSID?

逆向工程 艾达 拆卸
2021-06-25 07:43:50

CoCreateInstance()在 IDA 反汇编中找到了一个(之后CoInitializeEx())。以下是大会:

loc_18000499D:          ; pUnkOuter
xor     edx, edx
mov     [rsp+68h+ppv], rbx ; ppv
lea     r9, riid        ; riid
lea     rcx, rclsid     ; rclsid
lea     r8d, [rdx+4]    ; dwClsContext
call    cs:CoCreateInstance
mov     ebx, eax
mov     eax, 8007019Eh
cmp     ebx, 80040154h
cmovz   ebx, eax
test    ebx, ebx
jns     short loc_1800049D7

伪代码是:

CoCreateInstance(&rclsid, 0i64, 4u, &riid, v4 + 1);

当我单击rclsid时,它被重定向到只读数据段。这是 .rdata 部分:

.rdata:0000000180007930 ; IID rclsid
.rdata:0000000180007930 rclsid          dd 4F476546h            ; Data1
.rdata:0000000180007930                                         ; DATA XREF: f_CoInitialize+A7↑o
.rdata:0000000180007930                 dw 0B412h               ; Data2
.rdata:0000000180007930                 dw 4579h                ; Data3
.rdata:0000000180007930                 db 0B6h, 4Ch, 12h, 3Dh, 0F3h, 31h, 0E3h, 0D6h; Data4
.rdata:0000000180007940 ; IID riid
.rdata:0000000180007940 riid            dd 536A6BCFh            ; Data1
.rdata:0000000180007940                                         ; DATA XREF: f_CoInitialize+A0↑o
.rdata:0000000180007940                 dw 0FE04h               ; Data2
.rdata:0000000180007940                 dw 41D9h                ; Data3
.rdata:0000000180007940                 db 0B9h, 78h, 0DCh, 0ACh, 2 dup(0A9h), 0B5h, 0B9h; Data4

那么,我如何才能找到 CLSID?我试图用Dkey更改数据类型,但无法理解。

2个回答

CLSID 是一个 GUID,虽然 GUID 可以表示为字符串,但它实际上是一个如下所示的结构:

typedef struct _GUID {
  DWORD Data1;
  WORD  Data2;
  WORD  Data3;
  BYTE  Data4[8];
} GUID;

尽管在 Ida 中无法将 GUID 显示为字符串,但您可以将其转换为这样的结构:

选择代表您的 CLSID 的 16 个字节,右键单击并从弹出菜单中选择结构。然后从子菜单中选择_GUID结构菜单

这是显示 Data1、Data2、Data3 和 Data4 成员的结果 字节转换为 GUID 结构

如果要将其转换为字符串,则需要创建一个执行以下操作的 idc 脚本: sprintf(szGuid, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);

根据@Remko 的想法,我制作了一个 IDC 脚本来将 GUID 数据转换为 sting。这是脚本:

#include <idc.idc>

static MakeGuid(ea)
{
    auto string = sprintf("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\n", 
        Dword(ea), Word(ea+4), Word(ea+6), Byte(ea+8), Byte(ea+9),
        Byte(ea+10), Byte(ea+11), Byte(ea+12), Byte(ea+13), Byte(ea+14), Byte(ea+15)
    Message(string);
    return 0;
}

指示:

在任何文本编辑器中制作一个文本文件。添加 .IDC 扩展名。粘贴上面的代码。使用Alt+ F7(或 File > Load Script 菜单)在 IDA 中加载 IDC 脚本文件Alt+ 0(零)打开输出窗口MakeGuid(variable_name);在该窗口的下方键入,GUID 将显示为字符串。例如,在我的问题中,键入MakeGuid(rclsid);. 总是在函数后放一个分号。

资料来源: