这个技术实现不难,和我网站前面讲的HOOK实现差不多。不过这里稍微有点不同的是,第三方函数是类函数,不像Windows Api提供的函数一样,是带有类名的。比如我这次遇到的是
void CKSWMagicText::SetText(wchar_t const *,unsigned int)
那么这种怎么去拿到函数真实的地址呢?如果是Windows Api函数,比如MessageBoxA,我们可以通过以下代码获得函数地址
hMod = LoadLibraryA("User32.dll");
if(hMod == NULL)
{
MessageBoxA(NULL,"User32模块加载失败","",MB_OK);
return;
}
g_trueMsgBoxA = (_msgboxA)GetProcAddress(hMod,"MessageBoxA");
这个有类名,我们直接用应该是会失败的(我没试),那有什么办法呢?我用Dependency Walker工具打开这个动态链接库,我们看 到的函数名是这样的(本人因技术有限,但是想想类方法肯定也是有特定的标识,记得孙鑫VC++里面讲过动态链接库。
我们直接拿这个像乱码的字符串就可以获取到真实地址了(实测有效),不过最后也有一个麻烦点,这个调用不就悲情了。因为是类方法,不能直接调用(会出错,暂时我也没找到方法)。获取代码如下:
hMagic = LoadLibraryA(".\\kswmagic.dll");
if(hMagic == NULL)
{
MessageBoxA(NULL,"kswmagic模块加载失败","",MB_OK);
return;
}//void CKSWMagicText::SetText(wchar_t const *,unsigned int)
g_SetTextAddr = (_setText)GetProcAddress(hMagic,"?SetText@CKSWMagicText@@QAEXPB_WI@Z");
if(g_SetTextAddr == NULL)
{
MessageBoxA(NULL,"SetText函数加载失败","",MB_OK);
return;
}
本文链接:https://www.it72.com/9406.htm