【RootKit】Chaos-Rootkit解读-1 进程隐藏
去年学了点kernel开发,实战太少了,看看别人的代码怎么写的 项目地址:https://github.com/ZeroMemoryEx/Chaos-Rootkit 进程隐藏 测试环境: 连接到rookit 使用效果: 原理剖析 在Driver.c/processIoctlRequest中处理这个功能的ioctl NTSTATUS processIoctlRequest( DEVICE_OBJECT* DeviceObject, IRP* Irp){ PIO_STACK_LOCATION pstack = IoGetCurrentIrpStackLocation(Irp); int pstatus = 0; int inputInt = 0; __try { // if system offsets not supported / disable features // that require the use of offsets to avoid crash ...
【Win Pwn】Windows10 内核池溢出
内核也太难了,主要讲述大NonPagedPool的溢出利用 公众号:https://mp.weixin.qq.com/s/XjaPdNwqABFqDZsZTDtZJg 或许我们的公众号会有更多你感兴趣的内容 【复现】Windows10 内核池溢出 前置知识: windows内核调试 windows内核提权基础 简单的windows驱动编写(hello world级别) linux pwn堆溢出利用方式 一点点数据结构的知识(双向链表) 文章讲述并复现在Windows高版本内核中NonPagedPoolNx溢出的利用方法 目录 [toc] 利用方式 很多资料都是直接翻译外文文献,翻译质量差,没有直接的实操,并且随着windows的更新,比较缺乏现代windows 10\11的、比较易学的攻击方式。这里使用:Windows-Non-Paged-Pool-Overflow-Exploitation[1]作为基础的讲解,原文中的图示个人感觉还是讲的不够透彻,这里个人借着原文重新讲述下。 命名管道介绍 这是windows提供的用于进程间通讯的一种机制。首先是**服务...
【AI】本地部署DeepSeek并使用MCP
主要是一些配置,同时算是备忘手册 本地部署DeepSeek 首先是部署DeepSeek R3 我是使用的是LM Studio,下载链接:https://lmstudio.ai/ 下载完成后需要按照如下逻辑结构创建文件夹: 然后下载DeepSeek的模型,国内可以通过魔塔社区等下载,会快很多。 我的显卡是GTX1650 MaxQ,显存只有4G。使用:DeepSeek-R1-Distill-Qwen-7B-GGUF AI相关最重要的就是显卡的显存,关于显卡参数可以在 任务管理器 -> 性能 中看到,如果只有一个intel的集显,那么得下载对应的显卡驱动。 deepseek 1.5b:几乎没有显卡要求 deepseek 7b: 至少4G显存 deepseek 8b: 至少6G显存 deepseek 14b: 12G显存 deepseek 32b:至少24G显存 如果配置正确就可以在LM Studio中看到了 一般配置如下 建议开启 闪电注意力(Fast attention),同时如果需要使用MCP建议将上下文长度改为至少 8192 等待模型加载后即可使用。 使用...
【免杀】使用CobaltStrike的外置监听器绕过检测
可能是最简单一种免杀方式了 公众号:https://mp.weixin.qq.com/s/9ReEchLx1dTbWR9plRWbpg 或许我们的公众号会有更多你感兴趣的内容 【免杀】使用CobaltStrike的外置监听器绕过检测 背景 起源于一次免杀马的制作,当我制作好了过后,在windows defender(后文简称为wd)中测试时 [x] 本地扫描能够通过 [x] CobaltStrike TeamServer能显示木马的正常上线 [ ] 上线后本地木马立即被查杀 结论 这里直接上结论,想要知道原因可以看下文 首先给出猜测:是windows defender有类似的waf,并且由于cobaltstrike的stager payload的加载方式被wd识别出 给出解决办法:想办法加密/混淆Teamserver和Tojan的流量,类似于下图 在CS上有一种监听器叫做:External C2 只需要绑定本地的端口即可 同时我们需要编写一个 转发器、收发的torjan 转发器编写 为了方便,这里就使用Tcp socket进行编写 首先需要一个转发的类 imp...
【免杀】反射式DLL注入详解
公众号:https://mp.weixin.qq.com/s/M92n3e-yCG64ry9GLt5A3A 或许我们的公众号会有更多你感兴趣的内容 【免杀】反射式DLL注入详解 在前文:PE文件格式解析、常见的DLL和Shellcode注入方式中已经讲解了基本的注入方式和PE文件结构。那么我们可以提出这样指一种注入方式:将dll的内容放到目标进程中,然后找到这个dll完成PE映射到内存的函数(假设为void loader()),这也要求loader函数一定要在导出表上。 获得dllloader函数在内存中的虚拟地址 注入器将dll写入目标进程然后调用loader loader运行 注入器编写 打开dll文件 std::string path; DWORD pid; std::cout << "[+] pid: "; scanf_s("%d", &pid);std::cin.ignore(); std::cout << "[+] DLL Path: ";...
【免杀】PE文件格式解析
公众号:https://mp.weixin.qq.com/s/RrEZJDeKXdVqtjZPDs7AyQ 或许我们的公众号会有更多你感兴趣的内容 PE文件格式解析 假如说我们要自己写一个exe文件的加载器,或者你曾好奇过反汇编软件的原理,这就需要对exe对应的PE(Portable Executable)文件格式加以理解。这里以windows10中自带的notepad.exe进行讲解。 这里:https://learn.microsoft.com/zh-cn/windows/win32/debug/pe-format 是微软官方对PE格式的官方文档,读者可自行了解。 如何确定是一个PE文件-DOS头 对于一个PE文件,首先是他的文件头,也叫DOS 头,结构体定义如下 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number //.... LONG e_lfanew; ...
【破解】使用hook再游戏内部创建菜单栏
学习是对技术的祛魅 公众号: 或许我们的公众号会有更多你感兴趣的内容 Direct3D11 注入 在此之前,公众号已经简述了MinHook的原理,那么利用这种原理我们就可以通过hook在d3d编写的游戏中实现窗口 相关代码:https://github.com/Joe1sn/dx11-hook-example Direct3D简述 这里使用ImGui的默认dx11版本示例来讲解,首先d3d的绘制依靠的是windows的窗口(window),接着是D3D设备、上下文和交换链以及各种绘制方法的d3dAPI传入操作系统和GPU,最后传输到显示器显示,大致如下 那么对于d3d API来说是这样的: 如何显示 那么最后如何得到渲染好的最终帧呢?答案是交换链的 IDXGISwapChain::Present 方法用于呈现最终渲染的帧 https://learn.microsoft.com/zh-cn/windows/win32/api/dxgi/nn-dxgi-idxgiswapchain 具体参数 https://learn.microsoft.com/zh-cn/wind...
【免杀】常见的DLL和Shellcode注入方式
公众号:https://mp.weixin.qq.com/s/qYO0Cf5MRT4vKCT5WYz1KQ 或许我们的公众号会有更多你感兴趣的内容 【免杀】常见的DLL和Shellcode注入方式 这里的dll和shellcode注入指的是动态的注入,及进程运行时的注入 关于代码可以从github仓库找到:https://github.com/Joe1sn/S-inject A. DLL注入 首先回顾一下一个程序是如何加载dll的,使用的是kernel32.dll的LoadLibraryA函数 HMODULE LoadLibraryA( [in] LPCSTR lpLibFileName); lpLibFileName就是dll文件的路径 由于本篇只是简单的、常见的方法,没有涉及如天堂之门(Heaven’s Gate)等高级技术,需要暂时认为 64位dll只能使用64位注入器注入64位程序,32位也是如此 远程线程调用注入 这里用到的是函数createRemoteThread 函数,主要作用就是再其他进程创建一个新的线程 HANDLE CreateRemoteTh...
【源码分析】MinHook源代码分析
世界上果然没有魔法,到最后发现都是魔术 解读的项目地址:https://github.com/TsudaKageyu/minhook 公众号:https://mp.weixin.qq.com/s/Po_t-JGj0e3dMBKDd9i8cw 或许我们的公众号会有更多你感兴趣的内容 P1. Hook原理 首先使用Visual Studio中的MSVC编译器,按照Release x64 禁用代码优化 编译如下代码 #include <Windows.h>#include <iostream>void hello() { std::cout << "123\n";}int main() { hello(); return 0;} 我们在main函数中的hello()处加上断点(ps:为什么选择了release版本任然能够调试:1.没有antiDebug。2.调式符号依然保存了。3.代码量小,就算开了代码优化也不会有较大影响) 步入call汇编 这里就是目前编译情况下的hello函数...
【破解】CS2人物实体逆向
如何结合Cheat Engine和逆向工程找到CS2内存中的人物地址 或许我们的公众号会有更多你感兴趣的内容 这篇文章发布的时候,关于更多CS2-cheats的代码已经在Github仓库中发布,你可以在下面的链接找到更多CS2的外挂功能 https://github.com/Joe1sn/ExtCheats 游戏环境 Steam上启动的CS2国际服,在设置中加上-insecure参数 在游戏中启用控制台,然后 ` 就可以输入命令了 CS2可以使用CFG文件进行快速的加载,这里我用了一段cfg脚本来进行编写 sv_cheats 1mp_roundtime 60mp_roundtime_defuse 60mp_warmup_endmp_freezetime 0mp_maxrounds 30mp_buytime 99999bot_stop 1bot_dont_shoot 1mp_respawn_on_death_t 1mp_respawn_on_death_ct 1mp_restartgame 1 你可以在steam\steamapps\common\Counter-Stri...
【破解】一次无害的Coploit激活工具破解
难度:⭐ - 要不要后面把怎么写外挂啥的放上来?还是说开一个知识星球?- 难度一星,一颗给go,一颗给密码学,减一颗给简单的认证过程 静态分析 首先是来源 下载Windows版看看 哦?golang打包的,看看版本 > go version .\authTool.exe.\authTool.exe: go1.21.0 有点难搞啊,有无Go是无符号的,IDA打开看也是一坨 粗略动态 这个阶段就是看网络活动,文件操作等等,先打开WireShark和Procmon64 然后打开软件跑一下 这个时候ProcessMonitor已经有了,凭经验来说这里只有网络连接有点价值 两个IP:43.x.x.x(记为ipA)和149.x.x.x(记为ipB),按照先后顺序看 在wireshark中ip.addr == 43.x.x.x 在wireshark中ip.addr == 149.x.x.x 两段都是密文,一眼base64,而且解码完成过后也是乱码,接下来回到你想本身 动静结合 根据运行时候的字符串,用golang写过网络请求的小伙伴都知道,网络请求部分是在net库...
windows内核驱动 8-计时器与通知
在内核中使用定时器、通知和回调 …学到一半打靶场去了 定时器 CPU最短能统计时间为100纳秒 100ns 内核中使用LARGEINT来表示时间长度 1s = -10 *1000 * 1000 基于设备的IO定时器 在DriverEntry里面尝试一下 VOID TimeWorker(PVOID CONTEXT) { DbgPrint("Irql: %d\n", KeGetCurrentIrql()); DbgPrint("Process: %s\n", PsGetProcessImageFileName(PsGetCurrentProcess()));}NTSTATUSDriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath){// ... IoInitializeTimer(pDevice, TimeWorker, NULL); IoStartTimer(pDevice);}Un...
windows内核驱动 7-进程同步
日常复习操作系统 同步方式 自旋锁,之前讲过了 信号量 互斥体 事件同步 事件同步 基于事件的同步,理解原理比写代码更重要 感觉上和R3的使用差不多 KeInitializeEvent(&kEvent, NotificationEvent, FALSE); NotificationEvent:通知事件,手动处理,一般只用一次 SynchronizationEvent:同步事件,KeWaitForSingleObject等待通过,及不需要KeResetEvent,系统自动设置为未激发态 如果在R3使用Event传递Handle到R0,由于HANDLE不是全局,所以得ObReferenceObj VOID KThreadB(PVOID context) { LARGE_INTEGER sleeptime = { 0 }; PKEVENT pevent = (PKEVENT)context; sleeptime.QuadPart = -100 * 10 * 1000 * 3; while (1) ...
windows内核驱动 6-链表与进程
感觉和之前学的bh文章有大量重复 记录进程 typedef struct _Process { LIST_ENTRY list; HANDLE pid; PEPROCESS pEprocessObj; char ProcessName[0x10];} MyProcess, *pMyProcess; 两个extern需要声明 NTKERNELAPI PUCHAR PsGetProcessImageFileName(PEPROCESS Process);NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS* Process);VOID ProcessNotify(HANDLE pid, HANDLE pid2, BOOLEAN value) { UNREFERENCED_PARAMETER(pid); if (value) { DbgPrint("Process Created %d\...
windows内核驱动 5-中断级与自旋锁
顺便复习操作系统了 WinOS 相关原理 中断级 如果有时间的话可以试着玩一玩这个游戏:https://github.com/plbrault/youre-the-os 在线:https://plbrault.github.io/youre-the-os/ 或许在游玩的过程中你会自己总结出一套操作系统进程调度的一套方法,便于其他方法的理解 调度方式:抢占式 最小执行单元:纤程->线程->进程 中断级( Irql ) 0->2级别越来越高,高级别可以打断低级别 0:Pass level 1:Apc level 2: Dpc level ISR延迟调用,硬件中断后,不那么紧急的任务放在DPC队列中 DPC访问换页内存,页面换到磁盘中pagefile.sys,引起换页缺页中断,如果换页中断无法打断DPC,然后就会访问无效地址,造成BSOD,所以DPC中最好不要使用换页内存,也即要使用nonpagedpool,而不要使用paged pool hardware(io…) 强制打断:ipicall 自旋锁 有一间厕所,A进...
windows内核驱动 4-内核注册表
使用内核注册表实现开机启动驱动等 内核注册表 驱动创建描述符SYM_NAME后,会出现在注册表计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services中 启动项的名字为驱动的文件名,例如hevd_2 Start:2-开机自启动、3-手动启动、4-禁用,数字越小启动越早 打开注册表ZwCreateKey和ZwOpenKey 移动驱动启动位置并修改注册表 ZwCreateKey NTSTATUS status = STATUS_SUCCESS;HANDLE hRegKey = NULL;OBJECT_ATTRIBUTES RegAttribute = { 0 };ULONG KeyOp = 0;InitializeObjectAttributes(&RegAttribute, RegistryPath, OBJ_CASE_INSENSITIVE, NULL, NULL);status = ZwCreateKey(&hRegKey, KEY_ALL_ACCESS, &RegAttr...
windows内核驱动 3-文件操作
之前写过:windows内核驱动 1-环境搭建、windows内核驱动 2-页表探索 但是内容确实有点衔接不上,这里根据【Win Pwn】HEVD-内核栈溢出(上)中展示的基础技巧来继续 项目结构优化 之前写过的所有功能都在main.c中,新加入IoctlFuncs,这里来写所有的ioctl功能,那么就要重新设计MyControl PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);ULONG ioCode = pStack->Parameters.DeviceIoControl.IoControlCode;ULONG inLen = pStack->Parameters.DeviceIoControl.InputBufferLength;ULONG ioInfo = 0;switch (ioCode){case IOCTL_MUL:{ DWORDLONG inData = *(PDWORDLONG)pIrp->AssociatedIrp.SystemBuf...
【Win Pwn】Windows内核池笔记
文章来自blackhat 2021的文章《Windows-Heap-Backed-Pool-The-Good-The-Bad-And-The-Encoded》 原文链接:https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-Windows-Heap-Backed-Pool-The-Good-The-Bad-And-The-Encoded.pdf Youtube:https://www.youtube.com/watch?v=VvxNc8GTFfk 粗略的分配 内核动态内存:和R3中的对差不多 类型为可分页和不可分页,程序按照4KB分页,之前写过一点相关的:Joe1sn’s Cabinet | windows内核驱动 2-页表探索 旧API初始化中不会将内存置零,导致信息泄露 一些API 在RS5(Redstone 5)版本前(及Windows 1809,在2018年10月前的版本) 没有任何校验、加密等等,但是之后就变得复杂得多了(严重怀疑微软借鉴了glibc的内存管理) 新版本的池设计管理和R3下是同一个库 每一...
【免杀】Windows Inline Hook小结
Inline Hook还是挺好玩的 文章很短,只是打个总结,记录一些有趣的发现 写在前面 之前在学习hook的时候,发现抄的一段代码只能在Debug模式下运行,调试后发现MSVC很有趣的一个点 当我们使用Debug模式编译的时候,程序为了调试方便,会将所有函数加入这个表中 比如 void oldtest() { MessageBoxA(NULL, "not hook", "test", NULL);}int main(){ oldtest();} 按照直觉 这里的call应该会直接来到函数的位置,但是真实情况并非如此 我们会发现一张跳表,根据距离这张表的地址差进行跳转,那段hook只是修改了这一段代码 x86 hook 首先是x86为啥叫32位架构,最突出的就是一个寄存器有32位(bit)大小,那么计算一下 (1<<32)/int(1024*1024*1024) = 4 没错,32位的寄存器最多只能存放4GB个数字(比如从1到0x100000000), 由于要做加减发(...
【免杀】PE文件分析
最近代码能力飞速提升,顺便复习一下 一般就是 DOS头:IMAGE_DOS_HEADER结构体 PE头:IMAGE_NT_HEADERS结构体 Section头:IMAGE_SECTION_HEADER结构体 OK,如果要分析PE文件的话,首先把文件读取出来 那么如何解析呢?这就是C/C++非常方便的一点:直接使用结构体转换,例如把地址值解析为数值 总体就是解释内存中的值 DOS 头 先看DOSHeader吧 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_cblp; // Bytes on last page of file WORD e_cp; // Pages in file WORD e_crlc; // ...











