免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 各类编程 > 绕过主动防御调用NdisRegisterProtocol(2)

绕过主动防御调用NdisRegisterProtocol(2)

时间:2012-01-12 18:50来源:未知 整理:寂涯网络 点击:


      ProtocolCharacteris->Name.Length + 0xC6, 
      'bpDN');
 RtlZeroMemory(&p_protocol->ProtocolCharacteristics, 
   ProtocolCharacteris->Name.Length + size); 
 RtlCopyMemory(&(p_protocol->ProtocolCharacteristics), 
   ProtocolCharacteris, 
   size);
 //Upcase协议名
 p_protocol->ProtocolCharacteristics.Name.Buffer =
(PVOID)((ULONG)p_protocol+0xc4);
 RtlUpcaseUnicodeString(&p_protocol->ProtocolCharacteristics.Name, 
     &ProtocolCharacteris->Name, 
     FALSE);
  在 NdisRegisterProtocol 中先申请了一片非分页内存,用来保存
NDIS_PROTOCOL_BLOCK 结构,NDIS_PROTOCOL_BLOCK 的大小是 0xC4,但却分配了 0xC6+
Name.Length个内存,结构本代码段的最后两句代码,笔者猜测是NdisRegisterProtocol
把协议名保存在 NDIS_PROTOCOL_BLOCK 结构后面,并且用 0x2 个“00”来截断
UNICODE_STRING。
 2.   
p_protocol->WorkItem.WorkerRoutine = g_ndisCheckProtocolBindings;
 p_protocol->WorkItem.Parameter = p_protocol;
 p_protocol->WorkItem.List.Flink = NULL;
  KeInsertQueue(g_ndisWorkerQueue, &(p_protocol->WorkItem));
  这一部分设置了 WorkerRoutine 为 ndisCheckProtocolBindings,之后用
KeInsertQueue 把本协议块的 WorkItem 加入到 ndisWorkerQueue 中,之后 NDIS 会创建
一个 ndisWorkerThread 线程,然后以 WorkItem.Parameter 为参数调用
WorkItem.WorkerRoutine ,即  ndisCheckProtocolBindings 。对于
ndisCheckProtocolBindings笔者没有进行分析,望有分析出来的读者,能跟笔者交流。 
3.
 KeAcquireSpinLock(g_ndisProtocolListLock, &OldIrql);
  p_protocol->NextProtocol = *(ULONG*)g_ndisProtocolList;

*(ULONG*)g_ndisProtocolList = p_protocol;     
 KeReleaseSpinLock(g_ndisProtocolListLock, OldIrql);
 ObReferenceObject(g_ndisDriverObject);
 //ndisReferenceRef的实现
 KeAcquireSpinLock(p_protocol->Ref.SpinLock, &OldIrql);
 if (p_protocol->Ref.Closing != 0) {
  //NOTHING
 } else {
  p_protocol->Ref.ReferenceCount++;
  if ( p_protocol->Ref.ReferenceCount == 0 ) {
   p_protocol->Ref.ReferenceCount = p_protocol->Ref.ReferenceCount
|| 0xffff;
  }
  }

KeReleaseSpinLock(p_protocol->Ref.SpinLock, OldIrql);
  这部分就是关键的部分了,先申请自旋锁,用来解决并发的问题,最后对链表进行设置,
然后对 ndis 的驱动对象增加了一个引用计数,后面即是 ndisReferenceRef函数的实现了。 
  到这里,NdisRegisterProtocol 的代码就讲解完了。可以发现,其实代码
NdisRegisterProtocol 的代码很简单,这一方面方便了我们自己实现
NdisRegisterProtocol,但如果读者仔细观看了代码后,会发现有很多g_*的变量,这些都
是 NDIS.SYS中的变量,在NdisRegisterProtocol要对这些变量进行操作或者使用。这许多
的 g_*变量,就是导致本方法比较难做到通用的原因。那么如何得到这些变量呢?在
IDA+windbg 的帮助下,笔者发现 NdisDeregisterProtocol 、 DriverEntry 和
NdisReEnumerateProtocolBindings 中有所有这些 g_*变量,那些就要在这些函数进行特征
码搜索从而得到相应的变量。由于本文提供的只是一个示例的代码,所以使用了硬编码来得
到相应变量。 
  在 NdisDeregisterProtocol 中可以得到 ndisProtocolList、ndisProtocolListLock
和ndisPkgs,其中 ndisPkgs在前面没有讲过,读者可以参见附件中的代码,下面给出取得
变量的代码:

__declspec(naked) 
VOID 
GetNdisDeregisterProtocol(PULONG routine_addr)
{
 __asm
 {
  push ebp
  mov ebp, esp
  push eax
  push ebx
  call lab_1
  call NdisDeregisterProtocol
 lab_1: 
pop ebx

mov eax, [ebx+1]
  add ebx, 5
  add ebx, eax
  mov eax, [ebx]
  mov ebx, routine_addr
  mov [ebx], eax
  pop ebx
  pop eax
  mov esp, ebp
  pop ebp
  ret 4
 }

VOID 
get_list_lock_pkg_addr(PULONG list_addr,
  PULONG lock_addr,

本页地址 http://www.jybase.net/biancheng/20120112748.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com