API 监视器类型定义 (XML) 到 C++ 代码
API Monitor Type Definitions (XML) to C++ Code
我是一名 C# 程序员,正在做一些逆向工程工作,但遇到了一些麻烦。
我想做的是在远程进程中挂钩一个库函数并记录一些数据。
我已经将 API Monitor 与未知库 (libcef.dll) 的一些自定义类型和函数定义一起使用,并且我能够拦截定义的函数。
我想编写自己的应用程序来挂接这些函数。我选择在 C++ 中使用 EasyHook,因为它看起来比使用托管 EasyHook 库在 C# 中编组这么多要简单。
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++ 中级的人来说,能够轻松地帮助我。
提前致谢!
好吧没关系。
答案其实很简单。我发现使它看起来如此复杂的额外定义并不重要。
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);
我是一名 C# 程序员,正在做一些逆向工程工作,但遇到了一些麻烦。
我想做的是在远程进程中挂钩一个库函数并记录一些数据。
我已经将 API Monitor 与未知库 (libcef.dll) 的一些自定义类型和函数定义一起使用,并且我能够拦截定义的函数。
我想编写自己的应用程序来挂接这些函数。我选择在 C++ 中使用 EasyHook,因为它看起来比使用托管 EasyHook 库在 C# 中编组这么多要简单。
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++ 中级的人来说,能够轻松地帮助我。
提前致谢!
好吧没关系。
答案其实很简单。我发现使它看起来如此复杂的额外定义并不重要。
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);