现在破解软件都挺流行用lpk.dll这种DLL劫持方式,简单的说一下DLL劫持技术原理和实现方法。


可以劫持的DLL很多,这里就以lpk.dll为例子。


文章分为两部分:
        一、纯理论的DLL劫持原理
        二、纯实践的实现方法


一、DLL劫持原理
引用

DLL劫持原理

--------------------------------------------------------------------------------
  DLL劫持技术当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中。
  由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。
  伪造的dll制作好后,放到程序当前目录下,这样当原程序调用原函数时就调用了伪造的dll的同名函数,进入劫持DLL的代码,处理完毕后,再调用原DLL此函数。
  这种补丁技术,对加壳保护的软件很有效,选择挂接的函数最好是在壳中没有被调用的,当挂接函数被执行时,相关的代码已被解压,可以直接补丁了。在有些情况下,必须用计数器统计挂接的函数的调用次数来接近OEP。此方法巧妙地绕过了壳的复杂检测,很适合加壳程序的补丁制作。
  一些***或病毒也会利用DLL劫持技术搞破坏,因此当在应用程序目录下发现系统一些DLL文件存在时,如lpk.dll,应引起注意。


程序自动调用DLL步骤:
        1、程序执行将自动调用某个DLL文件,程序只指明了DLL文件名而没有指明具体路径
        2、程序会首先在程序运行目录寻找需要加载的DLL文件,找到便加载,没有找到进行第三步
        3、去系统目录寻找,找到加载, 没找到,到下一个地方寻找

我们需要做的:
        1、我们伪造一个程序自动调用的DLL文件,放在程序同一个目录下,例如:lpk.dll
        2、等程序运行来调用我们伪造的DLL

程序一旦调用了,剩下的就是你想把那个程序怎么办就怎么办了。     


那么,怎么伪造呢?且看第二部分:实现方法


二、实现方法
        我用易语言,就说说易语言的方法,以及在lpk.dll中加载窗口的方法

        因为程序调用lpk.dll时不能执行易语言支持库的命令,所以所有命令必须使用API,那么限制就比较多,虽然API简单,但是使用起来却没有支持库命令来的方便。
        既然只能执行api,那么我们就再写一个DLL文件用lpk.dll去调用它(为方便把被调用的命名为 e.dll),在e.dll里面写代码就没有任何限制了。
        1、创建一个DLL文件,在动态链接库初始化代码中写入需要执行的命令,编译出来,修改文件名为lpk.dll就行了(非易语言用户到此为止)
        2、编写调用e.dll的代码,然后把lpk.dll编译出来,进行封装处理
        3、编写e.dll代码,编译出来