能力值:
( LV9,RANK:1210 )
|
-
-
|
能力值:
( LV9,RANK:1210 )
|
-
-
|
能力值:
( LV9,RANK:1210 )
|
-
-
|
能力值:
( LV9,RANK:1210 )
|
-
-
[讨论]内核重载的一些思路和疑惑
以前玩过,供参考:
导入函数是解析ntoskrnl导入表填充,肯定要处理。
至于重定位,保守点可以都定位到原始内核,缺点是有时候仍会到执行旧代码。
老V提到过可根据不同区段处理,“你懂的”,我没懂,汗。
我这么弄的: 若重定位项引用的目的地址所在区段为IMAGE_SCN_CNT_CODE,即认为是
代码,使用重载内核定位,定位到重载内核。如:
PAGE:004F9FE3 68 98 9F 4F 00 push offset PsExitSpecialApc(x,x,x,x,x)
PsExitSpecialApc所在的PAGE区段可执行,用重载内核。 例外:
1) 异常处理函数必须定位到原内核:
XpSP2异常分发代码:
KiDispatchException ->
RtlDispatchException ->
RtlIsValidHandler -> ;检测RegistrationPointer->Handler
RtlLookupFunctionTable ;在PsLoadedModuleList搜索Handler所在模块
Handler在xp下为_except_handler3,若定位到重载内核会导致检测失败,SEH不能正常工作. 2) 个别回调函数要处理下,Win7下MiniPacketCallback可能在驱动卸载后执行,不能定位到重加载内核。 可能还有别的问题,我当时只搞了这些。
|
能力值:
( LV9,RANK:1210 )
|
-
-
[翻译]一步一步逆向分析黑色样本:ZeroAccess/ Max++/ Smiscer Crimeware rootkit
这篇教程第二部分有一点错误:“如你所见的,在这段代码块中,整个分发流程的判断部分基于的是CurrentStackLocation 的值。”
大概是这样的:
.text:10006E90 FltDeviceDispatch proc near
.text:10006E90
.text:10006E90 fltDevice = dword ptr 4
.text:10006E90 Irp = dword ptr 8
.text:10006E90
.text:10006E90 mov eax, [esp+fltDevice] ;
.text:10006E94 mov ecx, [eax+DEVICE_OBJECT.DeviceExtension]
.text:10006E97 push ebp
.text:10006E98 mov ebp, [ecx+FLTEXT.LowerDeviceObject]
.text:10006E9B push esi
.text:10006E9C mov esi, [esp+8+Irp]
.text:10006EA0 push edi
.text:10006EA1 mov edi, [esi+60h]
.text:10006EA4 mov al, [edi+IO_STACK_LOCATION.MajorFunction]
.text:10006EA6 cmp al, IRP_MJ_POWER
.text:10006EA8 jnz short loc_10006EC6
.text:10006EA8
.text:10006EAA push esi ; Irp
.text:10006EAB call ds:PoStartNextPowerIrp
.text:10006EAB
.text:10006EB1 inc byte ptr [esi+23h]
.text:10006EB4 add dword ptr [esi+60h], 24h
.text:10006EB8 push esi ; Irp
.text:10006EB9 push ebp ; DeviceObject
.text:10006EBA call ds:PoCallDriver
.text:10006EBA
.text:10006EC0 pop edi
.text:10006EC1 pop esi
.text:10006EC2 pop ebp
.text:10006EC3 retn 8
.text:10006EC3
.text:10006EC6 ; ---------------------------------------------------------------------------
.text:10006EC6
.text:10006EC6 loc_10006EC6: ; CODE XREF: FltDeviceDispatch+18j
.text:10006EC6 push ebx
.text:10006EC7 mov [edi+IO_STACK_LOCATION.DeviceObject], ebp
.text:10006ECA cmp al, IRP_MJ_INTERNAL_DEVICE_CONTROL
.text:10006ECC jnz short PassThru
.text:10006ECC
.text:10006ECE mov eax, [edi+IO_STACK_LOCATION.Parameters.Scsi.Srb]
.text:10006ED1 cmp [eax+SCSI_REQUEST_BLOCK.Function], SRB_FUNCTION_EXECUTE_SCSI
.text:10006ED5 jnz short PassThru
.text:10006ED5
.text:10006ED7 mov cl, [eax+SCSI_REQUEST_BLOCK.Cdb]
.text:10006EDA movzx edx, cl
.text:10006EDD sub edx, SCSIOP_READ
.text:10006EE0 jz short ReadWrite
.text:10006EE0
.text:10006EE2 sub edx, 2 ; SCSIOP_WRITE
.text:10006EE5 jnz short PassThru
.text:10006EE5
.text:10006EE7
.text:10006EE7 ReadWrite: ; CODE XREF: FltDeviceDispatch+50j
.text:10006EE7 xor edx, edx
.text:10006EE9 cmp cl, SCSIOP_WRITE
.text:10006EEC mov ecx, [eax+SCSI_REQUEST_BLOCK.DataTransferLength]
.text:10006EEF setz dl
.text:10006EF2 push edx ; int
.text:10006EF3 mov edx, [eax+SCSI_REQUEST_BLOCK.DataBuffer]
.text:10006EF6 mov eax, [esi+IRP.MdlAddress]
.text:10006EF9 push ecx ; int
.text:10006EFA mov ecx, [edi+IO_STACK_LOCATION.Context] ;
.text:10006EFA ; 参考CLASSPNP!SubmitTransferPacket:
.text:10006EFA ;
.text:10006EFA ; IoSetCompletionRoutine(Pkt->Irp, TransferPktComplete, Pkt, TRUE, TRUE, TRUE);
.text:10006EFA ; return IoCallDriver(nextDevObj, Pkt->Irp);
.text:10006EFA ;
.text:10006EFA ; 即context为PTRANSFER_PACKET类型。
.text:10006EFA ; ;
.text:10006EFD push edx ; int
.text:10006EFE push eax ; MdlAddress
.text:10006EFF mov eax, [ecx+TRANSFER_PACKET.OriginalIrp] ;
.text:10006F02 push edi ; irpSp
.text:10006F03 call FilterRequest
.text:10006F03
.text:10006F08 mov ebx, eax
.text:10006F0A test ebx, ebx
.text:10006F0C jge short PassThru
.text:10006F0C
.text:10006F0E mov dl, 1 ; PriorityBoost
.text:10006F10 mov ecx, esi ; Irp
.text:10006F12 mov [esi+IRP.IoStatus.anonymous_0.Status], ebx
.text:10006F15 mov [esi+IRP.IoStatus.Information], 0
.text:10006F1C call ds:IofCompleteRequest
.text:10006F1C
.text:10006F22 mov eax, ebx
.text:10006F24 pop ebx
.text:10006F25 pop edi
.text:10006F26 pop esi
.text:10006F27 pop ebp
.text:10006F28 retn 8
.text:10006F28
.text:10006F2B ; ---------------------------------------------------------------------------
.text:10006F2B
.text:10006F2B PassThru: ; CODE XREF: FltDeviceDispatch+3Cj
.text:10006F2B ; FltDeviceDispatch+45j
.text:10006F2B ; FltDeviceDispatch+55j
.text:10006F2B ; FltDeviceDispatch+7Cj
.text:10006F2B movzx edx, [edi+IO_STACK_LOCATION.MajorFunction]
.text:10006F2E mov eax, [ebp+DEVICE_OBJECT.DriverObject]
.text:10006F31 mov ecx, [eax+edx*4+38h]
.text:10006F35 push esi
.text:10006F36 push ebp
.text:10006F37 call ecx
.text:10006F37
.text:10006F39 pop ebx
.text:10006F3A pop edi
.text:10006F3B pop esi
.text:10006F3C pop ebp
.text:10006F3D retn 8
.text:10006F3D
.text:10006F3D FltDeviceDispatch endp
如果是读写请求,则取TRANSFER_PACKET.OriginalIrp,在10006F03的调用是个对IO_STACK_LOCATION的回溯,
找到栈顶irpSp->FileObject,构造Irp取文件全路径计算Hash,检测是否读写RK驱动文件,如果是,则对读请求
返回原始数据,写请求则仍然写入RK的东西。
大概是这么个意思,记不清楚了。
|
能力值:
( LV9,RANK:1210 )
|
-
-
|
能力值:
( LV9,RANK:1210 )
|
-
-
|
能力值:
( LV9,RANK:1210 )
|
-
-
|
能力值:
( LV9,RANK:1210 )
|
-
-
|
能力值:
( LV9,RANK:1210 )
|
-
-
|
能力值:
( LV9,RANK:1210 )
|
-
-
|
能力值:
( LV9,RANK:1210 )
|
-
-
[原创][原创]用DEP实现BreakOnExecute
嗯,是我写得太潦草了,再加几句说明: 跟OllyBone要做的事情一样,只是用的PTE的NX位,需要打开PAE。一般机器的DEP都是开着的,就在PAE下。
但做的标记会被清除掉,所以挂KeInterlockedSwapPte,在这把标记再置回去。大概就这意思。
deroko以前的DOER,也不好用。后来的xTracer更好,但我没读过。
|
能力值:
( LV9,RANK:1210 )
|
-
-
|