我是一名C#程序员,正在做一些反向工程工作,我遇到了一些麻烦。
我要做的是在远程进程中挂接一个库函数,并记录一些数据。
我将API Monitor与未知库(libcef.dll)的一些自定义类型和函数定义一起使用,并且我能够截获已定义的函数。
我想编写自己的应用程序来挂钩这些函数。我选择在C++中使用EasyHook,因为它看起来比使用托管EasyHook库在C#中编组这么多内容更简单。
EasyHook要求我定义要与正确的函数调用约定、标识符和参数挂钩的函数。
但是,由于我对C++的了解有限,我能够将API Monitor的类型定义(在XML文件中)转换为C++代码,然后在定义要挂钩的函数(即cef_parse_url)时使用这些代码。
所以问题是:如何将下面的API Monitor类型定义(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++中级水平的人来说,能够很容易地帮助到我。
提前感谢!
发布于 2018-09-09 14:09:20
好吧,算了吧。
答案其实很简单。我发现,让它看起来如此复杂的额外定义并不重要。
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);https://stackoverflow.com/questions/52240159
复制相似问题