// Win32Project2.cpp : 定义 DLL 应用程序的导出函数。
//
///////////////////////////////////////////////////////////////////////////////////////////////////////
/* 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[bufferSize]; 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(, "劫持注入成功", "hello", ); return ;
} 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[MAX_PATH],
szBuffer[MAX_PATH],
szTempBuffer[MAX_PATH]; char* szpTargetModule; STARTUPINFO si = { sizeof(STARTUPINFO) }; PROCESS_INFORMATION pi; char szCmdLine[MAX_PATH]; 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, , 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 += ;
*pCave++ = 0xe8;
*(DWORD*)pCave = (DWORD)((DWORD)targetFunction - (DWORD)pCave - );
pCave += ;
*pCave++ = 0xc2;
*pCave++ = 0x04;
*pCave++ = 0x00;
pCave -= ; CreateThread(, , (LPTHREAD_START_ROUTINE)pCave, , , );
}
}
else
{
// 如果是临时的DLL
替换(szBuffer, sizeof(szBuffer), " - temp.dll", ".dll"); // 等待遊戲主進程是否佔用此DLL 等待寫入權限
do
{
in.open(szBuffer, ios::out); if (in.is_open() == true)
{
in.close();
break;
} Sleep();
} 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, , , FALSE, CREATE_UNICODE_ENVIRONMENT, NULL, , &si, &pi);
} 替换(szFileName, sizeof(szFileName), " - temp.dll", " - original.dll");
CopyFile(szFileName, szBuffer, FALSE); LoadLibrary(szBuffer); CreateThread(, , ThreadMain, , , );
bLoad = TRUE;
}
} return bLoad;
}

DLL另類劫持注入法的更多相关文章

  1. 注入技术--LSP劫持注入

    1.原理 简单来说,LSP就是一个dll程序. 应用程序通过winsock2进行网络通信时,会调用ws2_32.dll的导出函数,如connect,accept等. 而后端通过LSP实现这些函数的底层 ...

  2. 安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程

    简介        大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文 ...

  3. Sqli labs系列-less-5&6 报错注入法(下)

    我先输入 ' 让其出错. 然后知道语句是单引号闭合. 然后直接 and 1=1 测试. 返回正常,再 and 1=2 . 返回错误,开始猜表段数. 恩,3位.让其报错,然后注入... 擦,不错出,再加 ...

  4. Sqli labs系列-less-5&6 报错注入法(上)

    在我一系列常规的测试后发现,第五关和第六关,是属于报错注入的关卡,两关的区别是一个是单引号一个是双引号...当然我是看了源码的.... 基于报错注入的方法,我早就忘的差不多了,,,我记的我最后一次基于 ...

  5. DLL注入技术之劫持进程创建注入

    劫持进程创建注入原理是利用Windows系统中CreateProcess()这个API创建一个进程,并将第6个参数设为CREATE_SUSPENDED,进而创建一个挂起状态的进程,利用这个进程状态进行 ...

  6. 老树开新花:DLL劫持漏洞新玩法

    本文原创作者:丝绸之路 <img src="http://image.3001.net/images/20150921/14428044502635.jpg!small" t ...

  7. 36.浅谈DLL劫持

    最近在搞内网,需要实现免杀后门,大佬推荐了dll劫持,DLL劫持后,能干很多事情,比如杀软对某些厂商的软件是实行白名单的,你干些敏感操作都是不拦截,不提示的.还有留后门,提权等等.本文主要介绍如何检测 ...

  8. Dll劫持漏洞详解

      一.dll的定义 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...

  9. 关于dll劫持我的奇思妙想(一)

    0x00  前言 前段时间在研究着windows底层的一些东西,发现这个dll劫持一直没有做过,根据倾旋师傅的视频和文章做了一系列的研究,然后就突发来了兴致研究一些dll劫持提权. 0x01   了解 ...

随机推荐

  1. Sqoop+mysql+Hive+ Ozzie数据仓库案例

    mysql 数据库脚本为: /*==============================================================*/ /* DBMS name: MySQL ...

  2. python判断变量是否为int、字符串、列表、元组、字典等方法

    在实际写程序中,经常要对变量类型进行判断,除了用type(变量)这种方法外,还可以用isinstance方法判断: #!/usr/bin/env pythona = 1b = [1,2,3,4]c = ...

  3. 代码生成器 CodeSmith 的使用(六)

    在上一篇的版本中,我们生成了数据库所有表中的字段,如果要使数据库中的单个表 生成 PetaPoco 构架下的 ORM 映射,使那怎么办.这是这篇博客的主要内容. 首先来看完整的 Camel 规则模板: ...

  4. 关于putty连接百度云linux服务器那些事

    看有活动,30元半年的百度云服务器,就直接买了当练手的玩 买完之后,发现使用putty不能直接连接百度云的centos服务器, 用了putty和ssh都不能连接 试了好几次,都打算尝试用秘钥对的形式了 ...

  5. 图片水平垂直居中(兼容IE6,IE7,firefox,opera,safari,其中图片可以是任何块元素)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. python读取excel,数字都是浮点型,日期格式是数字的解决办法

    excel文件内容: 读取excel: # coding=utf-8 import xlrd import sys reload(sys) sys.setdefaultencoding('utf-8' ...

  7. 高负载均衡学习haproxy之安装与配置

    https://www.cnblogs.com/ilanni/p/4750081.html

  8. CSS镂空图片处理

    来源:http://www.zhangxinxu.com/wordpress/?p=5267,分享收藏 使用镂空图片,通过CSS改变颜色,达到图片切换的效果,可以同过背景图,然后改变背景色,从而达到图 ...

  9. os内置模块

    import os 1.os.getcwd() # 获得当前文件路径 2.os.chdir()   # 改变当前目录 3.os.curdir #  . 表示当前目录 4.os.pardir # 表示上 ...

  10. JAR命令使用

    jar 命令详解 jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe,Linux 下文件名为 jar.它的运行需要用到 JDK 安装目录 ...