avatar
文章
92
标签
0
分类
0
首页
时光档案
标签
分类
友链
关于
半枫
首页
时光档案
标签
分类
友链
关于

半枫

在XP下过VMP反调试
发表于2026-04-14
环境准备 在WIN_XP系统虚拟机下操作; 准备TitanHide驱动和插件; 过反调试过程启动TitanHideTitanHide是一个开源的Windows内核模式驱动程序,是一个调试辅助工具,用于绕过目标程序的反调试机制,能针对VMP的大部分反调试检测点。 在ntdll.KiFastSystemCallRet下硬件断点之前对VMP-3.5.1泄露的源码分析,我们知道VMP调用NT API,是自己构建执行加载服务号 + SYSENTER(在32位程序下),直接进入Ring 0执行内核服务。当内核服务执行完毕,需要返回用户模式时,它会精确地返回到KiFastSystemCall函数末尾的ret指令处,这条指令所在的地址标签就是KiFastSystemCallRet。 简单来说,KiFastSystemCallRet是所有系统调用从内核返回到用户空间的“必经之路”和“枢纽站”。对任何一次系统调用,我们都能在它的返回点精准地拦截到。在进入VMP保护的程序部分,在每一次暂停在KiFastSystemCallRet时,追踪记录栈数据和返回值、系统调用号。 ZwopenFile这个VMP...
pe文件结构学习
发表于2026-02-11
PE(Portable Executable)是Windows平台下可执行文件(EXE)、动态链接库(DLL)、驱动(SYS)等的标准格式,核心由DOS头、NT头、节表、节区数据四大部分构成,是Windows加载、执行程序的底层依据。 总体结构图1234567891011121314151617181920+---------------------+| DOS MZ Header | (64字节,固定)+---------------------+| DOS Stub | (可变长度,16位DOS兼容代码)+---------------------+| NT Headers | (PE核心头部,含签名、文件头、可选头)| - PE Signature || - File Header || - Optional Header |+---------------------+| Section Headers | (节表,每个节头40字节,数量由文件头指定)+-----------------...
TitanHide学习总结
发表于2026-02-11
驱动代码基本结构模块名 功能定位_global————全局工具库:封装内核内存分配、随机化、安全拷贝等通用操作,是其他模块的基础依赖。hider————隐藏规则管理:维护进程隐藏条目列表,处理 “隐藏 / 取消隐藏” 指令,联动反调试标记修改。hooklib————挂钩工具库:实现内联Hook(指令替换)的基础逻辑,支持32/64位系统的API挂钩 / 解钩。hooks————核心挂钩实现:挂钩内核调试相关API(如NtQueryInformationProcess),篡改返回结果实现反调试。log————日志模块:将驱动运行信息同时输出到调试器(WinDbg)和磁盘日志文件,用于调试和问题定位。misc————辅助工具:提供 “通过句柄获取PID” 等内核对象操作的辅助函数,依赖未公开内核结构。ntdll————NTDLL解析:加载ntdll.dll到内核内存,提取其导出函数对应的SSDT索引,为挂钩提供基础。pe————PE文件解析:处理PE文件的RVA / 文件偏移转换、导出函数查找,支持内核中解析NTDLL等模...
TitanHide与ScyllaHide的Hook区别
发表于2026-02-04
TitanHide和ScyllaHide的核心Hook区别在于Hook层级、实现原理和作用范围,前者是内核层(R0)的SSDT表修改,后者是用户层(R3)的指令流替换。 ScyllaHide宏定义这些宏是ScyllaHide中批量、标准化实现函数挂钩(Hook) 的核心代码,目的是简化重复的Hook/解钩代码编写,统一错误处理和资源管理逻辑。 STR(x) 1#define STR(x) #x 这是一个字符串化宏,它会把输入的参数x直接转换成C风格的字符串常量。例如:STR(NtOpenProcess)会被预处理器替换为"NtOpenProcess"在后面的钩子宏里,用来把函数名转为字符串,传递给Detours函数。 HOOK(name) 1234#define HOOK(name) { \ hdd->d##name = (t_##name)DetourCreateRemote(hProcess, "" STR(name) "", (void*)_##name, Hooked##name, tr...
VS2017+WDK7.1驱动开发TitanHide
发表于2026-02-02
开发适用于Windows xp和Windows 7的TitanHide驱动。 环境准备因为要适配Windows xp和Windows 7,所以选择WDK7.1。下载地址:https://learn.microsoft.com/zh-cn/windows-hardware/drivers/legacy-wdk-downloads找到下载好的.ISO文件,解压,到解压好的文件夹中,找到安装文件KitSetup.exe,根据指引安装好(路径检验选择默认路径,后续配置安装默认路径)。安装好就可以在C盘的根目录看到WinDDK文件夹, 项目配置将从Github上获取的TitanHide源码中TitanHide目录下的.cpp、.h文件复制好一份,重新配一个工程。 根据以下要求配置项目属性: 1234567891011121314151617181920212223242526272829303132333435363738//编译出win xp 32位驱动VS2017里新建一个空项目,新建一个配置名:TitanHide_xp //自行定义名字VS++目录-》可执行文件目录:C:\WinD...
vmp反调试与反虚拟机学习
发表于2026-01-28
小白对这几天VMP的反调试与反虚拟机学习结合vmpprotect-3.5.1的源码总结一下。 反调试定位VMP反调试源码当VMP检测到被调试时,会弹窗报错信息通过这条报错信息,我们可以找到然后通过VMP的消息传递逻辑,我们可以发现mtDebuggerFound和函数LoaderMessage(),mtDebuggerFound是VMP反调试检测的唯一语义化标识,LoaderMessage()是VMP所有报错的统一处理入口,LoaderMessage(mtDebuggerFound)是VMP所有反调试检测逻辑的统一报错触发语句。所以我们可以通过查找LoaderMessage(mtDebuggerFound)的引用去定位到VMP的各处反调试相关源码。 os_build_number的获取一共有两种获取方式: PEB直接读取(最快、最底层):绕过所有系统API,直接从进程环境块(PEB)读取OSBuildNumber; ntdll资源解析(兜底、最可靠):直接解析系统核心模块ntdll.dll的PE资源,也是为了方便取syscall所使用的系统调用号。从PEB->OS...
环境变量处理API-GetEnvironmentVariable
发表于2026-01-17
基本概念GetEnvironmentVariable属于Windows.h头文件,专门用于读取指定名称的环境变量值,可以替代ExpandEnvironmentStrings中 “被动解析环境变量” 的方式,主动获取单个环境变量的具体值,灵活性更高。 基本语法1234567891011DWORD GetEnvironmentVariableW( [in, optional] LPCWSTR lpName,// 要读取的环境变量名 [out, optional] LPWSTR lpBuffer,// 接收变量值的目标缓冲区 [in] DWORD nSize // 目标缓冲区的大小(字节数));DWORD GetEnvironmentVariableA( [in, optional] LPCSTR lpName, [out, optional] LPSTR lpBuffer, [in] DWORD nSize); 返回值成功:返回复制到缓冲区的字符数(ANSI是字节数,Unicode是wchar_t字符数),不包含...
目录处理函数-GetWindowsDirectory、PathCanonicalize与PathIsRelative
发表于2026-01-17
GetWindowsDirectory基本概述GetWindowsDirectory是Windows提供的系统目录获取函数,属于Windows.h头文件,主要用于定位Windows系统安装目录(存放系统核心文件的目录)。随着系统升级,微软也提供了更通用的GetSystemDirectory(获取 System32 目录)和SHGetFolderPath(获取各类系统 / 用户目录),但GetWindowsDirectory仍被广泛兼容使用。 基本语法1234567891011// Unicode(宽字符)版本UINT GetWindowsDirectoryW( [out] LPWSTR lpBuffer,// 接收路径的目标缓冲区 [in] UINT uSize // 目标缓冲区的大小(字符数));// ANSI 版本UINT GetWindowsDirectoryA( [out] LPSTR lpBuffer, [in] UINT uSize// 目标缓冲区的大小(字节数)); 返回值成功:返回复制到缓冲区的字符数(ANSI是字节数,Unicode是wc...
字符串处理API-StringCchCopy、ExpandEnvironmentStrings与StringCchPrintf
发表于2026-01-16
StringCchCopy基本概述StringCchCopy是Windows提供的字符串安全拷贝函数,属于StrSafe.h头文件下的StrSafe库,目的是替代传统的strcpy等字符串拷贝函数(避免缓冲区溢出),它会严格检查目标缓冲区的大小,确保拷贝操作不会越界,提升代码安全性。 基本语法12345STRSAFEAPI StringCchCopyA( [out] STRSAFE_LPSTR pszDest,// 目标字符串缓冲区 [in] size_t cchDest,// 目标缓冲区的大小(以字符数为单位,包含终止符 '\0') [in] STRSAFE_LPCSTR pszSrc // 源字符串); 返回值HRESULT类型,常见返回值:S_OK:拷贝成功,且目标字符串以\0终止。STRSAFE_E_INSUFFICIENT_BUFFER:目标缓冲区空间不足,拷贝失败(此时目标缓冲区会被置为空字符串)。 数据类型STRSAFE_LPSTR: 1typedef _Null_terminated_ char* STRSAFE_L...
目录(Catalog)验证API-CryptCATAdminCalcHashFromFileHandle、CryptCATAdminEnumCatalogFromHash、CryptCATCatalogInfoFromContext、CryptCATAdminAcquireContext
发表于2026-01-15
CryptCATAdminAcquireContext基本概念CryptCATAdminAcquireContext是Windows 目录(Catalog)验证体系的 “入口函数” —— 所有目录相关操作(计算文件哈希、查找目录条目、提取.cat 文件路径)都必须先通过这个函数获取目录管理上下文句柄(HCATADMIN),它的作用类似于打开一个 “目录操作的会话”。 基本语法12345BOOL CryptCATAdminAcquireContext( [out] HCATADMIN *phCatAdmin,//上下文句柄(调用前设为NULL) [in] const GUID *pgSubsystem,//子系统GUID(几乎所有场景传NULL) [in] DWORD dwFlags //标志位(固定传0)); 返回值TRUE-成功FALSE-失败 ERROR_OUTOFMEMORY:内存不足 ERROR_INVALID_PARAMETER:参数未初始化(如phCatAdmin没设NULL) ERROR_ACCESS_DENIED:权限不足(需...
12…10
avatar
半枫
Welcome to my blog
文章
92
标签
0
分类
0
Follow Me
公告
This is my Blog
最新文章
在XP下过VMP反调试2026-04-14
pe文件结构学习2026-02-11
TitanHide学习总结2026-02-11
TitanHide与ScyllaHide的Hook区别2026-02-04
VS2017+WDK7.1驱动开发TitanHide2026-02-02
归档
  • 四月 2026 1
  • 二月 2026 4
  • 一月 2026 9
  • 十二月 2025 3
  • 十一月 2025 10
  • 十月 2025 10
  • 九月 2025 4
  • 八月 2025 36
网站信息
文章数目 :
92
本站访客数 :
本站总浏览量 :
最后更新时间 :
© 2025 - 2026 By 半枫框架 Hexo 7.3.0|主题 Butterfly 5.4.3