WindowsAPI查缺补漏-多线程
WindowsAPI查缺补漏-多线程线程创建与销毁CreateThread在当前进程创建新线程。
12345678HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全属性结构 _In_ SIZE_T dwStackSize, //线程栈空间大小 _In_ LPTHREAD_START_ROUTINE lpStartAddress, //线程函数指针 _In_opt_ LPVOID lpParameter, //传递给线程函数的参数 _In_ DWORD dwCreationFlags, //线程创建标志 _Out_opt_ LPDWORD lpThreadId //返回线程ID)
例子:
123456HANDLE hThread;hThread = ::CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);if (hThread != NULL) { ::CloseHand ...
保护模式入门
保护模式入门段寄存器一共有8个:ES、CS、SS、DS、FS、GS、LDTR、TR。每个段寄存器结构如下:
1234Base 32bitLimit 32bitAttribute 16bitSelector 16bit (只有这16位是可见的)
读写方法:用mov时,mov ax,es只能读16位可见部分,mov ds,ax能写96位。读写LDTR用sldt或lldt,读写tr用str或ltr。
成员如下,其中GS在Windows中不用:
段寄存器
Selector
Attribute
Base
Limit
ES
0023
RW
0
0xFFFFFFFF
CS
001B
RX
0
0xFFFFFFFF
SS
0023
RW
0
0xFFFFFFFF
DS
0023
RW
0
0xFFFFFFFF
FS
003B
RW
0x7FFDE000
0xFFF
在调试时,单步调试触发单步调试异常进入内核,内核会把GS清零。段寄存器在内联汇编实现时编译器可能会瞎改。
段描述符分为全局描述符表GDT和局部描述符表LDT,但后者Windows不用。CPU有个寄存器GDT ...
Python-逆向实用工具
Python-逆向实用工具PEfile解析头部数据123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354import hashlib,pefile# 计算得到数据长度,自动使用推荐大小def NumberOfBytesHumanRepresentation(value): if value <= 1024: return '%s bytes' % value elif value < 1024 * 1024: return '%.1f KB' % (float(value) / 1024.0) elif value < 1024 * 1024 * 1024: return '%.1f MB' % (float(value) / 1024.0 / 1024.0) else: return & ...
WindowsAPI编程核心技术-强制性功能
WindowsAPI编程核心技术-强制性功能强制结束进程PspTerminateThreadByPointer法用未导出函数PspTerminateThreadByPointer结束一个进程的所有线程,这个进程也随之消亡了。该函数声明:
12345NTSTATUS PspTerminateThreadByPointer( PETHREAD pEThread, NTSTATUS ntExitCode, BOOLEAN bDirectTerminate)
但要注意函数指针的声明的调用约定:
1234567#ifdef _WIN64 // 64 位 typedef NTSTATUS(__fastcall *PSPTERMINATETHREADBYPOINTER) (PETHREAD pEThread, NTSTATUS ntExitCode, BOOLEAN bDirectTerminate);#else // 32 位 typedef NTSTATUS(*PSPTERMINATETHREADBYPOINTER) (PETHREAD pEThrea ...
WindowsAPI编程核心技术-过PatchGuard防护
WindowsAPI编程核心技术-过PatchGuard防护驱动隐藏过PatchGuard摘链未导出函数MiProcessLoaderEntry从全局链表中插入或删除一个模块,操作时同样设置PatchGuard监控的全局数据,所以不会触发PatchGuard导致蓝屏。声明如下:
12345NTSTATUS __stdcall MiProcessLoaderEntry( PVOID pList, //双向链表 BOOLEAN bOperate //操作标志 TRUE插入链表 FALSE删除链表); //x86NTSTATUS __fastcall MiProcessLoaderEntry(PVOID pList,BOOLEAN bOperate); //x64
对Ntoskrnl.exe丢IDA进行分析,对导出函数NtSetSystemInformation内存特征码扫描定位未导出函数MmLoadSystemImage地址。
对于x86和x64的Windows 7和Windows 8.1,在MmLoadSystemImage函数内存中扫描定位MiProcessLoaderE ...
WindowsAPI编程核心技术-Minifilter文件监控
WindowsAPI编程核心技术-Minifilter文件监控这节不讲Minifilter,只讲实现,入门Minifilter看驱动篇。
拦截IRP请求本节在FLT_OPERATION_REGISTRATION中设置IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_SET_INFORMATION,分别对应文件创建、读取、写入、属性修改等。
123456789101112131415161718192021// operation registrationCONST FLT_OPERATION_REGISTRATION Callbacks[] = { { IRP_MJ_CREATE, 0, Minifilter_FileMonitor_TestPreOperation, Minifilter_FileMonitor_TestPostOperation }, { IRP_MJ_READ, 0, Minifilter_FileMonitor_ ...
WindowsAPI编程核心技术-对象监控
WindowsAPI编程核心技术-对象监控碎碎念对象监控指的是线程句柄对象、进程句柄对象、桌面句柄对象的监控。
这个技术病毒木马常用。病毒木马的对象监控回调常用来会自行线程或进程的保护,保护指定程序不被杀毒软件或用户强制结束运行。结束进程时要获取打开的进程句柄,所以病毒木马通过对进程对象进行监控,使系统获取句柄失败,从而实现进程保护。
前置芝士ObRegisterCallbacks注册线程、进程和桌面句柄操作的回调函数。驱动程序必须有数字签名。
1234NTSTATUS ObRegisterCallbacks( _In_ POB_CALLBACK_REGISTER CallBackRegistration, //指定回调例程列表和其他注册信息 _Out_ PVOID* RegistrationHandle //接收已注册回调例程集合的标识)
用ObUnRegisterCallbacks注销回调例程。
OB_CALLBACK_REGISTRATION1234567typedef struct _OB_CALLBACK_REGISTRATION { _In_ ...
WindowsAPI编程核心技术-注册表监控
WindowsAPI编程核心技术-注册表监控前置芝士CmRegisterCallback注册注册表监控例程。卸载用CmUnRegisterCallback。
12345NTSTATUS CmRegisterCallback( _In_ PEX_CALLBACK_FUNCTION Function, //回调例程地址 _In_opt_ PVOID Context, //例程参数 一般空余 _Out_ PLARGE_INTEGER Cookie //回调例程标识/句柄)
PEX_CALLBACK_FUNCTION回调函数。
12345NTSTATUS RegistryCallback( _In_ PVOID CallbackContext, //参数 _In_opt_ PVOID Argument1, //操作类型 _In_opt_ PVOID Argument2 //操作信息)
Argument1的结构如下:
1234567891011121314151617181920212223242526272829303132333435363738394 ...
WindowsAPI编程核心技术-模块加载监控
WindowsAPI编程核心技术-模块加载监控前置芝士PsSetLoadImageNotifyRoutine设置模块加载回调函数,完成模块加载时通知回调函数。
123NTSTATUS PsSetLoadImageNotifyRoutine( _In_ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine //指向回调函数);
可通过PsRemoveLoadImageNotifyRoutine删除回调。
PLOAD_IMAGE_NOTIFY_ROUTINE回调函数。
12345VOID SetLoadImageNotifyRoutine( _In_opt_ PUNICODE_STRING FullImageName, //标识可执行映像文件 _In_ HANDLE ProcessId, //加载模块所属进程ID 驱动程序为0 _In_ PIMAGE_INFO ImageInfo);
IMAGE_INFO1234567891011121314151617181920typedef struct _IMAGE_INFO { ...
WindowsAPI编程核心技术-进线程监控
WindowsAPI编程核心技术-进线程监控进线程枚举进程枚举:
1234567891011121314151617181920212223242526272829#include <ntifs.h>NTKERNELAPI UCHAR* PsGetProcessImageFileName(IN PEPROCESS Process); //未公开的进行导出即可NTKERNELAPI HANDLE PsGetProcessInheritedFromUniqueProcessId(IN PEPROCESS Process);//未公开进行导出// 根据进程ID返回进程EPROCESS结构体,失败返回NULLPEPROCESS LookupProcess(HANDLE Pid){ PEPROCESS eprocess = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; Status = PsLookupProcessByProcessId(Pid, &eprocess); if (NT_SUCCES ...