-
-
[讨论]关于如何让目标加载DLL外挂的问题
-
发表于:
2014-11-15 15:49
4076
-
1、SetWindowsHookEx
DLL 必须导出 WinHookProc 钩子程序
function WinHookProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
Result:= CallNextHookEx(hHook, code, wparam, lparam);
end;
编写启动程序创建目标程序进程,为目标程序安装钩子。
这种方法,入口主要集中在 WinHookProc,并且需要在DLL导出表中。并且需要依赖启动程序。
2、 CreateRemoteThread
DLL 可以是任意程序
编写启动程序为目标程序注入线程,目标程序自身去调用 LoadLibrary 来载入DLL外挂。
这种方法,DLL中可以没有特定入口,可以自由加载,比较灵活,但是依然要依赖外部程序创建和卸载远程线程。
3、伪装系统DLL或目标程序依赖的DLL,例如 lpk.dll usp10.dll
这种方法最大的优点是无需依赖外部程序,自生自灭,坏处是容易被杀毒软件查杀,或者因为系统版本的问题,导致无法加载成功,比如WINXP以后已经无法伪装系统DLL,如果目标程序又没有依赖的DLL,那么这种方法就失效了。
另外还有一种个人推荐的方法,CreateProcess 方法注入DLL,这种办法,可在目标程序入口点,Inject 代码,加载 DLL 完成后,恢复入口点继续执行程序。
1. 用CreateProcess(CREATE_SUSPENDED)启动目标进程。
2. 找到目标进程的入口,用ImageHlp中的函数可以实现。
3. 将目标进程入口的代码保存起来。
4. 在目标进程的入口写入LoadLibrary(MyDll)实现Dll的注入。
5. 用ResumeThread运行目标进程。
6. 目标进程就运行了LoadLibrary(MyDll),实现DLL的注入。
7. 目标进程运行完LoadLibrary(MyDll)后,将原来的代码写回目标进程的入口。
8. 目标进程Jmp至原来的入口,继续运行程序。
这种方法,与前3种比起来,优势明显
我认为最好的方法,如果其他朋友还有更好的实现方法,请不吝赐教~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)