2014-12-30 47 views
1

我有一个目标进程,它的主代码被调用之前加载一个DLL。它通过名称被添加到文件的ImportsTable(使用StudPE)的DLL来完成此操作。我的目标是创建一个钩子DLL,它将被注入到这个进程中并在加载它的导入之前拦截它的调用。所以目标进程会在它的安全DLL之前加载我的hook dll。我尝试使用传统的方法,但我没有成功,因为安全DLL总是在我的钩子DLL的DllMain被调用之前被调用。有谁能告诉我一种解决这个问题的方法吗?在调用导入之前将钩子DLL注入进程?

回答

0

您可以创建目标进程暂停,并使用远程线程()用于注射,但记住以下限制:

  1. 你应该为远程线程复制线程主程序到目标进程的地址空间。
  2. 此代码不能包含任何外部引用(例如CRTL或直接WinApi调用)。我通常会限制这些代码加载DLL并执行它的函数,或者依靠DllMain完成你需要的工作。为了调用LoadLibrary和GetProcAddress方法,我获取它们的地址并将包含此信息的结构复制到目标进程,并将远程结构的地址作为CreateRemoteThread()中的线程主例程的参数。您可以使用VirtualAllocEx()在远程进程中分配内存。
  3. 这种情况下的远程线程将在主线程之前执行,包括进程和一些Win32/64的初始化。因此,在这种情况下,并不是每个Win32 API都可以安全地调用。

如果目标进程是由其他人产生的,则必须在其初始化之前拦截其创建。有一些方法可以做到这一点,所有这些方法都是无证的,因此没有未来的证据。

0

该DLL按照与PE标题中的导入条目相同的顺序依次加载。大多数PE编辑会让你重新排序进口。您还应该注意,如果另一个DLL X具有对安全DLL的依赖关系,那么它将与DLL X同时加载。另外,如果安全DLL使用静态加载,则在运行时通过修改导入表进行挂接仍应该是即使您的DLL稍后被加载也是有效的,但您将错过在此期间完成的调用(但不应该有任何)。