Определения типов монитора API (XML) в код C++

Я программист на С#, который занимается обратным проектированием, и у меня возникли проблемы.

Что я пытаюсь сделать, так это подключить библиотечную функцию в удаленном процессе и записать некоторые данные.

Я использовал API Monitor с некоторыми пользовательскими определениями типов и функций для неизвестной библиотеки (libcef.dll) и я могу перехватывать определенные функции.

Я хочу написать собственное приложение, которое перехватывает эти функции. Я решил использовать EasyHook в C++, так как это кажется проще, чем маршалировать так много в C# с помощью управляемой библиотеки EasyHook.

EasyHook требует, чтобы я определил функцию, которую я хочу перехватить, с правильным соглашением о вызове функции, идентификатором и параметрами.

Однако с моим ограниченным знанием C++ я могу преобразовать определения типов, которые у меня есть для API Monitor (в XML-файле), в код C++, который я затем могу использовать при определении функции, которую я хочу перехватить ( который является cef_parse_url).

Итак, вопрос: как преобразовать приведенные ниже определения типов монитора API (XML) в код C++?

<ApiMonitor>

<Include Filename="Headers\common.h.xml" />

<Module Name="libcef.dll" CallingConvention="CDECL" OnlineHelp="Google">

    <Variable Name="cef_string_t" Type="Struct">
        <Field Type="wchar_t*"    Name="str" />
        <Field Type="size_t"   Name="length" />
        <Field Type="void*"    Name="dtor" />
    </Variable>
    <Variable Name="const cef_string_t" Type="Alias" Base="cef_string_t" />
    <Variable Name="cef_string_t*" Type="Pointer" Base="cef_string_t" />
    <Variable Name="const cef_string_t*" Type="Pointer" Base="const cef_string_t" />

    <Variable Name="cef_urlparts_t" Type="Struct">
        <Field Type="cef_string_t"  Name="spec" />
        <Field Type="cef_string_t"  Name="scheme" />
        <Field Type="cef_string_t"  Name="username" />
        <Field Type="cef_string_t"  Name="password" />
        <Field Type="cef_string_t"  Name="host" />
        <Field Type="cef_string_t"  Name="port" />
        <Field Type="cef_string_t"  Name="origin" />
        <Field Type="cef_string_t"  Name="path" />
        <Field Type="cef_string_t"  Name="query" />
    </Variable>
    <Variable Name="const cef_urlparts_t" Type="Alias" Base="cef_urlparts_t" />
    <Variable Name="cef_urlparts_t*" Type="Pointer" Base="cef_urlparts_t" />
    <Variable Name="const cef_urlparts_t*" Type="Pointer" Base="const cef_urlparts_t" />

    <!-- Parse funcs -->
  
    <Api Name="cef_parse_url">
        <Param Type="const cef_string_t*"   Name="url" />
        <Param Type="cef_urlparts_t*"      Name="parts" />
        <Return Type="int" />
    </Api>

</Module>

Если бы кто-то мог помочь мне, это значило бы для меня целый мир. Я считаю, что кто-то, кто владеет C++ на среднем уровне, сможет легко мне помочь.

Заранее спасибо!


person kazmerk    schedule 08.09.2018    source источник


Ответы (1)


Ладно, неважно.

На самом деле ответ был довольно прост. Я не нашел дополнительных определений, из-за которых это выглядело таким сложным.

typedef struct _cef_string_t {
    wchar_t* str;
    size_t length;
    void(*dtor)(wchar_t* str);
} cef_string_t;

typedef struct _cef_urlparts_t {
    cef_string_t spec;
    cef_string_t scheme;
    cef_string_t username;
    cef_string_t password;
    cef_string_t host;
    cef_string_t port;
    cef_string_t path;
    cef_string_t query;
} cef_urlparts_t;

int _cdecl cef_parse_url(const cef_string_t* url, _cef_urlparts_t* parts);
person kazmerk    schedule 09.09.2018