Cmc5410 发表于 2015-1-10 20:51

DLL另類劫持注入法

本帖最后由 Cmc5410 于 2015-1-10 21:11 编辑

// Win32Project2.cpp : 定义 DLL 应用程序的导出函数。
//爲什麼論壇沒有代碼高亮插件
//下一篇發佈LOL人物基址特徵碼
//求給力求評分
//以及利用基址實現各種功能
//
///////////////////////////////////////////////////////////////////////////////////////////////////////
/*

                                 DLL名称劫持注入法

当游戏运行加载一个重要的的DLL模块时,我们让他来加载我们需要注入的DLL和原来那个必须加载的游戏DLL模块。

比如说一些游戏加载游戏本身DLL“client.dll”。
游戏DLL“client.dll”重命名为“client- original.dll”。
把我们需要注入的DLL重命名成“client.dll”,并把2个DLL放在一起。
把下面源码的client.exe更换成你需要注入的游戏的进程名。

原理:
游戏运行时先加载我们伪造的DLL“client.dll”,但由于关键函数还在原来的client.dll中。
所以先将自身复制为临时文件“client - temp.dll”
加载后然后卸载本身。替换原来的“client.dll”并加载。
然后,它运行一个bat脚本,将等待游戏退出,一旦游戏退出。
bat脚本将复制临时文件“client - temp.dll”到“client.dll”,
这样它就会在下次游戏启动时继续加载。


*/
#include "stdafx.h"
#include "fstream"
using namespace std;


void 替换(char* szBuffer, size_t bufferSize, char* from, char* to)
{
      char* szpTemp,
                *szpTempBuffer,
                *szpCurrentBuffer;


      szpCurrentBuffer = szBuffer;
      szpTempBuffer = new char;

      while (true)
      {
                szpTemp = strstr(szpCurrentBuffer, from);

                if (szpTemp != NULL)
                {
                        if (strlen(szBuffer) - strlen(from) + strlen(to) < bufferSize)
                        {
                              strcpy(szpTempBuffer, szpTemp + strlen(from));

                              *szpTemp = '\0';
                              strcat(szpTemp, to);
                              szpCurrentBuffer = szpTemp + strlen(to);
                              strcat(szpTemp, szpTempBuffer);
                        }
                        else
                              break;
                }
                else
                        break;
      }

      delete[] szpTempBuffer;
}

DWORD WINAPI ThreadMain(LPVOID lpvParam)
{
      MessageBox(0, "劫持注入成功", "hello", 0);

      return 0;
}

BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpvReserved)
{
      BYTE* pCave;

      ifstream in;

      ofstream out;

      BOOL bLoad;

      FARPROC targetFunction;

      HMODULE hTargetModule;

      char* szpName;

      char szFileName,
                szBuffer,
                szTempBuffer;

      char* szpTargetModule;

      STARTUPINFO si = { sizeof(STARTUPINFO) };

      PROCESS_INFORMATION pi;

      char szCmdLine;


      bLoad = FALSE;


      if (dwReason == DLL_PROCESS_ATTACH)
      {
                GetModuleFileName(hModule, szFileName, sizeof(szFileName));
                strcpy(szBuffer, szFileName);

                // 判断自身是否为临时文件,如果不是临时文件将创建并加载
                if (strstr(szFileName, " - temp.dll") == NULL)
                {
                        替换(szBuffer, sizeof(szBuffer), ".dll", " - temp.dll");

                        if (CopyFile(szFileName, szBuffer, FALSE) != NULL)
                        {
                              szpTargetModule = (char*)VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

                              strcpy(szpTargetModule, szBuffer);

                              hTargetModule = GetModuleHandle("Kernel32.dll");
                              targetFunction = GetProcAddress(hTargetModule, "LoadLibraryA");

                              pCave = (BYTE*)VirtualAlloc(NULL, 0x10, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
                              *pCave++ = 0x68;
                              *(DWORD*)pCave = (DWORD)szpTargetModule;
                              pCave += 4;
                              *pCave++ = 0xe8;
                              *(DWORD*)pCave = (DWORD)((DWORD)targetFunction - (DWORD)pCave - 4);
                              pCave += 4;
                              *pCave++ = 0xc2;
                              *pCave++ = 0x04;
                              *pCave++ = 0x00;
                              pCave -= 13;

                              CreateThread(0, 0, (LPTHREAD_START_ROUTINE)pCave, 0, 0, 0);
                        }
                }
                else
                {
                        // 如果是临时的DLL
                        替换(szBuffer, sizeof(szBuffer), " - temp.dll", ".dll");

                        // 等待遊戲主進程是否佔用此DLL等待寫入權限
                        do
                        {
                              in.open(szBuffer, ios::out);

                              if (in.is_open() == true)
                              {
                                        in.close();
                                        break;
                              }

                              Sleep(1000);
                        } while (true);



                        // 写一个bat脚本,一旦游戏退出,恢复自身文件名,下次可以继续加载
                        ////把下面的client.exe改成你需要注入的游戏进程名
                        out.open("bat.bat", ios::out);

                        if (out.is_open() == true)
                        {
                              out << ":WAITLOOP" << endl;
                              out << "tasklist /FI \"IMAGENAME eq Client.exe\" 2>NUL | find /I /N \"Client.exe\">NUL" << endl;
                              out << "if \"%ERRORLEVEL%\"==\"0\" goto RUNNING" << endl;
                              out << "goto NOTRUNNING" << endl;

                              out << ":RUNNING" << endl;
                              out << "timeout /t 2" << endl;
                              out << "goto WAITLOOP" << endl;

                              out << ":NOTRUNNING" << endl;
                              out << "copy \"" << szFileName << "\" \"" << szBuffer << "\"" << endl;
                              out.close();

                              strcpy(szTempBuffer, szFileName);
                              *strrchr(szTempBuffer, '\\') = '\0';

                              sprintf(szCmdLine, "cmd.exe /C \"%s\\bat.bat\"", szTempBuffer);

                              CreateProcess(NULL, szCmdLine, 0, 0, FALSE, CREATE_UNICODE_ENVIRONMENT, NULL, 0, &si, &pi);
                        }

                        替换(szFileName, sizeof(szFileName), " - temp.dll", " - original.dll");
                        CopyFile(szFileName, szBuffer, FALSE);

                        LoadLibrary(szBuffer);

                        CreateThread(0, 0, ThreadMain, 0, 0, 0);
                        bLoad = TRUE;
                }
      }

      return bLoad;
}

yAxI丶9y 发表于 2015-1-10 21:05

么么哒我居然是沙发~~{:5_116:}

Desire 发表于 2015-1-10 21:09

yAxI丶9y 发表于 2015-1-10 21:05
么么哒我居然是沙发~~

{:5_188:}你跟楼主是什么关系,我C{:5_188:}

Desire 发表于 2015-1-10 21:15

我在你博客里看到了传说中的LOL基址了

520Kelly 发表于 2015-1-10 21:23

为什么没有E源码

我叫KK 发表于 2015-1-10 21:28

为什么没有E源码 我喜欢E(┬_┬)

Crook 发表于 2015-1-10 21:54

要是易语言的源码就更容易看懂了

yAxI丶9y 发表于 2015-1-11 00:01

心有予悸 发表于 2015-1-10 21:09
你跟楼主是什么关系,我C

{:5_188:}不能说的秘密- -

timmy 发表于 2015-1-11 00:07

感谢楼主无私奉献

Foezen 发表于 2015-1-11 00:24

真心看不懂 感谢分享!
页: [1] 2
查看完整版本: DLL另類劫持注入法