自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

LYSM

[LYing SiMon] tells the lies that he [Loves You So Much]

  • 博客(30)
  • 收藏
  • 关注

转载 ini配置文件的读写

背景在安装一些应用程序的时候,我们经常可以其安装目录下看到有 .ini 格式的配置文件,这种格式配置文件是我们比较常见的。在我们自己电脑的系统上也会有,而且还很多。很多系统自带的程序,都会有一个 .ini 格式的配置文件。为此,Windows还特地提供了相应的WIN32 API函数去对 .ini 格式的配置文件进行读写操作。函数介绍// 将一个字符串复制到INI文件的指定的字段中// 如果函数成功将字符串复制到初始化文件,则返回值不为零。BOOL WINAPI WritePrivateProfi

2020-06-30 23:51:32 985

转载 程序自删除

原理之所以可以使用批处理来实现文件自删除,是因为批处理有一个特别的地方就是:批处理提供了自己删除自己的命令:del %0这个命令,批处理执行完后,就会把自身文件删除了,而且不放进回收站。所以,有了这个关键技术作为前提,使用批处理方式实现程序的自删除,就好理解了。构造自删除批处理文件,批处理文件的内容就是先延迟一定的时间,例如延迟 5 秒,然后开始删除指定文件后,再执行自删除命令在程序中,创建一个新进程调用并批处理。进程创建成功后,立马结束进程这样,进程创建起来,执行批处理文件。等批处理文件

2020-06-30 23:28:40 798

原创 程序开机启动

请转到以下链接食用???????? :创建计划任务实现开机自启动???? :创建系统服务实现开机自启动???? :快速启动目录实现开机自启动

2020-06-30 23:15:48 654

转载 使用WNetEnumResource函数实现枚举工作组内的主机及其IP

背景之所以会学习到这方面的知识,是因为那段时间正在帮一个游戏工作室开发一个游戏自动登录并创建角色的游戏脚本。当时,我就是使用VS去开发。因为它要求要有一个控制端,所以,就分别写了一个客户端程序和控制端程序。客户端都运行在虚拟机内,和控制端在同一网段里。当时,我就想让客户端在虚拟机里运行,主动去扫描工作组内的主机,那么它工作组内就会有两个主机,一个是虚拟机自己,另一个就是外面的主机。主机上运行则控制端,所以,这样就可以获取主机的IP地址,并自动建立反向连接,传输数据。函数介绍// 启动网络资源或现有连

2020-06-30 23:10:51 686

转载 使用 ReadDirecotryChangesW 函数实现文件监控

背景在我没有了解 ReadDirecotryChangesW 这个目录监控函数之前,一直认为要想实现计算机上的文件监控,能够监控计算机上每个文件的改动,是一件极其困难的事情,曾经自己也细想过,但都没有什么好的思绪。不过,事实上,文件监控的确是一件比较复杂的事情。好在Windows为我们提供了一个功能强大,但是使用较为方便的函数接口,这边是我们这篇文章要讲解的 ReadDirecotryChangesW 函数。函数介绍// 检索描述指定目录中更改的信息,但不会报告对指定目录本身的更改。// 如果函数成

2020-06-30 22:45:41 1513

转载 Bypass UAC 提权

背景UAC(User Account Control)是微软在 Windows Vista 以后版本引入的一种安全机制,通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。UAC 可以阻止未经授权的应用程序自动进行安装,并防止无意中更改系统设置。UAC需要授权的动作包括:配置Windows Update;增加或删除用户账户;改变用户的账户类型;改变UAC设置;安装ActiveX;安装或移除程序;安装设备驱动程序;设置家长控制;将文件移动或复制到

2020-06-30 22:24:08 3839 1

原创 内联汇编

什么是内联汇编内联汇编是指在 C/C++ 代码中嵌入的汇编代码,与全部是汇编的汇编源文件不同,它们被嵌入到 C/C++ 的大环境中。内联汇编方式两个作用,一是程序的某些关键代码直接用汇编语言编写,可提高代码的执行效率;二是有些操作无法通过高级语言实现,或者实现起来很困难,必须借助汇编语言达到目的。x86 内联汇编使用内联汇编要用到 __asm 关键字,它可以出现在任何允许 C/C++ 语句出现的地方。对 __asm 关键字的使用有两种方式:// 1.__asm { // 汇编代码 }

2020-06-30 22:07:57 5273 1

转载 C++ AdjustTokenPrivileges 提升访问令牌权限

背景在我们编程实现一些系统操作的时候,往往要求我们执行操作的进程拥有足够的权限方可成功操作。比如,我们使用 ExitWindows 函数实现关机或重启操作的时候,就要求我们的进程要有 SE_SHUTDOWN_NAME 的权限,否则,会忽视不执行操作。这时,我们唯一能够做的,就是按照要求,提升我们进程的权限。函数介绍/* 打开与进程关联的访问令牌。 如果函数成功,则返回值不为零。*/ BOOL WINAPI OpenProcessToken( _In_ HANDLE

2020-06-30 18:45:47 3067

转载 利用 API 实现数据压缩和解压缩

背景对于Windows上的数据压缩和解压缩的实现,最方便的就是直接调用Win32 API函数。Widnows系统的ntdll.dll专门提供了RtlCompressBuffer函数和RtlDecompressBuffer函数来负责对数据压缩和解压缩操作,这两个函数并未公开,需要通过在ntdll.dll中动态调用。函数介绍RtlGetCompressionWorkSpaceSize// 确定缓冲区大小// 返回STATUS_SUCCESS,则表示成功;否则,失败 NTSTATUS RtlGe

2020-06-30 14:01:55 2188

转载 Dll 注入 —— APC

背景APC,即异步过程调用(Asynchronous Procedure Call)是函数(过程)在特定线程中被异步执行。在Microsoft Windows操作系统中,APC是一种并发机制,用于异步IO或者定时器。每一个线程都有自己的APC队列,可以使用QueueUserAPC函数把一个APC函数压入APC队列中。当用户模式的APC压入线程APC队列后,该线程并不直接调用APC函数,除非该线程是处于可通知状态,调用的顺序为先入先出(FIFO)。函数介绍QueueUserAPC// 如果函数成功,

2020-06-28 11:53:26 704

转载 C++ 强制让目标进程执行自己的 ShellCode

函数介绍GetThreadContext// 如果函数成功,则返回值不为零。 BOOL WINAPI GetThreadContext( _In_ HANDLE hThread, // 要检索其上下文的线程的句柄。 _Inout_ LPCONTEXT lpContext // 指向 CONTEXT 结构的指针。 );SetThreadContext// 如果设置了上下文,则返回值为非零。 BOOL WINAPI SetT

2020-06-28 09:23:19 1235

转载 C++ 修改指定进程 PEB 中路径和命令行信息实现进程伪装

背景所谓的进程伪装,指的修改任意一个指定进程的信息,是它的信息在系统中的显示是另一个进程的信息,这样看来,指定的进程就像是被伪装的进程一样,因为进程信息相同,但实际上,它还是原来的进程,做着原来的进程操作。函数介绍NtQueryInformationProcess NTSTATUS WINAPI NtQueryInformationProcess( _In_ HANDLE ProcessHandle, // 要获取信息的进程的句柄。

2020-06-24 16:34:52 2713 2

转载 驱动使用 MDL 方式读写内存

背景通常,我们在内核中修改内存的时候,都是通过修改 CR0 寄存器,关闭内存写保护属性,然后再写入内存的方式来修改内存。我个人不喜欢这种方式,因为总感觉我们使用没有线程接口函数的方法,总感觉不太稳定,而且,在 64 位程序下,CR0 方式不再适用了。所以,我强烈推荐在内核下使用 MDL 方式来修改内存,在 32 位内核和 64 位内核下同样有效。实现过程内存描述符列表 (MDL) 是一个系统定义的结构,通过一系列物理地址描述缓冲区。MDL的全称是 Memory Descriptor List,即内存

2020-06-24 16:18:16 6796

转载 c++ 在内存中加载 exe/dll (不使用CreateProcess、LoadLibrary 等 API)

背景在网上搜索了很多病毒木马的分析报告,看了一段时间后,发现还是有很多病毒木马都能够模拟PE加载器,把DLL或者是EXE等PE文件,直接从内存中直接加载到自己的内存中执行,不需要通过API函数去操作,以此躲过一些杀软的检测。程序实现原理首先,在EXE文件中,根据PE结构格式获取其加载映像的大小SizeOfImage,并根据SizeOfImage在自己的程序中申请一块可读、可写、可执行的内存,那么这块内存的首地址就是EXE程序的加载基址然后,根据EXE中的PE结构格式获取其映像对齐大小Section

2020-06-24 15:39:46 5160 9

转载 基于AheadLib工具进行DLL劫持

背景或许你听过DLL劫持技术,获取你还没有尝试过DLL劫持技术。DLL劫持技术的原理是:由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形

2020-06-24 14:39:14 3052

转载 驱动程序使用 EVENT 主动和应用程序通信

背景用户层程序使用 DeviceIoControl 将 IOCTL 控制码、输入缓冲区、输出缓冲区传入到内核;内核响应 IRP_MJ_DEVICE_CONTRL 消息,并从 IRP 中获取传入的 IOCTL 控制码、输入缓冲区、输出缓冲区,以此实现数据的交互。但是,当内核层想主动传递数据到用户层,用户层又怎样才能知道呢?因为只有用户层知道内核层有数据输出的时候,它才会调用 DeviceIoControl 函数去获取数据。所以,本文要介绍的就是基于事件 EVENT 实现的同步框架,可以解决这个的问题。函

2020-06-24 14:20:47 2160

原创 创建系统回调实现行为监控

请转到以下链接食用 ???????? :基于ExRegisterCallback实现监控系统时间的修改???? :基于ObRegisterCallbacks实现的线程和进程监控及其保护???? :基于CmRegisterCallback实现监控监控注册表并拒绝注册表操作???? :基于PsSetLoadImageNotifyRoutine实现监控模块加载并卸载已加载模块???? :基于PsSetCreateProcessNotifyRoutineEx实现监控进程创建并阻止创建...

2020-06-24 11:43:34 502

转载 基于进程 EPROCESS - ActiveProcessLists 枚举进程,并通过摘链隐藏进程

实现原理进程 EPROCESS 结构存储着进程一切信息,所以这个结构体很庞大,而且,不同系统, EPROCESS 结构定义也不相同,它里面的一些成员的偏移也不是固定一成不变的。可使用函数 PsGetCurrentProcess 获取当前进程结构 EPROCESS; PsGetProcessId 从 EPROCESS 结构中获取进程的 PID 信息;使用 PsGetProcessImageFileName 函数,从 ERPROCESS 结构中获取进程的名称信息。其中,EPROCESS 结构中的成员 Ac

2020-06-24 11:12:17 778

转载 使用 PspTerminateThreadByPointer 强制结束进程

实现过程我们知道,线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。也就是说,当一个进程中的所有线程都被结束的时候,这个进程也就没有了存在的意义,也随之结束了。这,便是我们本文介绍的这种强制杀进程的实现原理,即把进程中的线程都杀掉,从而让进程消亡,实现间接杀进程的效果。Windows

2020-06-24 10:58:41 1910 1

原创 HOOK SSDT,获取 SSDT 函数地址

背景我们要开始向大家演示 SSDT HOOK 的使用方式,帮助我们的程序实现隐藏或是监控等工作。我们之前也一直提到过,在 32 位系统上,要想实现隐藏或是监控的操作,大多数操作就是对 SSDT 函数各种 HOOK,可以是 SSDT HOOK,也可以是 Inline HOOK。但,这些通过对 SSDT 表内存修改而实现的操作,在 64 位系统上不再适用,因为 64 位系统的 Patch Guard 保护机制,把 SSDT 的内存作为重点保护对象,只要对 SSDT 的内存进行修改,都会触发 Patch Gua

2020-06-24 09:17:10 555

转载 通过暴力搜索PID遍历进程并获取进程信息

背景通常我们在内核中使用 ZwQuerySystemInformation 函数来遍历进程模块并获取进程信息,这种是通过正常的进程遍历方式,所以,有很多 Rootkit 程序会 HOOK 这个 ZwQuerySystemInformation 函数,过滤指定进程,从而实现进程的隐藏。本文实现的进程遍历和获取进程信息并不打算使用 ZwQuerySystemInformation 这种方式,而是直接暴力搜索进程的 PID,根据有效的 PID 获取相应进程的信息,从而实现进程的遍历。现在,我就来讲解具体的实现

2020-06-23 18:36:09 3000 1

原创 枚举系统中的各种回调

请转到以下链接食用 ???????? :进程/线程对象回调????:注册表回调????:模块加载回调????:进程创建回调???? :线程创建回调

2020-06-23 18:22:59 660

转载 ring0解锁文件

背景当我们要删除一个文件的的时候,有时候会出现“文件被占用”或是“无法删除”的提示框,这往往是由于该文件句柄已经在其它进程中打开未关闭的缘故。本文要介绍的是关闭在其它进程中的文件句柄,对文件进行解锁。现在,我把实现过程和原理,整理成文档,分享给大家。实现原理要实现对指定文件进行解锁,我们首先要做的就是获取这个文件所有被打开的文件句柄,然后在关闭这些句柄即可。那么接下来,我就对指定文件句柄的遍历以及结束文件句柄的实现原理分别进行解析。遍历指定文件句柄首先,我们使用 16 号功能调用 ZwQuery

2020-06-23 18:05:19 530

转载 ring0层下实现的文件强制删除

文件强删在日常生活使用电脑的过程中,遇到删不掉的文件的时候,我们总会通过一些软件提供的强制删除文件功能来删除顽固的文件。文件强删技术对于杀软来说是清楚病毒木马的武器,在扫描器检测出恶意文件的时候,就需要强删功能来清除恶意文件。而对于病毒木马来说,反过来可以用强删技术来强制删除系统保护文件或是受杀软保护的文件。本文将会介绍文件强删技术,即使文件正在运行,也能强制删除本地文件。实现过程当文件是PE文件而且已经被加载到内存中的时候,正常情况下是无法通过资源管理器explorer.exe来删除本地文件的,因

2020-06-23 17:59:17 1355 1

原创 x64驱动 使用 InfinityHook

准备首先,下载 InfinityHook 项目:git clone https://github.com/everdox/InfinityHook打开 sln ,编译一下:得到我们需要的 lib 文件(以 x64 为例):再找到 这个 .h 头文件,需要的就这么多 ????新建项目新建一个驱动项目,将刚才的 .lib 和 .h 文件拷贝到工程目录中:项目中添加现有项:注意,这里的 lib 文件必须添加到工程目录中,如果只单纯的设置附加依赖项和附加库目录,会报 “无法解析的外部符号

2020-06-18 14:35:12 4922 5

原创 高级语言对应的汇编指令

已 c++ 为例 ???? ---------- ????定义变量也就是说单纯的定义一个变量,不给它初始化,系统认为这个变量是没有意义的,就决定不会为它分配内存空间所以自然也不会有对应的汇编代码。或者可以理解为编译器暂时把你定义的变量记录下来但没有通知系统去做一些别的事情。但是当定义一些被 c++ 封装后的结构类型时,就不一样了:没错,string 也是! ????变量初始化先来看 bool 类型的初始化:将 false 对应的值存入变量 b 的地址中,没毛病 ????,如果把 fals

2020-06-14 00:03:19 3688

原创 [反调试 r0] ValidAccessMask 清零

介绍ValidAccessMask 是调试权限标志,正常的情况下 ValidAccessMask 的值是 0x1FF000F , 如果 ValidAccessMask 被修改为 0,则系统内的所有调试器都会失效。手动找 ValidAccessMask打开 WinDbg , 输入 u NtCreateDebugObject , 这个函数中调用了 DbgkDebugObjectType :输入 dp fffff8060ffeb100` 拿到地址中的值:这是一个 _OBJECT_TYPE 结构体

2020-06-11 21:57:55 1214

原创 x64驱动 遍历 PspCidTable 枚举隐进程和线程

介绍PspCidTable 是一个内核句柄表,存放进程和线程的内核对象(EPROCESS 和 ETHREAD),并通过 PID 和 TID 进行索引(所以进程ID和线程ID不可能相同),ID 号以 4 递增。获取 PspCidTable 地址win7:PsLookupProcessByProcessId(被导出) -> PspCidTablewin10:PsLookupProcessByProcessId(被导出) -> PspReferenceCidTableEntry -&g

2020-06-05 17:26:11 2899 3

原创 C++ 提权

BOOL EnableDebugPrivilege() { HANDLE hToken; BOOL fOk = FALSE; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) { TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; LookupPrivilegeValue(NULL, SE_

2020-06-03 16:23:46 1771

原创 驱动 获取系统版本

// 判断操作系统版本RTL_OSVERSIONINFOEXW OSVersion = { 0 };OSVersion.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);RtlGetVersion((PRTL_OSVERSIONINFOW)&OSVersion);// OSVersion.dwMajorVersion (主版本) , OSVersion.dwMinorVersion (次版本)...

2020-06-01 17:06:05 891

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除