我已经开始逆转这部分恶意软件。在某个时候,它创建了一个服务并启动它,然后立即调用函数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结构的信息。

8651d3a8DEVICE_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


评论


这里有很多好的提示!

–fileoffset
2014年3月27日,0:25

#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。可能看起来像这样: