在Win32的核心, 结构化异常处理(Structured Exception Handling)(SEH) 是操作系统提供的一种服务. 你能找到的所有关于SEH的文档都会描述某一种编译器的运行时库(runtime library)对操作系统实现的某种包装. 我会层层剥析SEH一直到它的最基本的概念.
这篇文章假设你熟悉Win32,C++
文章示例代码: Exception.zip
在所有由Win32操作系统提供的基础设施中, 可能被最广泛应用却没有文档说明的就是结构化异常处理了. ...
直接贴代码, 可以直接测试
#include <windows.h>
#include <stdio.h>
typedef struct _LSA_UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PVOID Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;
typedef LSA_UNICODE_STRING UNICODE_STRING, *PUNICODE_STRING;
// 申明ntd...
#include <windows.h>
#include <stdio.h>
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define SystemLoadAndCallImage 38
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PVOID Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef uns...
开发环境: VC6.0
系统环境: xp3
exe驱动加载InstallSysDemo.rar
附件中有完整的测试代码
注意: 驱动的sys文件 需要和 生成的exe文件放到一个文件夹即可执行
需要了解 内核对象的结构
32位的代码
#include "ntddk.h"
VOID MyUnload(PDRIVER_OBJECT pDriverObject)
{
KdPrint(("驱动卸载成功\n"));
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING Reg_Path)
{
UNICODE_STRING mingzi;
PVOID dizhi1;
ULONG *biao_neihe1;//内核表的地址
int i=2;...
原理:
段基址 + 偏移地址 = 函数地址
让idt不动的话, 就需要更改段基址
实例代码:
#include "ntddk.h"
#include "ntddk.h"
#define WORD USHORT
#define DWORD ULONG
#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) \
| ((DWORD)((WORD)(((DWORD_PT...
主要理解下面的内容:
1:
KiProcessorBlock数组的每一个非0项都是指向一个_kprcb结构,而_kprcb结构正是再_kpcr结构的+0x120处,_kpcr结构的+0x38就是_IDT结构地址。
2:
通过硬编码 使用ida找到 KiProcessorBlock
3:
IDt的表结构的理解, 进行函数过滤
详细使用代码 (xp3)
#include <ntddk.h>
#define WORD USHORT
#define D...
没啥技术含量
主要就是指令 sidt
详细代码
#include <ntddk.h>
#define WORD USHORT
#define DWORD ULONG
#define MAKELONG(a,b) ((DWORD)((USHORT)a))|(((DWORD)b)<<16)
typedef struct _IDTR{
USHORT IDT_limit;
USHORT IDT_LOWbase;
USHORT IDT_HIGbase;
}ID...
1 了解PE结构
2 懂HOOK KiFastCallEntry
3 理解SSDT表 (需要修复SSDT表)
其实操作不算太复杂, 需要有一定的基础
完整测试的实例代码
#include <ntddk.h>
#include "ntimage.h"
#define __Max(a,b) a>b?a:b
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTab...
注意事项 : 我用的OD是 自己有保护的,经过内核重载 CE就能打开OD了 没重载之前呢 是看不到OD进程的
不要跟360HOOK了一个点 要不就会蓝屏 , 加载驱动前一定要检查 有没有被HOOK NtCreateFile 函数否则就会加载失败的
重点注意QQ 它的驱动HOOK了不少函数而且是重启不会取消的HOOK 解决办法就是把它的驱动删除了 重启 就OK
比如打开了 CE 一定要先把CE关掉以后 才能卸载重载驱动 要不就会蓝屏
首先呢我们要学的是一个思想,过程代码就放在哪跟着代码一步一步看最后作者的意思是什么就会明白.也能自己调用但是...
文章非原创,转载的
今天和大家分享一个小心得,想必很多高手已经玩腻了~飘过吧!
最近接触了不少游戏保护,它们或多或少的都有一个特制就是在被调试机上运行游戏以后调试机上的WINDBG就接受不到信息了。起初我也困惑的很,而且在驱动当中设置int 3断点会蓝屏。后来在一个应用程序中添加了
__asm int 3这个应用程序就崩溃了。得到结论它们都是用了KdDisableDebugger函数来禁止操作系统调试了。想对应的有一个函数是 KdEnableDebugger 可以允许调试,但是很多游戏仍然很操蛋。及时你使用了KdEnableDebugger 也无法调试,它们都是不...
网上说的比较常见的4种方法:
1、通过DriverEntry传入的DriverObject参数的DriverSection成员指向LDR_DATA_TABLE_ENTRY结构,通过遍历这张表得到ntoskrnl的基址和大小
2、ZwQuerySystemInformation大法
3、搜索内存
4、利用KPCR结构
存在的问题:
1、第1种方法和第4种方法得到的结果比ZwQuerySystemInformation少一个
2、第1种方法如果输出BaseDllName是ntoskrnl.exe,如果输出FullDllName则是:\WINDOWS\s...
很多知识点可以学习
完整代码
#include <ntddk.h>
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //仅适用于checked build版本
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} Serv...
任意位置hook nt函数
详细代码
#include <ntddk.h>
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //仅适用于checked build版本
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTa...
详细代码,直接看吧
#include <ntddk.h>
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //仅适用于checked build版本
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry...