首先说明一下,我学过1年的C++。不过最近没有怎么用它了。我根本不懂DLL注入的做法。现在我做一个基于别人的库的系统,他的SDK的头文件,有一个方法的定义是:extern "C" HRESULT __stdcall QueryMember(LPCWSTR name,REFIID riid,LPVOID FAR *ppv)我现在希望程序能做一些通用的效果。所以希望修改上面方法的调用。所以我想到了 DLL注入 技术。到这里来求救。我根本不知道 QueryMember 是放在哪个 DLL 里的。
(不要问我为什么不知道,总之就是不知道,重点不在这里)我希望我的代码启动后,(那时QueryMember肯定已经装入了的)执行一段实现 DLL注入 的代码,实现了下面的功能:1。找出进程里已经加载的 DLL
2。循环这些 DLL , 找出包含这个 QueryMember 的 DLL
3。把 QueryMember 切换为我自己的 MyQueryMember就这样就足够了。关于注入后如何卸载MyQueryMember不需要考虑。。希望得到你的支持!谢谢。顺便问问 extern "C" 是干什么的?
(不要问我为什么不知道,总之就是不知道,重点不在这里)我希望我的代码启动后,(那时QueryMember肯定已经装入了的)执行一段实现 DLL注入 的代码,实现了下面的功能:1。找出进程里已经加载的 DLL
2。循环这些 DLL , 找出包含这个 QueryMember 的 DLL
3。把 QueryMember 切换为我自己的 MyQueryMember就这样就足够了。关于注入后如何卸载MyQueryMember不需要考虑。。希望得到你的支持!谢谢。顺便问问 extern "C" 是干什么的?
修改导入地址表~把对 QueryMember 的调用全部改成自己的 MyQueryMember~嘿嘿~extern "C" 是在C++中使用C编译方式~
我现在还不完全确定能不能取到它的地址。
不过有个engine.idl里有:#pragma midl_echo("CHSTDCALL QueryMember(LPCWSTR name, REFIID riid, void **ppv);")是什么意思?为什么要做这一句?是不是有希望?注:CHSTDCALL 就是 extern "C" HRESULT __stdcall
QueryMember这应该说明它是 dll 输出吗 ? 为什么没有指定 __declspec(dllexport) 的?因为没有*.cpp,我不知道它是在哪里调用的~~~我现在先重新查查它在那个 dll 中吧。
我在一个dll里找到它了。
(用记事本打开dll,然后找出来的。我现在手头连象样的工具都没有555)下一步该怎么办?谁帮帮我?帖个简单的例子也好。帮我UP也行。我满3回复了。
或者是
bool ReplaceMethodEntryPoint(LPCWSTR srcdll,LPCWSTR srcname,void* pDstMethod);
其中讲解的很详细
http://www.xfocus.net/articles/200304/xfocus_conference_doc.zip
BYTE OldMessageBoxCode[5],NewMessageBoxCode[5]; _asm
{
lea edi,OldMessageBoxCode
mov esi,pfMessageBox
cld
movsd
movsb
}
NewMessageBoxCode[0]=0xe9;//jmp MyMessageBox的相对地址的指令
_asm
{
lea eax,MyMessageBox
mov ebx,pfMessageBox
sub eax,ebx
sub eax,5
mov dword ptr [NewMessageBoxCode+1],eax
}为什么里面是 5 ? 这个 5 是不是和参数数量相关?
用LoadLibrary线程注入一个dll,里面包含着替换的函数,用SetWindowsLongPtr把QueryMember的地址转向到新的函数入口,就可以了。
WINAPI类型的API并没有什么关系,另外,你想要实现的功能,真的不是几行代码能搞定的。
http://www.freewebs.com/cgsoftlabs/zip/Stud_PE1.8.zip
可以很容易的知道任意一个进程加载的所有dll我认为你的问题没有必要使用dll注入