能力值:
( LV13,RANK:290 )
2 楼
代码有个错误,
在 函数 OB_PREOP_CALLBACK_STATUS ObjectPreCallback_Thread_Dispatch(
IN PVOID RegistrationContext,
IN POB_PRE_OPERATION_INFORMATION OperationInformation ) 里
需要将 PROCESS_TERMINATE 换成 THREAD_TERMINATE
能力值:
( LV13,RANK:290 )
3 楼
win7 的任务管理器在结束任务时:
int __stdcall EndTaskThreadProc(LPVOID lpMem)
{
LPVOID v1; // esi@1
int v2; // edi@2
BOOL v3; // eax@4
DWORD v4; // eax@8
DWORD v5; // eax@14
DWORD v6; // eax@19
bool v7; // zf@19
bool v8; // sf@19
char v9; // of@19
HANDLE v10; // eax@27
int v11; // ST14_4@28
int v12; // eax@28
ULONG_PTR dwResult; // [sp+8h] [bp-Ch]@12
int v15; // [sp+Ch] [bp-8h]@4
int v16; // [sp+10h] [bp-4h]@1
int lpMema; // [sp+1Ch] [bp+8h]@3
v1 = lpMem;
v16 = 40046;
if ( !lpMem )
{
v2 = -2147467259;
goto LABEL_28;
}
v16 = *((_DWORD *)lpMem + 4);
lpMema = *((_DWORD *)lpMem + 3);
if ( !lpMema )
{
v3 = IsHungAppWindow(*((HWND *)v1 + 1));
v15 = v3 == 0;
if ( v3 != 0 )
{
TmGetProcessStatus(*((_DWORD *)v1 + 5), (int)&v15);
lpMema = v15 == 0;
if ( !v15 )
v16 = 40207;
}
}
if ( !SetThreadDesktop(*(HDESK *)v1) )
{
v4 = GetLastError();
if ( (signed int)v4 > 0 )
v4 = (unsigned __int16)v4 | 0x80070000;
v2 = v4;
if ( (v4 & 0x80000000u) != 0 )
goto LABEL_26;
}
if ( !lpMema )
{
if ( SendMessageTimeoutW(*((HWND *)v1 + 1), 0x10u, 0, 0, 3u, 0x1F4u, &dwResult) )
{
v2 = 0;
}
else
{
v5 = GetLastError();
if ( (signed int)v5 > 0 )
v5 = (unsigned __int16)v5 | 0x80070000;
v2 = v5;
if ( (v5 & 0x80000000u) != 0 )
{
LABEL_18:
v2 = 0;
if ( !EndTask(*((_DWORD *)v1 + 1), 0, 0) )
{
v6 = GetLastError();
v9 = 0;
v7 = v6 == 0;
v8 = (v6 & 0x80000000u) != 0;
LABEL_23:
if ( !((unsigned __int8)(v8 ^ v9) | v7) )
v6 = (unsigned __int16)v6 | 0x80070000;
v2 = v6;
goto LABEL_26;
}
goto LABEL_26;
}
}
Sleep(0x1F4u);
if ( !IsWindowVisible(*((HWND *)v1 + 1)) )
goto LABEL_26;
goto LABEL_18;
}
if ( !EndTask(*((_DWORD *)v1 + 1), 0, 1) )
{
v6 = GetLastError();
v9 = 0;
v7 = v6 == 0;
v8 = (v6 & 0x80000000u) != 0;
goto LABEL_23;
}
v2 = 0;
LABEL_26:
if ( *((_DWORD *)v1 + 6) )
{
v10 = GetProcessHeap();
HeapFree(v10, 0, v1);
}
LABEL_28:
v11 = v16;
v12 = IsUserAdmin();
TmSqmAction(v12, 0, v11, 0, v2);
return v2;
}
能力值:
( LV13,RANK:290 )
4 楼
00CF843A |. FF15 5013CE00 CALL DWORD PTR DS:[<&USER32.SendMessageTimeoutW>] ; \SendMessageTimeoutW
02DEFC30 00150332 |hWnd = 00150332 ('test_kill',class='#32770')
02DEFC34 00000010 |Message = WM_CLOSE
02DEFC38 00000000 |wParam = 0
02DEFC3C 00000000 |lParam = 0
02DEFC40 00000003 |Flags = SMTO_BLOCK|SMTO_ABORTIFHUNG
02DEFC44 000001F4 |Timeout = 500. ms
02DEFC48 02DEFC58 \pResult = 02DEFC58
能力值:
( LV2,RANK:10 )
5 楼
强烈围观一下,谢谢楼主,分享。。。源码万岁。。。
能力值:
( LV12,RANK:760 )
6 楼
ObRegisterCallbacks的验证可以通过一个小技巧绕过。
另外插个APC还是欢乐的结束了~XXOO的方法太多了~
能力值:
( LV12,RANK:760 )
7 楼
最简单直接改一下
_OBJECT_TYPE_INITIALIZER 中的
union
{
/*0x002*/ UINT8 ObjectTypeFlags;
struct
{
/*0x002*/ UINT8 CaseInsensitive : 1;
/*0x002*/ UINT8 UnnamedObjectsOnly : 1;
/*0x002*/ UINT8 UseDefaultObject : 1;
/*0x002*/ UINT8 SecurityRequired : 1;
/*0x002*/ UINT8 MaintainHandleCount : 1;
/*0x002*/ UINT8 MaintainTypeList : 1;
/*0x002*/ UINT8 SupportsObjectCallbacks : 1;
};
};
SupportsObjectCallbacks 去掉后,轻松over~
太多可以xxoo的地方了,obcallback弱的很~
能力值:
( LV5,RANK:60 )
8 楼
老V深爱着object_type····
能力值:
( LV12,RANK:760 )
9 楼
我不深爱~
我深爱MSDN~
能力值:
( LV13,RANK:290 )
10 楼
"太多可以xxoo的地方了,obcallback弱的很~"
你都进内核了,不只是obcallback弱的很,一切都皆有可能了。呵呵
能力值:
( LV4,RANK:50 )
11 楼
对于防守RING3的还是可以的,而且64位下,是比较有效的方法,32位下进RING0,可以无视了。怎么干都行。
能力值:
( LV13,RANK:290 )
12 楼
就是考虑到64位系统下不能hook了,所以我才搞这种框架。很蛋疼,代码都要写两套
能力值:
( LV3,RANK:30 )
13 楼
不考虑内核的破坏
win32下
插APC,你总要线程句柄的吧 设置了PsProcess和PsThread的监控后,你怎么获取到句柄?
能力值:
( LV3,RANK:30 )
14 楼
win32下你能改这个结构体么。。。。要是内核的话。。。都进内核了,没什么是不可以的。。。。某人的这句话还是很正确的
能力值:
( LV3,RANK:30 )
15 楼
实际上,随便什么HIPS之流的。。。没了先入为主的优势,监视垃圾一堆
这些各种保护,都必须有个前提,那就是你得先入为主,你先把防御搭起来。。然后等着别人来攻击。没了这个前提,你再怎么防都没用。
防御的和攻击的,都在内核的话。。。这次可能你防御的手段高明些而已,人家没攻破,但是真的想搞,dbg一下,看下你防守的原理,针对性处理一下。。。马上就能搞定。。然后双方这么死循环下去
能力值:
( LV3,RANK:30 )
16 楼
object hook的话64位还不是照用不误
能力值:
( LV3,RANK:30 )
17 楼
这个
注册回调前加段代码,改一个比特位就解决了
PLDR_DATA_TABLE_ENTRY pLdrEntry=(PLDR_DATA_TABLE_ENTRY)pDrvObj->DriverSection;
pLdrEntry->Flags |=0x20;
能力值:
( LV3,RANK:30 )
18 楼
看了下代码
那个写得有问题
// 去除掉杀进程的权限
OperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess ^= PROCESS_TERMINATE;
这个求异或的话,会把除PROCESS_TERMINATE外的其他所有权限都给加上了。。。。明显不该这样
应该是仅仅去掉PROCESS_TERMINATE而已,正确做法该是:
OperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= (~PROCESS_TERMINATE);
能力值:
( LV7,RANK:110 )
19 楼
跟着楼上学习.
能力值:
( LV13,RANK:290 )
20 楼
64位下的object hook,我没有试过,不知道行不行
函数Hook、ssdt hook 试过了的,是行不通的。
既然微软用了新框架,我打算hook这种方式就只用于xp下了,
vista及其以后的系统我就用新框架了,
能力值:
( LV3,RANK:30 )
21 楼
貌似你没搞明白patch guard的基本原理
人家pg只能对死的代码进行检查
object header是系统启动时动态填充的。。。焉有检查的道理?
能力值:
( LV3,RANK:30 )
22 楼
一般原则当然是有标准做法就用标准做法
不过,比如注册表监控,cm回调没法完全搞定。。。。这种非用object hook不可
本来我是向来不建议使用hook的。。。但是没办法的情况下,也可以一用。。。object hook在兼容性上要优于其他任何类型hook
能力值:
( LV3,RANK:30 )
23 楼
至于inline,ssdt的hook。。。。。还是洗洗睡了吧
能力值:
( LV13,RANK:290 )
24 楼
win7下我测试了,这个方法确实可行,呵呵,感谢
能力值:
( LV13,RANK:290 )
25 楼
这里是有问题,