- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
KeGetCurrentThread 得到KTHREAD结构体
KdDebuggerEnabled 判断是否开启debug调试
KdDisableDebugger 关闭 debugger调试
MmIsAddressValid 测试一个地址是否存在(有效)
IoGetCurrentProcess 函数返回当前进程的EPROCESS结构的指针,有了这个值我们就可以从它的开始处逐字节向后搜索“xx”这个字符串了
MmGetSystemRoutineAddress 得到导出的函数的实际地址
RtlInitUnicodeString 转换成unicode字符串
ZwClose 关闭句柄
ExAllocatePoolWithTag 内存分配函数
ExFreePoolWithTag
ZwCreateFile 打开文件
IofCompleteRequest 每当完成了一个以IRP为代表的I/O操作请求的时候,就要执行IRP的善后操作
ObfDereferenceObject 用来减少一个内核对象的引用计数的.
PsLookupProcessByProcessId 打开进程
ZwQueryInformationProcess 检查系统调试器是否存在
PsSetCreateProcessNotifyRoutine 监视进程创建 (xuetr不能启动)
KeAddSystemServiceTable 通过KeAddSystemServiceTable获取
KeServiceDescriptorTable SSTD地址
MmProbeAndLockPages 锁定内存页
IoAllocateMdl 指向这个buf
memset 用来对一段内存空间全部设置为某个字符,一般用于在对定义的字符串初始化为' '或者'\0';
IoFreeMdl 字面理解
MmUnlockPages 取消锁
KeUnstackDetachProcess
KeStackAttachProcess
KeDelayExecutionThread
KeInsertQueueApc --估计用于防止线程挂起
KeInitializeApc APC相关
以上是这个驱动保护的流程分析
就是 HOOK了6个API,这些都已经还原
目前还有个问题没搞定,听说看雪有大牛 就是 调试端口被置零了,导致OD附加上去读不出数据
求助,在线等
KdDisableDebugger 这个函数已经搞定,我把这个函数直接修改为
xor eax,eax
ret
因为返回0是成功,这样一改,系统的所有调用这个函数都是直接返回成功
以下是这个过这个函数的源码
DriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING
LOCAL pDeviceObject:PVOID
pushad
mov edi,0804ff9a0h ;KdDisableDebugger 地址
mov realaddr,edi
invoke DbgPrint, $CTA0("OLD3 address: %08X\n"),edi
cli
mov eax,CR0
mov CR0Reg,eax
and eax,-1
mov CR0,eax
mov ebx,offset hookproc
sub ebx,edi
sub ebx,5
mov byte ptr [edi],0E9h
mov [edi+1],ebx
invoke DbgPrint, $CTA0("OLD4 address: %08X\n"), eax
mov eax,CR0Reg
mov CR0,eax
sti
popad
mov eax, STATUS_SUCCESS
ret
DriverEntry endp
我估计OD附加不上去的原因是 ZwQueryInformationProcess 还是还在不停的写入0
各位大牛,搞定这个函数有什么好办法吗? |
|