首页
社区
课程
招聘
[原创]某驱动里面的摘取系统注册表回调的方法
发表于: 2013-3-30 23:54 14351

[原创]某驱动里面的摘取系统注册表回调的方法

2013-3-30 23:54
14351

换工作环境了,比以前自由多了,这几天没多少事,之前分析过了这个驱动一直没有还原,这2天抽空还原了一下,大牛飘过~~

基本原理:  
     在自己驱动里面调用CMRegistercallback注册一个回调函数,然后在回调函数里面根据
  ebx寄存器里面存储的是当前回调函数_EX_CALLBACK结构地址,而这一地址又一定在系统的回调链上的这一特性,  在XP系统上找到CmpCallBackVector 首地址,在Vista以上系统上找到CallbackListHead  首地址,然后依次遍历下了,找到CallBackFunction和Cookie,然后有了CallBackFunction  就能找到模块名称,根据Cookie就能进行注册表回调的摘取了~~~  
  
先补充下XP下的CmpCallBackVector的节点怎么找打Cookie和Funtion的方法:
CmpCallBackVector--> Node.Object
--->EX_CALLBACK_ROUTINE_BLOCK
-->CM_CALLBACK_CONTEXT_BLOCKXP
在EX_CALLBACK_ROUTINE_BLOCK 找到CallBackFuntion
在CM_CALLBACK_CONTEXT_BLOCK中找到Context和Cookie
ebx在指向的是当前函数注册的在nt!CmpCallBackVector里面的节点位置
由于在XP系统上CmpCallBackVector里面存放的是EX_FAST_REF指针,因此从当前位置一直向
低内存位置查找DWORD值,直到为0,即为CmpCallBackVector的第一结构

从EX_FASTREF.object-->EX_CALLBACK_ROUTINE_BLOCK使用如下函数

PVOID FORCEINLINE MyFastRefGetObject (EX_FAST_REF FastRef)
{
    return (PVOID) (FastRef.Value & ~MAX_FAST_REFS);
}

#if defined (_WIN64)
    #define MAX_FAST_REFS 15
#else
    #define MAX_FAST_REFS 7
#endif
_EX_CALLBACK  CmpCallBackVector[100];

typedef struct _EX_CALLBACK 
{
	EX_FAST_REF RoutineBlock;
} EX_CALLBACK, *PEX_CALLBACK;

typedef struct _EX_FAST_REF 
{
	union {
		PVOID Object;
		#if defined (_WIN64)
					ULONG_PTR RefCnt : 4;
		#else
					ULONG_PTR RefCnt : 3;
		#endif
		ULONG_PTR Value;
	};
} EX_FAST_REF, *PEX_FAST_REF;

typedef struct _EX_CALLBACK_ROUTINE_BLOCKXP
{
	EX_RUNDOWN_REF		  RundownProtect;
	[COLOR="Red"]PEX_CALLBACK_FUNCTION Function;[/COLOR]
	PVOID				  Context;
	PVOID				  pValid;
}EX_CALLBACK_ROUTINE_BLOCKXP, *PEX_CALLBACK_ROUTINE_BLOCKXP;

typedef struct _CM_CALLBACK_CONTEXT_BLOCK {
	[COLOR="Red"]LARGE_INTEGER               Cookie;          [/COLOR]  
	LIST_ENTRY                  ThreadListHead;     
	EX_PUSH_LOCK                ThreadListLock;    
	PVOID                       CallerContext;
} CM_CALLBACK_CONTEXT_BLOCK, *PCM_CALLBACK_CONTEXT_BLOCK;

LIST_ENTRY* CallbackListHead ;
typedef struct _CM_CALLBACK_CONTEXT_BLOCKEX-------// 0x30
{
	struct _LIST_ENTRY CallbackListEntry;               // +0x0(0x8)
	ULONG               PreCallListCount;                    // +0x8(0x4)
	ULONG		pda;				          // Pad
	LARGE_INTEGER Cookie;					   // +0x10(0x8)
	void*              CallerContext;                           // +0x18(0x4)
	long (__stdcall * Function)(void*, void*, void*);  // +0x1c(0x4)
	struct _UNICODE_STRING Altitude;                      // +0x20(0x8)
	struct _LIST_ENTRY ObjectContextListHead;         // +0x28(0x8)
}CM_CALLBACK_CONTEXT_BLOCKEX,*P_CM_CALLBACK_CONTEXT_BLOCKEX;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
此贴会火 前排占坐
2013-3-31 01:39
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
总会下意识的想到律师函 飘过~
2013-3-31 12:18
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
技术上不行的才用律师函吧,这个相信不会有这种情况
2013-3-31 13:00
0
雪    币: 253
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
还真没见过数字公司对民间技术发过什么律师函。
2013-3-31 13:21
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
這代碼習慣。。。。這麼多if嵌套你不頭暈嗎?
2013-3-31 14:15
0
雪    币: 224
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
下面这代码不算嵌套多吧~
NTSTATUS OOPSRegistryCallbackVista(PVOID pMyCallRef, pREG_CALL_BACK_CONTEXT pContext, PVOID pOPInfor)
{
	CM_CALLBACK_CONTEXT_BLOCKEX* pmyCallBack  = NULL;

	UNREFERENCED_PARAMETER(pOPInfor);

	//地址合法性校验
	pmyCallBack = (CM_CALLBACK_CONTEXT_BLOCKEX*)pMyCallRef;
	if (!MmIsAddressValid(pmyCallBack))
	{
		return STATUS_INVALID_PARAMETER;
	}

	if (!MmIsAddressValid(&(pmyCallBack->Function)))
	{
		return STATUS_INVALID_PARAMETER;
	}

	if (!MmIsAddressValid(&(pmyCallBack->Altitude)))
	{
		return STATUS_INVALID_PARAMETER;
	}

	if (pmyCallBack->Function != OOPSRegistryCallback)
	{
		return STATUS_INVALID_PARAMETER;
	}

	{
		CM_CALLBACK_CONTEXT_BLOCKEX *cmListHead      = NULL;
		CM_CALLBACK_CONTEXT_BLOCKEX *callBackListHead=NULL;
		ULONG						 ulIndex         = 0;
		ULONG						 ulTmp           = 0;
		ExAcquireFastMutex(&pContext->Mutex);
		cmListHead = GetCallVectorListHeadWin7(pMyCallRef);
		if(NULL == cmListHead)
		{
			ExReleaseFastMutex(&pContext->Mutex);
			return STATUS_INVALID_PARAMETER;
		}

		callBackListHead = cmListHead;
	
		while ( 1 )
		{
			cmListHead = (CM_CALLBACK_CONTEXT_BLOCKEX *)cmListHead->CallbackListEntry.Flink;
			//到结尾了
			if ( cmListHead == callBackListHead )
				break;

			//合法性判断
			if ( !MmIsAddressValid(cmListHead) || !MmIsAddressValid(&cmListHead->Altitude) )
				break;
		
			//去重
			ulTmp = 0;
			if ( 0 != pContext->dwCallBackCount )
			{
				LARGE_INTEGER curCookie = {0};
				curCookie.LowPart = pContext->lCookies[ulTmp].LowPart;
				curCookie.HighPart = pContext->lCookies[ulTmp].HighPart;
				do
				{
					if ( curCookie.LowPart == cmListHead->Cookie.LowPart && curCookie.HighPart == cmListHead->Cookie.HighPart )
						break;
					++ulTmp;
				}while ( ulTmp < pContext->dwCallBackCount );
			}

			//插入列表
			if ( ulTmp == pContext->dwCallBackCount && ulIndex < 100 )
			{
				pContext->lCookies[ulIndex].LowPart   = cmListHead->Cookie.LowPart;
				pContext->lCookies[ulIndex].HighPart  = cmListHead->Cookie.HighPart;
				pContext->pfCallBackFunction[ulIndex] = cmListHead->Function;
				++pContext->dwCallBackCount ;
				++ulIndex;
			}
		}
		ExReleaseFastMutex(&pContext->Mutex);
	}
	return STATUS_SUCCESS;
}
2013-3-31 17:43
0
雪    币: 575
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
听说过这种方法,终于见到实现了,顶
2013-4-7 17:57
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
逆的真不咋地,代码还原得一点不好不说,那个vector明明就不是参数啊,这点最关键的都没搞懂。
2013-4-7 19:31
0
雪    币: 224
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
帖子里面贴出的都是F5的代码,还原的实现在zip包里面,最讨厌帖子都没仔细看就乱说的
2013-4-7 21:47
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
包里也一样,还原得不好,例如有些一看是force inline的地方,逆的比F5的好不了多少,很明显程序写得不可能这么乱
2013-4-7 23:31
0
雪    币: 224
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
代码只是拿来测试和验证,没要求那么多,另外真只看出一个地方是FORCEINLINE 还有就给我指出来,我学习下,另外怎么看force inline也给我普及下,逆向平时用的不多,正好提高下
2013-4-8 09:36
0
雪    币: 142
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
正需要这块啊
2014-1-20 10:06
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了,最近需要用到
2014-12-1 16:46
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
挺好的 刚好用到这块
2015-2-6 01:38
0
游客
登录 | 注册 方可回帖
返回
//