第三方DLL动态库函数参数内存复制实现

Home / Hackintosh MrLee 2016-5-26 3775

这个技术实现不难,和我网站前面讲的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++里面讲过动态链接库。

QQ截图20160526172353


我们直接拿这个像乱码的字符串就可以获取到真实地址了(实测有效),不过最后也有一个麻烦点,这个调用不就悲情了。因为是类方法,不能直接调用(会出错,暂时我也没找到方法)。获取代码如下:
	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

推荐阅读
最新回复 (0)
返回