基础的东西不想多讲,简单的提一句,具体请问度娘。


Windows的PE加载器会从执行文件目录下寻找DLL,如果找不到再去其他地方找。


把我们特定的DLL伪装成系统DLL,然后放在执行文件目录下,就能实现DLL劫持。


劫持来干嘛?

dll劫持redis dll劫持跟dll注入_#pragma

 肯定是要在被干程序体内有一席之地,然后想干什么就干什么。比如劫持ws2_32.dll可以实现抓包,改包,转向等。


如何伪造?

  

当然是伪造导出表啦,导出表是一个DLL最总要的部分。


LPK.dll。 

#pragma comment(linker, "/EXPORT:LpkInitialize=_gamehacker_LpkInitialize,@1")
#pragma comment(linker, "/EXPORT:LpkTabbedTextOut=_gamehacker_LpkTabbedTextOut,@2")
#pragma comment(linker, "/EXPORT:LpkDllInitialize=_gamehacker_LpkDllInitialize,@3")
#pragma comment(linker, "/EXPORT:LpkDrawTextEx=_gamehacker_LpkDrawTextEx,@4")
#pragma comment(linker, "/EXPORT:LpkExtTextOut=_gamehacker_LpkExtTextOut,@6")
#pragma comment(linker, "/EXPORT:LpkGetCharacterPlacement=
_gamehacker_LpkGetCharacterPlacement,@7")
#pragma comment(linker, "/EXPORT:LpkGetTextExtentExPoint=_gamehacker_LpkGetTextExtentExPoint,@8")
#pragma comment(linker, "/EXPORT:LpkPSMTextOut=_gamehacker_LpkPSMTextOut,@9")
#pragma comment(linker, "/EXPORT:LpkUseGDIWidthCache=_gamehacker_LpkUseGDIWidthCache,@10")
#pragma comment(linker, "/EXPORT:ftsWordBreak=_gamehacker_ftsWordBreak,@11")

 



是的,纯手写伪造很麻烦,一会儿还得写转发代码~~~。 如果某DLL的导出函数比较多,那真是一个累人的活儿。

在这里我介绍一款比较好用的自动生成工具:

aheadlib

功能:根据输入DLL的导出表生成劫持源码。

把生成的源码载入vc编译器是可以正常编译的。  

选项很简单,自己摸索,一般默认即可。

在生成的代码中,你能找到:

AheadLib_ + 原始DLL导出函数名 ()

这样的函数

比如:

ALCDECL AheadLib_gethostbyname(void)
{
                  
        GetAddress("gethostbyname");
        __asm JMP EAX;
}

 

你可以在这个函数中添加你自己的响应代码。 拦截就直接retn +参数长度。孩子,知道抓包工具该怎么写了吧?


下面介绍一个好玩的拦截例子。可以注入到大部分的企鹅网络游戏客户端。


在system32目录下有一个 rasadhlp.dll。


企鹅游戏在启动的时候会加载rasadhlp.dll,而且还是在保护机制开启之前。


所以劫持rasadhlp.dll就能过保护轻松注入腾讯游戏。【今天的LOL至少还能注入 2015.7.12】


使用工具,生成一份rasadhlp.dll的劫持代码。


然后在DllMain中添加一些代码。


<ignore_js_op>

 


添加的代码:


注意Load() 函数时工具生成的。这个函数用来加载原始DLL。

HMODULE hLoad;
                char *v;
                hLoad=LoadLibrary("zr.dll");
                if (hLoad==NULL)
                {
                        MessageBoxA(NULL,"无法载入 zr.dll",NULL,MB_OK);
                        goto loading;
                }
                v=(char *)GetProcAddress(hModule,"TxEntry");
                if(!v)
                {
                                MessageBoxA(NULL,"无法找到 TXEntry 函数",NULL,MB_OK);
                                goto loading;
                }
                CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)v,0,0,NULL);
loading:
                return Load();

 



这段代码的目的是加载zr.dll然后调用TxEntry函数。


注入进去后就可以随心所欲的干一些不和谐的事情。 比如搜索内存/修改内存。


到了现在,就可以去易语言论坛找一些最新的 无限视距DLL 注入进去试试啦。


<ignore_js_op>

 


当按下确认按钮后 TP保护才开始加载。


相关工具已经打包。