Windows下的进程隐藏
PROCESS_VM_OPERATION | //允许远程VM操作
PROCESS_VM_WRITE, //允许远程VM写
FALSE, dwRemoteProcessId )
由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。
如果进程打不开,以后的操作就别想了。进程打开后,就可以建立远线程了,不过别急,先想想这个远线程的线程函数是什么?我们的目的是注入一个DLL。而且我们知道用LoadLibrary可以加载一个DLL到本进程的地址空间。于是,自然会想到如果可以在目标进程中调用LoadLibrary,不就可以把DLL加载到目标进程的地址空间了吗?对!就是这样。远线程就在这儿用了一次,建立的远线程的线程函数就是LoadLibrary,而参数就是要注入的DLL的文件名。(这里需要自己想一想,注意到了吗,线程函数ThreadProc和LoadLibrary函数非常相似,返回值,参数个数都一样) 还有一个问题,LoadLibrary这个函数的地址在哪儿?也许你会说,这个简单,GetProcAddress就可以得出。于是代码就出来了。
//计算DLL路径名需要的内存空间
int cb = (1 + lstrlenA(pszLibFileName)) * sizeof(char);
//使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
//使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
iReturnCode = WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);
OK,现在目标进程也认识pszLibFileRemote了,但是pfnStartAddr好像不好办,我怎么可能知道LoadLibraryA在目标进程中的地址呢?其实Windows为我们解决了这个问题,LoadLibraryA这个函数是在Kernel32.dll这个核心DLL里的,而这个DLL很特殊,不管对于哪个进程,Windows总是把它加载到相同的地址上去。因此你的进程中LoadLibraryA的地址和目标进程中LoadLibraryA的地址是相同的(其实,这个DLL里的所有函数都是如此)。至此,DLL注入结束了。
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return;
if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){
CloseHandle( hToken );
return;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
CloseHandle( hToken );
}
//
#include "winnt.h"
void EnableDebugPriv();
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
EnableDebugPriv();
// TODO: Place code here.
HANDLE hRemoteProcess;
HANDLE hRemoteThread;
//PWSTR pszLibFileRemote;
//LPCWSTR pszLibFileName;
BOOL iReturnCode;
char *pszLibFileName="C://RemoteDLL.dll";//注意,这个一定要是全路径文件名,除非它在系统目录里
|PROCESS_VM_OPERATION
|PROCESS_VM_WRITE,
FALSE,0x3E0);//0x3E0是进程的id,测试时是explorer的进程id,可以用spy++去查找。
//计算DLL路径名需要的内存空间
int cb = (1 + lstrlenA(pszLibFileName)) * sizeof(char);
//使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote = (char *) VirtualAllocEx(hRemoteProcess, NULL, cb,
MEM_COMMIT, PAGE_READWRITE);
//使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
iReturnCode = WriteProcessMemory(hRemoteProcess,
pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);
//计算LoadLibraryW的入口地址
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")),
"LoadLibraryA");
hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,
pfnStartAddr, pszLibFileRemote, 0, NULL);
return 0;
}
void EnableDebugPriv( void )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return;
if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){
CloseHandle( hToken );
return;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
CloseHandle( hToken );
}
然后编写需要注入的DLL的代码
#include "stdafx.h"
#include "winnt.h"
#include <stdlib.h>
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
char szProcessId[64];
int i=1;
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
_itoa(GetCurrentProcessId(),szProcessId,10);
MessageBox(NULL,szProcessId,"RemoteDLL",MB_OK);
}
default:
return TRUE;
}
}
Windows下的进程隐藏相关推荐
- windows下设置进程CPU相关性/亲合度,解决CPU使用率占用100%的问题
windows下设置进程CPU相关性/亲合度,解决CPU使用率占用100%的问题 参考文章: (1)windows下设置进程CPU相关性/亲合度,解决CPU使用率占用100%的问题 (2)https: ...
- Windows下tomcat进程监控批处理程序
在Windows下tomcat进程监控批处理程序脚本如下: @echo off ::tomcat安装目录 set _tomcatDir=E:\myFiles\apache-tomcat-8.5.31 ...
- windows下结束进程命令
windows下结束进程命令 1.netstat -aon|findstr "端口" 命令"netstat" 查看端口状态 2.tasklist|findstr ...
- 计算机病毒的隐藏方式有ign,浅谈windows下的病毒隐藏技术.doc
浅谈windows下的病毒隐藏技术 浙江工业职业技术学院 毕业论文 (2011届) 浅谈windows下的病毒隐藏技术 学生姓名 学 号 分 院 专 业 信 指导教师 完成日期 2011年5月 19日 ...
- Windows下创建进程简介
正在执行的应用程序称为进程,进程不仅仅是指令和数据,它还有状态.状态是保存在处理器寄存器中的一组值,如当前执行指令的地址.保存在内存中的值,以及唯一定义进程在任一时刻任务的所有其他值.进程与应用程序的 ...
- CRUX下实现进程隐藏(3)
通过一个内核模块拦截文件系统的回调函数来实现进程隐藏. VFS(Virtual File System)是Linux在实际文件系统(如ext3,ext4,vfat等)上抽象出的一个文件系统模型,简单来 ...
- 关闭终端php就退出进程_解决windows下php-cgi进程经常自动关闭
php-cgi在linux中有fpm管理,Apache不是采用cgi这种模式,于是乎就出现了,在windows下,采用nginx时,开启的php-cgi监听非常不稳定,经常奔溃关闭.现在解决了这个问题 ...
- windows下创建进程,CreateProcess()详解及用法
windows下想要创建一个子进程不如linux的fork函数来得方便,通过CreateProcess函数创建一个新的进程,函数的定义如下 [cpp] view plain copy BOOL Cr ...
- CRUX下实现进程隐藏(2)
前面我们介绍了如何修改/proc目录读取函数的方法实现进程隐藏.这篇博文将介绍另一种方法-- 劫持系统调用实现进程隐藏. 其基本原理是:加载一个内核模块(LKM),通过劫持系统调用sys_getden ...
最新文章
- feign调用如何传递token_走进Spring Cloud之五 eureka Feign(服务调用者)
- PHP脚本执行超时的解决办法
- asp2.0缓存概述
- 合成孔径成像算法与实现_声呐二维成像技术
- synchronized 关键字解析
- python 实例变量_Python的类变量和实例变量详解
- 聊聊日常开发中,如何对接WebService协议?
- 【Python】zip函数的使用
- python3 将unicode转中文
- java代码连接redis_java代码连接redis
- 我对Spring的理解
- mysql5.7.12安装问题
- Beta冲刺——星期三
- 【数据仓库】——星型模型和雪花模型
- 126邮箱注册思维导图
- 容易——字符数组——回文判断
- php 文字动画,CSS3绘制2018新年快乐文字动画特效
- 北京大学陈波悖论课程-期末测试-解析
- C语言---移盘子----Hanoi(汉诺)塔问题,显示移动盘子的步骤
- Cocos2d-x 2.0 之 Actions “三板斧” 之三