DLL另類劫持注入法
// 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另類劫持注入法的更多相关文章
- 注入技术--LSP劫持注入
1.原理 简单来说,LSP就是一个dll程序. 应用程序通过winsock2进行网络通信时,会调用ws2_32.dll的导出函数,如connect,accept等. 而后端通过LSP实现这些函数的底层 ...
- 安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程
简介 大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文 ...
- Sqli labs系列-less-5&6 报错注入法(下)
我先输入 ' 让其出错. 然后知道语句是单引号闭合. 然后直接 and 1=1 测试. 返回正常,再 and 1=2 . 返回错误,开始猜表段数. 恩,3位.让其报错,然后注入... 擦,不错出,再加 ...
- Sqli labs系列-less-5&6 报错注入法(上)
在我一系列常规的测试后发现,第五关和第六关,是属于报错注入的关卡,两关的区别是一个是单引号一个是双引号...当然我是看了源码的.... 基于报错注入的方法,我早就忘的差不多了,,,我记的我最后一次基于 ...
- DLL注入技术之劫持进程创建注入
劫持进程创建注入原理是利用Windows系统中CreateProcess()这个API创建一个进程,并将第6个参数设为CREATE_SUSPENDED,进而创建一个挂起状态的进程,利用这个进程状态进行 ...
- 老树开新花:DLL劫持漏洞新玩法
本文原创作者:丝绸之路 <img src="http://image.3001.net/images/20150921/14428044502635.jpg!small" t ...
- 36.浅谈DLL劫持
最近在搞内网,需要实现免杀后门,大佬推荐了dll劫持,DLL劫持后,能干很多事情,比如杀软对某些厂商的软件是实行白名单的,你干些敏感操作都是不拦截,不提示的.还有留后门,提权等等.本文主要介绍如何检测 ...
- Dll劫持漏洞详解
一.dll的定义 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...
- 关于dll劫持我的奇思妙想(一)
0x00 前言 前段时间在研究着windows底层的一些东西,发现这个dll劫持一直没有做过,根据倾旋师傅的视频和文章做了一系列的研究,然后就突发来了兴致研究一些dll劫持提权. 0x01 了解 ...
随机推荐
- 第14章 UDP编程(3)_利用UDP实现广播功能
3. 广播的介绍 (1)广播 ①广播实现一对多的通信,如QQ群 ②它通过向广播地址发送数据报文实现的 (2)SO_BROADCAST选项 ①SO_BROADCAST选项控制着UDP套接字是否能发送广播 ...
- Apache Kudu as a More Flexible And Reliable Kafka-style Queue
Howdy friends! In this blog post, I show how Kudu, a new random-access datastore, can be made to fun ...
- position属性详解
内容: 1.position属性介绍 2.position属性分类 3.relative相对定位 4.absolute绝对定位 5.relative和absolute联合使用进行定位 6.fixed固 ...
- django中使用Ajax
内容: 1.Ajax原理与基本使用 2.Ajax发送get请求 3.Ajax发送post请求 4.Ajax上传文件 5.Ajax设置csrf_token 6.django序列化 参考:https:// ...
- 隐藏bat脚本运行时弹出的黑窗口,以隐藏进程在后台执行.
1.把这段代码写在前面@echo offif "%1"=="r" goto startif "%1"=="h" goto ...
- Python入门-散点图绘制
Python入门-散点图绘制 废话不说 直接上代码 import matplotlib.pyplot as plt x_values = list(range(1,1001)) y_values = ...
- Virus
c:\windows\syswow64\rundll32.exe C:\Users\Administrator.mt1-PC\AppData\Roaming\FishSearch
- wireshark的过滤
过滤源ip.目的ip.在wireshark的过滤规则框Filter中输入过滤条件.如查找目的地址为192.168.101.8的包,ip.dst==192.168.101.8:查找源地址为ip.src= ...
- win32允许前置窗口
win32允许前置窗口函数 AllowSetForegroundWindow(HWND hWnd) 该函数允许其他窗口调用SetForegroundWindow()(将窗口设为前置窗口),前提是调用A ...
- python 升级到python2.7
查看python的版本 [root@localhost ~] python -V Python 2.4.3 1.先安装GCC yum -y install gcc 如果安装gcc 出错, yum ...