病毒技术
Kiopler
这个作者很懒,什么都没留下…
展开
-
无管道后门(Backdoor)编写
如果主控端发来命令, 后门程序从socket收到了命令将其重定向到了stdin中, 由于标准句柄已被cmd.exe继承, 所以cmd.exe收到命令并执行后, 从标准输出和标准错误把结果重定向回了socket, 并通过其传回主控端。这是基于异步套接字的后门, 利用windows提供的WSASocket API函数, 这个API和socket的区别是, 其无需等待收发完成就可以继续执行, 也就是异步的。后门创建子进程并让子进程继承自己的3个标准句柄, 并将这3个句柄全部重定向到socket上。原创 2023-10-18 13:39:07 · 287 阅读 · 0 评论 -
代码重定位技术
本来每个进程都各自的进程地址空间, 但如果使用了比如注入技术后, 自身的那段代码就会进入到别人的进程地址空间内, 这将导致内部使用的API地址和变量地址发生变化, 因为注入到的位置和自身在自己进程地址空间种的基址很可能会不一样。原创 2023-07-27 14:28:01 · 375 阅读 · 0 评论 -
内核态进行进程与线程的监控
进程监控主要使用PsSetCreateProcessNotifyEx线程监控主要使用PsSetCreateThreadNotify主要需要注意一点就是,这种方式的使用条件是需要强制完整性检查。可以通过/integritycheck选项添加。或者网上有一种绕过方式, 在调用上面那两个函数前首先调用下面这个函数,如果执行成功即可绕过强制完整性检查。BOOLEAN BypassCheckSign(PDRIVER_OBJECT pDriverObject){#ifdef _WIN64..原创 2022-03-21 20:59:49 · 849 阅读 · 0 评论 -
远线程代码注入notepad.exe(X86)
这里实现远线程代码注入,刚开始遇到的问题是发现函数拷贝时出现问题。主要问题是函数地址并非真实的函数地址而是一个jmp,其会跳转到真实函数地址。该代码在Win7X86和WinXP下测试通过#include <cstdio>#include <cstdlib>#include <windows.h>#include <TlHelp32.h>const char *g_pcszProcessName = "notepad.exe";typed原创 2021-12-12 11:57:10 · 851 阅读 · 0 评论 -
在非常老旧的操作系统中隐藏进程
比如说Win9x系列等, 这段代码可以隐藏自身进程void HideProc(void){ HINSTANCE hKernel = LoadLibrary("Kernel32.dll"); if (hKernel != NULL) { pREGISTERSERVICEPROCESS *pRegisterServiceProcess = (pREGISTERSERVICEPROCESS *)GetProcAddress(hKernel, "RegisterServiceProcess");原创 2021-10-05 11:14:58 · 199 阅读 · 0 评论 -
创建系统服务并让其创建UI界面程序
服务进程位于SESSION0中,其规定是不能与其他SESSION之间发送windows消息。也不可以拥有UI界面,也不能创建有UI界面的程序。但通过WTS系列的函数来让服务进程创建拥有UI界面的进程。这里是服务控制程序的代码。其用于创建, 开启,停止及删除系统服务。服务名存储在g_szSvcName为Test, 服务程序的路径存储在全局变量g_szServiceBinPathName内#include <windows.h>#include <cstdio>#inclu原创 2021-10-03 11:39:07 · 527 阅读 · 0 评论 -
几种常用的键盘钩子技术
这里的实验环境全是64位。首先来看WH_KEYBOARD_LL。这种类型的钩子直接监控的是线程的消息队列, 属于全局范围内的钩子,一旦被安装会监控整个系统的键盘输入。其可以通过DLL方式加载也可以通过直接在自己进程内实现挂钩, 先给出钩子DLL:#include <windows.h>HHOOK g_hHook = NULL;HMODULE g_hMod = NULL;char g_szTitle[MAX_PATH] = { 0 };BYTE GetASCII(BYTE bVK原创 2021-09-29 11:44:44 · 4101 阅读 · 1 评论 -
PE结构之重定位表
什么是重定位:重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你占用,你必须转移到别的地址,这就需要基址重定位。你可能会问,不是说过每个进程都有自己独立的虚拟地址空间吗?既然都是自己的,怎么会被占据呢?对于EXE应用程序来说,是这样的。但是动态链接库就不一样了,我们说过动态链接库都是寄居在别的应用程序的空间的,所以出现要载入的基地址被应用程序占据了或者被其它的DLL占据了,也是很正常的,这时它就不得不进行重定位了。哪些数据需要重定位::00401000 55...转载 2021-09-27 13:22:12 · 492 阅读 · 0 评论 -
Windows下管道型后门及反向shell编写与总结(C++)
1. 双管道被动连接型后门#define _CRT_SECURE_NO_WARNINGS#define _WINSOCK_DEPRECATED_NO_WARNINGS#include <WinSock2.h>#include <iostream>#include <windows.h>#include <cstdlib>#include <iostream>#include <urlmon.h>#include &原创 2021-09-20 21:34:22 · 817 阅读 · 0 评论 -
svchost.exe启动服务原理
svchost.exe本身只是作为服务宿主,并不实现任何服务功能,需要svchost.exe启动的服务以动态链接库形式实现,在安装这些服务时,把服务的可执行程序指向svchost.exe,启动这些服务时由svchost.exe调用相应服务的动态链接库来启动服务。双击服务列表的服务,可以看到服务详细信息。其中,C:\Windows\System32\svchost.exe-k netsvcs这个路径当然就是启动服务的关键信息,其实,后边的这个-k netsvcs参数并不是在告诉sv...转载 2021-07-14 12:11:55 · 2431 阅读 · 0 评论 -
另一种R3下枚举进程与进程内部模块的方法
该方法是我逆向某个恶意软件时。从它那里学习到的方法。其利用Psapi.dll内的系统功能函数#include <Psapi.h>#include <windows.h>#include <cstdio>#pragma comment(lib, "psapi.lib")// 枚举进程PIDBOOL ToEnumProcesses(){ // 官方文档建议使用大数组 DWORD dwPIDArr[1024] = { 0 }; DWORD dwNee原创 2021-07-13 19:24:03 · 176 阅读 · 0 评论 -
[内核安全7]x64过ARK及PatchGuard驱动级Rootkit
主要是还是利用MiProcessLoaderEntry。该方法的优点:1. 过PatchGuard不会蓝屏2. ARK工具无法识别该方法缺点:1. 获取地址比较复杂繁琐2. 驱动不能进行常规卸载一般情况下对MiProcessLoaderEntry进行摘链操作只能过掉用户遍历DriverSection的InLoadOrderList链表进行枚举驱动。但是ARK工具还是会检测出对应驱动。要想让ARK工具检测不出来,只需要摘链后把对应驱动对象内所有内容清零即可。...原创 2021-07-13 18:01:51 · 1669 阅读 · 0 评论 -
内核模式下获取一段包含系统信息的内存
内核空间内有一段特殊的空间,其保存了一些系统重要信息,在x64下位于:x86下位于:这段内存保存有一个结构体, 这里仅列出x64的对应结构体:typedef struct _KUSER_SHARED_DATA { // // Current low 32-bit of tick count and tick count multiplier. // // N.B. The tick count is updated each time the clo.原创 2021-07-12 13:09:49 · 295 阅读 · 0 评论 -
内核模式下关闭/开启写保护(WriteProtect)
在内核态下,数据段受到写保护,并非可以直接修改,控制写保护的就是一个比特位,其位于CR0寄存器的第17位(即索引为16)。在x86下可以通过内联汇编来修改该位。但是在64位下无法使用内联汇编了。还是有办法可以实现对WP位的控制。// 关闭CR0控制寄存器内的WP位KIRQL WriteProtectOff(){ KIRQL OldIrql = 0; ULONG_PTR cr0 = 0; // 提升IRQL等级到Dispatch Level OldIrql = KeRaiseIr.原创 2021-07-12 12:50:22 · 3275 阅读 · 0 评论 -
将文件作为二进制数据存储与释放的技术
这种方式的缺点是会增加可执行文件的大小。其做法是把文件作为数据存储到堆或者栈内,程序运行后通过IO操作生成文件。1. 把目标文件拖入WinHex内2. 以C代码形式拷贝3. 粘贴进IDE环境4. 功能函数代码:BOOL ReleaseFileAndExec(LPCTSTR lpcszFileName){ HANDLE hFile = INVALID_HANDLE_VALUE; SHELLEXECUTEINFO stInfo = { 0 }; if (N...原创 2021-07-12 11:48:26 · 325 阅读 · 0 评论 -
判定操作系统x64还是x32方法
判定操作系统是x64还是x32的方法BOOL CheckOSArchi64(){ SYSTEM_INFO stSi = { 0 }; GetNativeSystemInfo(&stSi); // Intel推出了X86,其是Intel开发的32位指令集, 简称IA-32 // x86_64向下兼容x86的指令集, AMD率先开发出来,所以也别称之为AMD64 // Intel的64位技术也是衍生自AMD64, 被称之为Intel64, 或EM64T // 注意, IA-64是安原创 2021-07-11 23:32:45 · 1339 阅读 · 1 评论 -
Dll被加载到进程空间后如何获取进程名
这种方法可以获取进程对应的可执行文件的绝对路径。一般情况下可执行文件名就是进程名。需要进程名只要切除掉路径部分即可。LPTSTR GetCurrentProcessName(){ HMODULE hMod = NULL; PCHAR pszBuf = NULL; DWORD dwRet = 0; hMod = GetModuleHandle(NULL); pszBuf = new CHAR[MAX_PATH]; if (NULL == pszBuf) { return(NULL)原创 2021-07-11 22:40:54 · 855 阅读 · 0 评论 -
线程局部存储TLS技术之动态TLS
这里说的内容是基于X86的机器上,X64也所差无几。动态TLS是在程序运行时进行操作的TLS技术。其利用了4个Win32 API来实现。解释一下什么是动态线程存储:1. 进程的每个线程都有一张双字的TLS存储槽。实际上是一个数组2. 在X86的计算机上,该存储槽有64个元素。每个元素都是一个双字3. 每个线程的同一个索引下的元素可以使用不同的值4. 该技术可用于解决多线程问题由于每个线程的TLS存储槽的同一个索引都可以存储不同的内容。那么就可以将其视为一个同步的全局变量来使用原创 2021-07-10 22:34:24 · 501 阅读 · 1 评论 -
关于进程劫持注入的一点分析与思考
1. 劫持进程实现注入今天我尝试对win10 x64上的计算器进程进行进程劫持注入。劫持进程实现注入要执行如下步骤:以挂起方式启动目标进程 采用其他注入方式将DLL注入目标进程 继续目标进程的主线程使目标进程继续运行这种注入方式的优点: 被注入的进程来不及做任何防御就会被注入。因为以挂起方式启动进程,该进程的地址空间内除了目标进程的exe模块和ntdll.dll模块外还来不及解析导入表将所需dll全部导入,也就是说作为防护的dll模块或者线程可能也来不及导入和执行,这大大提高了注入原创 2021-04-03 17:25:41 · 2561 阅读 · 2 评论 -
编程实现获取目标进程OEP
下面这段代码可以实现获取目标进程的OEP#include <ImageHlp.h>#pragma comment(lib, "Imagehlp.lib")PBYTE GetExeEntryPoint(LPCSTR szProcessName){ PLOADED_IMAGE pstLoadedImg = NULL; PIMAGE_NT_HEADERS pNtHdr = { 0 }; DWORD dwEntryPt = 0; pstLoadedImg = ImageLoad(原创 2021-04-03 13:32:30 · 237 阅读 · 0 评论 -
[内核安全7]内核级的进程的监控
0. 导言进程的监控可以通过挂钩SSDT表中的NtOpenProcess来实现,但是现在这种方式已经不怎么用了,因为不稳定在者可能会被认为是恶意软件。微软知道这个问题所以为我们提供了专门的内核接口来实现这种功能。1. PsSetCreateProcessNotifyRoutine通过PsSetCreateProcessNotifyRoutine来监控进程, 该内核函数有个升级版PsSetCreateProcessNotifyRoutineEx。这个升级版功能更强大但只能在Vista版本以后使用,原创 2021-02-17 22:42:43 · 809 阅读 · 0 评论 -
DDOS拒绝服务攻击种类与概念介绍
一、 简述随着网络技术和网络应用的发展,网络安全问题显得越来越重要,已经被提到一个很高高的高度。DDOS攻击随着互联网的快速发展,也日益猖獗,从原来的的几兆、几十兆,到现在的几十G、几十T的流量攻击,形成了一个很大的利益链。DDOS攻击由于容易实施、难以防范、难以追踪等而成为最难解决的网络安全问题之一,给网络社会带来了极大的危害。同时,拒绝服务攻击也将是未来信息战的重要手段之一。DDoS攻击手段是在传统的DoS攻击基础之上产生的一类攻击方式。单一的DoS攻击一般是采用一对一方式的,当攻击目标CPU速转载 2020-12-30 13:41:35 · 1863 阅读 · 0 评论 -
[内核安全6]内核态Rootkit之GDT Hook
1. 导言GDT Hook的原理是通过修改GDT全局描述符表来达到挂钩的目的。GDT表的概念可以看下:IDT Hook整个GDT Hook的原理可以归纳为如下图。2. 代码段区分代码段分为两种: 一致代码段 非一致代码段 数据段属于非一致代码段 首先不管一致还是非一致,同特权级代码段之间互访都是允许的。在者永远不能由高特权级代码段访问低特权级代码段,这是不允许的!因为操作系统不会允许用高特权级来访问不安全的代码。有一种情况例外就是数据段,数据段可以被更高级的原创 2020-12-24 20:28:32 · 516 阅读 · 1 评论 -
截屏技术
该段代码可以截获桌面屏幕#include <windows.h>#include <tchar.h>#include <stdio.h>#include <atlimage.h>BOOL PaintMouse( HDC hdc){ HDC bufdc = NULL; CURSORINFO cursorInfo = { 0 }; ICONINFO iconInfo = { 0 }; HBITMAP bmpOldMask = NULL原创 2020-12-23 10:53:38 · 425 阅读 · 0 评论 -
Winsock编程基础TCP与UDP通信
这不做解释,直接给出代码, TCP服务端:#define _CRT_SECURE_NO_WARNINGS#include <winsock2.h>#include <windows.h>#include <stdio.h>#include <tchar.h>#pragma comment(lib, "WS2_32.lib")SOCKET g_ServerSocket = 0;SOCKET g_ClientSocket = 0;BOOL原创 2020-12-23 07:53:38 · 369 阅读 · 0 评论 -
移动设备监控
用Qt写了一个简单的界面,主要用于监控移动设备的插入和拔出监控, 效果如下:其原理相对简单,只要接收一个名为WM_DEVICECHANGE的消息即可。 使用前需要包含dbt.h头文件其中WPARAM接收的是事件类型,由于我这里只监控移动设备的插入和拔出,所以只要监控DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE即可。LPARAM参数是一个DEV_BROADCAST_HDR结构体,其定义如下:这里只要关心DBT_DEVTYP_VOLUMN即可,原创 2020-12-21 15:58:25 · 832 阅读 · 1 评论 -
利用RAWINPUT来记录键盘按键
这里用Qt写了下简单的界面,效果如下这里主要的技术在于注册和从分发中获取虚拟键码。从注册来讲:注册主要是RegisterRawInputDevices函数, 原型如下:最重要的是填充PCRAWINPUTDEVICE结构,具体填充方式上面已给出。由于Qt对Windows下消息循环进行封装,所以我们重写nativeEvent方法获取消息循环, 一旦注册完毕,消息循环会开始接收WM_INPUT消息, 我们从中获取虚拟键码下面是接收信息的逻辑:(完)...原创 2020-12-21 13:34:42 · 589 阅读 · 0 评论 -
监控文件
监控目录内文件的变动。#include <windows.h>#include <tchar.h>#include <stdio.h>#include <string.h>VOID W2C(WCHAR *pwszSrc, int iSrcLen, PCHAR pszDst, int iDstLen){ RtlZeroMemory(pszDst, iDstLen); WideCharToMultiByte(CP_ACP, 0, pwszSr原创 2020-12-20 19:28:56 · 402 阅读 · 0 评论 -
汇编与机器码对照(长期记录)
je或jz // 相等则跳(机器码是74或84) jne或jnz // 不相等则跳(机器码是75或85) jmp // 无条件跳(机器码是EB)汇编指令对应机器码表一、状态寄存器PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示:15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OF DF IF TF SF ZF AF PF CF条...原创 2020-12-19 20:29:14 · 4486 阅读 · 1 评论 -
[内核安全4]内核态Rootkit之IDT Hook
IDT Hook是通过挂钩中断描述符表的一种Ring0挂钩形式。在保护模式下和实模式下的中断机制是完全不同的。实模式下有256个中断例程以供调用,可以通过对应的中断号来调用。在保护模式下中断机制变得相对复杂了,但更好用。保护模式下中断由对应的门描述符来描述,其中有三种格式,分别为:任务门描述符 中断门描述符 陷阱门描述符任务门描述符一般用于不同特权级的非一致代码段间跳转。和IDT HOOK没有什么关系,因为IDT HOOK是通过挂钩中断门比如希望低特权级代码段跳转至高特权级的代码段运行就一般需原创 2020-12-19 16:31:48 · 593 阅读 · 1 评论 -
NtQuerySystemInformation来遍历显示进程
NtQuerySystemInformation属于未公开的函数,没有文档化,头文件中也不存在(winternl.h中有其及其部分数据结构的定义),该函数可以查询到非常大量的系统信息。这里来使用该函数来查询进程名和对应PID。该代码摘自网络,我对其做了大量的修改,废弃掉了大部分不需要的内容并完善了程序, 其本来的用意是查询特定进程下的特定线程状态,我保留了原程序功能的核心代码仅将其注释掉。#include <windows.h>#include <tchar.h>#in原创 2020-12-19 11:04:54 · 4037 阅读 · 4 评论 -
文件遍历
Win下文件遍历的方法:VOID TraverseFile(LPCTSTR pszDir){ DWORD dwBufferSize = 2048; TCHAR* pszFileName = NULL; TCHAR* pTmpSrc = NULL; WIN32_FIND_DATA FileData = { 0 }; if (NULL == pszDir) { return; } pszFileName = new TCHAR[dwBufferSize]; pTmpSrc原创 2020-12-18 21:17:15 · 393 阅读 · 1 评论 -
[内核安全3]内核态Rootkit之Object Hook
Object Hook是通过挂钩OBJECT_HEADER其中一些字段来实现的。在Windows中通过对象管理器来管理所有对象,可以使用WinObj来观察一下WinXP SP3下的对象类型:Windows中包含三种对象:执行体对象 内核对象 GDI/User对象这里我们挂钩的就是执行体对象。这里实验机器是WinXP SP3, 首先来看一下进程对象的数据结构:然后随便找一个进程对象,寻找他的对象结构体,比如之前打开的WinObj进程,通过!object命令查找到了其进原创 2020-12-18 21:13:26 · 535 阅读 · 1 评论 -
通过Psapi.dll来遍历进程方法
这种方法主要通过EnumProcesses来进行, 来看一下函数原型:lpidProcess是一个DWORD数组,用于接收系统上所有的PID数组 cb是DWORD数组的大小,以Byte计 lpcbNeeded是PID数组被填充了多少字节,除以sizeof(DWORD)就是进程数通过EnumProcesses来遍历的方法主要步骤如下:EnumProcesses获取PID数组 遍历PID数组并尝试用OpenProcess打开对应PID(至少需要PROCESS_QUERY_INFORMATIO原创 2020-12-18 13:34:22 · 360 阅读 · 0 评论 -
[内核安全2]内核态Rootkit之SSDT Hook
/*++* @Description* 主逻辑控制函数* @Param* @Return* @Attention--*/void Running();/*++* @Description* 不接收换行的从标准输入内收到键入,是一个安全函数* * @Param* lpszBuf: 接受键盘输入的缓冲区* uiSizeOfBuf: 描述lpszBuf的大小* * @Return* 返回状态码* * @Attention--*/NTSTATUSkgets(OUT.原创 2020-12-06 20:49:18 · 636 阅读 · 0 评论 -
32位下IAT Hook实现计算器修改执行
0x00 简介这个程序的目的是为了让calc程序显示中文。比如: 我是在XP下使用计算器,上面显示的都是阿拉伯数字,现在要用中文显示,如图所示:使用OD追踪Windows下的calc程序就会发现,计算器的输入框是一个EDIT空间并且calc程序是通过SetWindowTextW来把键入结果显示在EDIT控件上。在SetWindowTextW上下断点后运行程序,在calc程序上输...原创 2019-08-04 19:52:31 · 631 阅读 · 0 评论 -
由PID获取制定窗口句柄的方法记录
#include <windows.h>#include <tchar.h>#include <StrSafe.h>// 方法1 通过EnumWindows的方法以PID获取hWndtypedef struct { HWND hwndWindow; DWORD dwProcessID;} EnumWindowsArg;BOOL CALLBA...原创 2019-07-18 04:06:29 · 2935 阅读 · 0 评论 -
延迟载入+单一实例+资源载入实例
该段代码是使用了延迟导入+资源释放:1. 这是设置延迟导入:2. DLL:// TestDll.h#ifndef _TESTDLL_H_#define _TESTDLL_H_#include <windows.h>#include <tchar.h>__declspec(dllexport) int add(int a, int b);#...原创 2019-07-18 01:46:06 · 181 阅读 · 0 评论 -
DLL劫持技术解析(DLL Hijack)
0x01 简介DLL劫持技术利用的是Windows对DLL访问时查找DLL位置的一个漏洞,Windows对DLL的默认查找顺序(XP SP2及之后)如下:1. EXE所在文件夹2. Windows系统目录3. Windows 16位系统目录4. Windows目录5. 当前文件夹6. PATH环境变量中指出的目录当我们在EXE程序中导入了某个DLL文件时,其搜索并使...原创 2019-07-12 00:02:33 · 3948 阅读 · 0 评论 -
Windows下的管道技术
0x01 管道技术简介首先介绍一下Windows下的管道技术,管道分为两种匿名管道和命名管道。其作用主要是IPC通信。实际上管道就是一块内存区域。假设有A进程与B进程,A进程将数据写入管道,B进程从管道中读取数据,显然这便完成了一次进程间数据传输。0x02 匿名管道MSDN对匿名管道的详细描述: https://docs.microsoft.com/zh-cn/windows/win3...原创 2019-07-09 22:57:52 · 1061 阅读 · 1 评论