DeviceIoControl
,恶意软件在ollydbg下从“暂停”变为“运行”。我进行了一些搜索,并且我知道此功能可与它刚创建的服务进行通信。我怎么知道它的作用?以及如何继续进入ollydbg?还是我必须移至windbg或其他内核模式调试器?#1 楼
您不能从Ollydbg进入内核模式。您需要像windbg
这样的内核调试器,因为ollydbg
是用户模式调试器。 由于提出了这个问题,因此我假设您既没有内核调试连接,也没有驱动程序,如Jonathon回答的那样,控制代码也发送到该驱动程序。
从现在起使用适当的安全措施来处理假定和强调的恶意软件。
我假设您的查询表明您正在
DeviceIoControl
上,因此该恶意软件已经在运行。 br />我将使用ollydbg 2.01。 >现在选择ntdll.ntDeviceIo
并选择ntdll.ntDeviceIoControl
。按F2设置断点,然后按F9运行附加的进程。
INT3 breakpoints, item 0
Address = 7C90D27E NtDeviceIoControlFile
Module = ntdll
Status = Active
Disassembly = MOV EAX, 42
Comment = ntdll.NtDeviceIoControlFile(guessed Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9,Arg10)
Ollydbg应该发送控制代码时中断,堆栈应该如下所示:
已安装windbg可以使此处的操作变得更容易,但是由于它的学习曲线比较陡峭,因此我们暂时不使用windbg。 )-它指向设备:
CPU Stack
Address Value ASCII Comments
0013EF50 [7C801675 u€| ; /RETURN from ntdll.NtDeviceIoControlFile to kernel32.DeviceIoControl+4C
0013EF54 /00000090 ; |Arg1 = 90
0013EF58 |00000000 ; |Arg2 = 0
0013EF5C |00000000 ; |Arg3 = 0
0013EF60 |00000000 ; |Arg4 = 0
0013EF64 |0013EF88 ˆï ; |Arg5 = 13EF88
0013EF68 |83050024 $ ƒ ; |Arg6 = 83050024
0013EF6C |00000000 ; |Arg7 = 0
0013EF70 |00000000 ; |Arg8 = 0
0013EF74 |0013EFEC ìï ; |Arg9 = 13EFEC
0013EF78 |00000004 ; \Arg10 = 4
现在从
follow label
运行Process Explorer。选择未知进程,然后按Ctrl + H使下部窗格显示手柄。选择手柄
DeviceIoControlCode
,右键单击并选择handle
。进程浏览器将显示Ollydbg指出的设备对象的地址。该设备对象是一个文件对象:control code
可以显示0x90
以上的内存(内核模式内存),我们将使用该功能查找与此设备关联的驱动程序了解与您的操作系统相关的
SysInternals
结构。在Windows XP中,您将在文件对象中找到设备对象的地址+4。选择转储窗口,按Ctrl + G并键入地址浏览器显示的地址,即
Handles, item 9
Handle = 00000090
Type = File (dev) <-------- it is a _FILE_OBJECT
Refs = 2.
Access = 0012019F (FILE_GENERIC_READ|FILE_GENERIC_WRITE)
Tag =
Info =
Translated name = \Device\Dbgv
因此,上面粘贴中的
90
指向此文件对象的设备对象。了解
properties
结构。在Windows XP中,驱动程序对象的地址位于设备对象+8。之后按Ctrl + G-> ollydbg 2.01
,如先前所做的863c87f0 and follow expression
CPU Dump
Address Hex dump ASCII
863C87F0 05 00 70 00|A8 D3 51 86|00 00 00 00|00 00 00 00| p ¨ÓQ†
注意
0x7fffffff
是驱动程序目的。阅读有关FILE_OBJECT
结构的信息。8651d3a8
和DEVICE_OBJECT
->按Ctrl + G组合: follow expression
。按Ctrl + G组合:到
86f12c48
,右键单击-> DRIVER_OBJECT
->将字节复制并粘贴到任何十六进制编辑器(例如HxD)中的新文件中,并将其另存为+0xc is Driver Start
:) > 您现在可以静态地分析驱动程序。可能是XP中Driverobject的
+0x10 is Driver Size
。对于此特定驱动程序,a92a3000
位于CPU Dump
Address Hex dump ASCII
8651D3A8 03 00 B8 00|01 00 00 00|48 2C F1 86|00 00 00 00| ¸ H,ñ†
您可以在ollydbg中关注并反汇编此内存。选择cpu dump press ctrl + g可以分解未知驱动程序
CPU Dump
Address Hex dump ASCII
86F12C48 04 00 A8 00|A8 D3 51 86|12 00 00 00|00 30 2A A9| ¨ ¨ÓQ† 0*©
86F12C58 00 3D 00 00|48 9C D8 86|F0 2C F1 86|18 00 18 00| = HœØ†ð,ñ†
这里处理了ioctl代码: br /> ===========
CPU Dump
Address Hex dump ASCII
A92A3000 4D 5A 90 00|03 00 00 00|04 00 00 00|FF FF 00 00| MZ ÿÿ
A92A3010 B8 00 00 00|00 00 00 00|40 00 00 00|00 00 00 00| ¸ @
控制代码完成此工作,并在某些情况下发送一些320
/>
foo:\>dir malwaredriver.sys
26/03/2014 14:04 15,616 malwaredriver.sys
\>set /a 0x3d00
15616
\>file malwaredriver.sys
malwaredriver.sys; PE32 executable for MS Windows (native) Intel 80386 32-bit
:\>
此处分析的驱动程序是dbgview(dbgv.sys)从SysInternals加载的驱动程序。此控制代码检查内存中加载的驱动程序的不兼容版本。可以使用特定的驱动程序和特定的版本来进行后续操作:如下所示的命令
CPU Dump
Address Value ASCII Comments
86F12CB8 A92A4168 hA*©
上述命令的说明如下
CPU Disasm
Address Command Comments
A92A4168 MOV EDI, EDI ; IRP_MJ_DEVICE_IO_CONTROL_HANDLER(pdevob,pirp)
A92A416A PUSH EBP
A92A416B MOV EBP, ESP
A92A416D SUB ESP, 24
A92A4170 PUSH EBX
A92A4171 PUSH ESI
A92A4172 MOV ESI, DWORD PTR SS:[EBP+0C] ; irp
A92A4175 MOV EAX, DWORD PTR DS:[ESI+60] ; nt!_irp -y Tail.overlay.cur->maj
A92A4178 MOV EDX, DWORD PTR DS:[ESI+0C] ; nt!_irp Tail.overlay.cur->par.DeviceIo.ty
A92A417B XOR EBX, EBX
A92A417D PUSH EDI
A92A417E LEA EDI, [ESI+18]
A92A4181 MOV DWORD PTR DS:[EDI], EBX
A92A4183 MOV DWORD PTR DS:[ESI+1C], EBX
A92A4186 MOVZX ECX, BYTE PTR DS:[EAX]
A92A4189 SUB ECX, EBX
A92A418B JE SHORT A92A41F7 ; case 0 create
A92A418D DEC ECX
A92A418E DEC ECX
A92A418F JE SHORT A92A41CA ; case 2 close
A92A4191 SUB ECX, 0C
A92A4194 JNE A92A42BB ; unhandled
A92A419A MOV ECX, DWORD PTR DS:[EAX+0C] ; ioctl
A92A419D MOV EBX, ECX
A92A419F AND EBX, 00000003
A92A41A2 CMP BL, 3
A92A41A5 JNE SHORT A92A41AC ; buff align
A92A41A7 MOV EBX, DWORD PTR DS:[ESI+3C]
A92A41AA JMP SHORT A92A41AE
A92A41AC MOV EBX, EDX ; inbuff
A92A41AE PUSH DWORD PTR SS:[EBP+8] ; devobj
A92A41B1 PUSH EDI
A92A41B2 PUSH ECX
A92A41B3 PUSH DWORD PTR DS:[EAX+4] ; bufflen
A92A41B6 PUSH EBX
A92A41B7 PUSH DWORD PTR DS:[EAX+8] ; ioctlcode
A92A41BA PUSH EDX
A92A41BB PUSH 1
A92A41BD PUSH DWORD PTR DS:[EAX+18] ; fobj
A92A41C0 CALL A92A3EEC ; actual_handler
#2 楼
更具体地说,听起来您的可执行文件正在加载设备驱动程序。用户空间可执行文件通常通过IOCTL(或I / O控件)与驱动程序进行通信。DeviceIoControl
只是这样做:将IOCTL发送给驱动程序。注意此函数的第二个参数:DWORD dwIoControlCode
。这是标识程序请求驱动程序执行的IOCTL的代码。它只是一个32位DWORD值。现在,在驱动程序方面,您需要了解一些事情。 (准备通过一些结构游泳!)
第一次加载驱动程序时,将调用其
DriverEntry
函数。传递给驱动程序DRIVER_OBJECT
的指针。在此结构中,有一个名为MajorFunction
的数组,这是一组函数指针,当用户空间尝试对驱动程序进行某些操作(例如打开,关闭或发送IOCTL)时,内核将调用该函数指针。这些功能由IRP主要功能代码标识。对于由
DeviceIoControl
发送的ioctl,将调用IRP_MJ_DEVICE_CONTROL
函数。任何ioctl都会调用此函数。现在,要确定将哪个dwIoControlCode
传递给DeviceIoControl
,ioctl处理函数将查看Parameters.DeviceIoControl.IoControlCode
。 br /> 因此,首先,您要将
.sys
驱动程序加载到IDA中。 IDA标记为DriverEntry
的功能实际上是DDK生成的包装器。实际的DriverEntry
通常是此存根末尾的jmp
。可能看起来像这样:
评论
这里有很多好的提示!
–fileoffset
2014年3月27日,0:25