iniwf

风是温柔的,雨是伤心的,云是快乐的,月是多情的,爱是迷失的,恋是醉人的,情是难忘的,天是长久的,地是永恒的

内核反编译学习笔记5

其实这是以前内容的复习,另外再通过dt 数据来获取结构和偏移量,手工在windbg中查看信息

程序:bz6

以前的驱动程序简直毫无驱动的样子,现在用个稍微健全的例子:

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
 NTSTATUS status;
 
#if DBG
       _asm int 3
#endif

 driver->DriverUnload = DriverUnload;
 
 status = CreateDevice(driver);
 
 Dump(driver);
 
 return status;
}

CreateDevice(driver)是自定义函数,用来真正建立一个驱动设备。返回一个status,猜猜看,我们能不能在eax中读取返回值。

反汇编先:
kd> uf bz6!driverentry
bz6!DriverEntry [d:\mydriver\bz6\bz6.c @ 110]:
  110 f8428680 8bff            mov     edi,edi
  110 f8428682 55              push    ebp
  110 f8428683 8bec            mov     ebp,esp
  110 f8428685 51              push    ecx
  114 f8428686 cc              int     3
  121 f8428687 8b4508          mov     eax,dword ptr [ebp+8]
  121 f842868a c74034d08442f8  mov     dword ptr [eax+34h],offset bz6!DriverUnload (f84284d0)
  123 f8428691 8b4d08          mov     ecx,dword ptr [ebp+8]
  123 f8428694 51              push    ecx
  123 f8428695 e876fdffff      call    bz6!CreateDevice (f8428410)
  123 f842869a 8945fc          mov     dword ptr [ebp-4],eax
  125 f842869d 8b5508          mov     edx,dword ptr [ebp+8]
  125 f84286a0 52              push    edx
  125 f84286a1 e8aafeffff      call    bz6!Dump (f8428550)
  127 f84286a6 8b45fc          mov     eax,dword ptr [ebp-4]
  128 f84286a9 8be5            mov     esp,ebp
  128 f84286ab 5d              pop     ebp
  128 f84286ac c20800          ret     8

我们在源程序或Disassembly窗口在调用处F9下断,按g运行:

kd> g
Breakpoint 0 hit
bz6!DriverEntry+0x15:
f8428695 e876fdffff      call    bz6!CreateDevice (f8428410)
kd> d eax
81e64f38  04 00 a8 00 00 00 00 00-02 00 00 00 00 80 42 f8  ..............B.
81e64f48  00 0c 00 00 b8 f3 d5 81-e0 4f e6 81 16 00 16 00

没错,返回值是04。

Dump(driver)是显示driver和device的一个函数,里面有个循环。
我们看看非玩具状态(呵呵,以前的函数毫无实用价值)下反汇编以后是什么样子。

void Dump(IN PDRIVER_OBJECT pDriverObject)
{
 ULONG i=1;
 PDEVICE_OBJECT pDevice = pDriverObject->DeviceObject;
 KdPrint(("----------------------------------------------\n"));
 KdPrint(("Begin Dump...\n"));
 KdPrint(("Driver Address:0X%08X\n",pDriverObject));
 KdPrint(("Driver name:%wZ\n",&pDriverObject->DriverName));
 KdPrint(("Driver HardwareDatabase:%wZ\n",pDriverObject->HardwareDatabase));
 KdPrint(("Driver first device:0X%08X\n",pDriverObject->DeviceObject));
 
 
 
 for (;pDevice!=NULL;pDevice = pDevice->NextDevice)
 {
  KdPrint(("The %d device\n",i++));
  KdPrint(("Device AttachedDevice:0X%08X\n",pDevice->AttachedDevice));
  KdPrint(("Device NextDevice:0X%08X\n",pDevice->NextDevice));
  KdPrint(("Device StackSize:%d\n",pDevice->StackSize));
  KdPrint(("Device's DriverObject:0X%08X\n",pDevice->DriverObject));
 }
 
 KdPrint(("Dump over!\n"));
 KdPrint(("----------------------------------------------\n"));
}

////////////////////////////////////
反汇编:
kd> uf bz6!dump
bz6!Dump [d:\mydriver\bz6\bz6.c @ 82]:
   82 f8428550 8bff            mov     edi,edi
   82 f8428552 55              push    ebp
   82 f8428553 8bec            mov     ebp,esp
   82 f8428555 83ec0c          sub     esp,0Ch
   83 f8428558 c745f801000000  mov     dword ptr [ebp-8],1
   84 f842855f 8b4508          mov     eax,dword ptr [ebp+8]
   84 f8428562 8b4804          mov     ecx,dword ptr [eax+4]
   84 f8428565 894dfc          mov     dword ptr [ebp-4],ecx
   85 f8428568 68608842f8      push    offset bz6! ?? ::FNODOBFM::`string' (f8428860)
   85 f842856d e842010000      call    bz6!DbgPrint (f84286b4)
   85 f8428572 83c404          add     esp,4
   86 f8428575 68508842f8      push    offset bz6! ?? ::FNODOBFM::`string' (f8428850)
   86 f842857a e835010000      call    bz6!DbgPrint (f84286b4)
   86 f842857f 83c404          add     esp,4
   87 f8428582 8b5508          mov     edx,dword ptr [ebp+8]
   87 f8428585 52              push    edx
   87 f8428586 68308842f8      push    offset bz6! ?? ::FNODOBFM::`string' (f8428830)
   87 f842858b e824010000      call    bz6!DbgPrint (f84286b4)
   87 f8428590 83c408          add     esp,8
   88 f8428593 8b4508          mov     eax,dword ptr [ebp+8]
   88 f8428596 83c01c          add     eax,1Ch
   88 f8428599 50              push    eax
   88 f842859a 68108842f8      push    offset bz6! ?? ::FNODOBFM::`string' (f8428810)
   88 f842859f e810010000      call    bz6!DbgPrint (f84286b4)
   88 f84285a4 83c408          add     esp,8
   89 f84285a7 8b4d08          mov     ecx,dword ptr [ebp+8]
   89 f84285aa 8b5124          mov     edx,dword ptr [ecx+24h]
   89 f84285ad 52              push    edx
   89 f84285ae 68f08742f8      push    offset bz6! ?? ::FNODOBFM::`string' (f84287f0)
   89 f84285b3 e8fc000000      call    bz6!DbgPrint (f84286b4)
   89 f84285b8 83c408          add     esp,8
   90 f84285bb 8b4508          mov     eax,dword ptr [ebp+8]
   90 f84285be 8b4804          mov     ecx,dword ptr [eax+4]
   90 f84285c1 51              push    ecx
   90 f84285c2 68d08742f8      push    offset bz6! ?? ::FNODOBFM::`string' (f84287d0)
   90 f84285c7 e8e8000000      call    bz6!DbgPrint (f84286b4)
   90 f84285cc 83c408          add     esp,8
   90 f84285cf eb09            jmp     bz6!Dump+0x8a (f84285da)

bz6!Dump+0x81 [d:\mydriver\bz6\bz6.c @ 94]:
   94 f84285d1 8b55fc          mov     edx,dword ptr [ebp-4]
   94 f84285d4 8b420c          mov     eax,dword ptr [edx+0Ch]
   94 f84285d7 8945fc          mov     dword ptr [ebp-4],eax

bz6!Dump+0x8a [d:\mydriver\bz6\bz6.c @ 94]:
   94 f84285da 837dfc00        cmp     dword ptr [ebp-4],0
   94 f84285de 7476            je      bz6!Dump+0x106 (f8428656)

bz6!Dump+0x90 [d:\mydriver\bz6\bz6.c @ 96]:
   96 f84285e0 8b4df8          mov     ecx,dword ptr [ebp-8]
   96 f84285e3 894df4          mov     dword ptr [ebp-0Ch],ecx
   96 f84285e6 8b55f4          mov     edx,dword ptr [ebp-0Ch]
   96 f84285e9 52              push    edx
   96 f84285ea 68c08742f8      push    offset bz6! ?? ::FNODOBFM::`string' (f84287c0)
   96 f84285ef e8c0000000      call    bz6!DbgPrint (f84286b4)
   96 f84285f4 83c408          add     esp,8
   96 f84285f7 8b45f8          mov     eax,dword ptr [ebp-8]
   96 f84285fa 83c001          add     eax,1
   96 f84285fd 8945f8          mov     dword ptr [ebp-8],eax
   97 f8428600 8b4dfc          mov     ecx,dword ptr [ebp-4]
   97 f8428603 8b5110          mov     edx,dword ptr [ecx+10h]
   97 f8428606 52              push    edx
   97 f8428607 68a08742f8      push    offset bz6! ?? ::FNODOBFM::`string' (f84287a0)
   97 f842860c e8a3000000      call    bz6!DbgPrint (f84286b4)
   97 f8428611 83c408          add     esp,8
   98 f8428614 8b45fc          mov     eax,dword ptr [ebp-4]
   98 f8428617 8b480c          mov     ecx,dword ptr [eax+0Ch]
   98 f842861a 51              push    ecx
   98 f842861b 68808742f8      push    offset bz6! ?? ::FNODOBFM::`string' (f8428780)
   98 f8428620 e88f000000      call    bz6!DbgPrint (f84286b4)
   98 f8428625 83c408          add     esp,8
   99 f8428628 8b55fc          mov     edx,dword ptr [ebp-4]
   99 f842862b 0fbe4230        movsx   eax,byte ptr [edx+30h]
   99 f842862f 50              push    eax
   99 f8428630 68608742f8      push    offset bz6! ?? ::FNODOBFM::`string' (f8428760)
   99 f8428635 e87a000000      call    bz6!DbgPrint (f84286b4)
   99 f842863a 83c408          add     esp,8
  100 f842863d 8b4dfc          mov     ecx,dword ptr [ebp-4]
  100 f8428640 8b5108          mov     edx,dword ptr [ecx+8]
  100 f8428643 52              push    edx
  100 f8428644 68408742f8      push    offset bz6! ?? ::FNODOBFM::`string' (f8428740)
  100 f8428649 e866000000      call    bz6!DbgPrint (f84286b4)
  100 f842864e 83c408          add     esp,8
  101 f8428651 e97bffffff      jmp     bz6!Dump+0x81 (f84285d1)

bz6!Dump+0x106 [d:\mydriver\bz6\bz6.c @ 103]:
  103 f8428656 68308742f8      push    offset bz6! ?? ::FNODOBFM::`string' (f8428730)
  103 f842865b e854000000      call    bz6!DbgPrint (f84286b4)
  103 f8428660 83c404          add     esp,4
  104 f8428663 68608842f8      push    offset bz6! ?? ::FNODOBFM::`string' (f8428860)
  104 f8428668 e847000000      call    bz6!DbgPrint (f84286b4)
  104 f842866d 83c404          add     esp,4
  105 f8428670 8be5            mov     esp,ebp
  105 f8428672 5d              pop     ebp
  105 f8428673 c20400          ret     4


/////////////
我们简单数下源程序中的KdPrint,再比较call,6个call以后开始循环:
   94 f84285da 837dfc00        cmp     dword ptr [ebp-4],0
   94 f84285de 7476            je      bz6!Dump+0x106 (f8428656)
   ........
  
  
 //////
 开始手工看数据啦~~~
  
   我们可以dt _driver_object来看数据结构
  
   kd> dt _driver_object
ntdll!_DRIVER_OBJECT
   +0x000 Type             : Int2B
   +0x002 Size             : Int2B
   +0x004 DeviceObject     : Ptr32 _DEVICE_OBJECT
   +0x008 Flags            : Uint4B
   +0x00c DriverStart      : Ptr32 Void
   +0x010 DriverSize       : Uint4B
   +0x014 DriverSection    : Ptr32 Void
   +0x018 DriverExtension  : Ptr32 _DRIVER_EXTENSION
   +0x01c DriverName       : _UNICODE_STRING
   +0x024 HardwareDatabase : Ptr32 _UNICODE_STRING
   +0x028 FastIoDispatch   : Ptr32 _FAST_IO_DISPATCH
   +0x02c DriverInit       : Ptr32     long
   +0x030 DriverStartIo    : Ptr32     void
   +0x034 DriverUnload     : Ptr32     void
   +0x038 MajorFunction    : [28] Ptr32     long

显然是driver_object+10会得到DriverSize,那我们手工查看一下。

从反汇编窗口其实已经在代码后有提示了。
我们dd ebp+8可以获得driver_object的地址,在这个地址上+10(dd driver_object地址+10就可以了,当然也可以直接dd 算好的地址):
kd> dd 81e64f38+10
81e64f48  00000c00 81d5f3b8 81e64fe0 00160016

我们还可以进循环,看device_object的具体情况,先看下结构:

kd> dt _device_object
ntdll!_DEVICE_OBJECT
   +0x000 Type             : Int2B
   +0x002 Size             : Uint2B
   +0x004 ReferenceCount   : Int4B
   +0x008 DriverObject     : Ptr32 _DRIVER_OBJECT
   +0x00c NextDevice       : Ptr32 _DEVICE_OBJECT
   +0x010 AttachedDevice   : Ptr32 _DEVICE_OBJECT
   +0x014 CurrentIrp       : Ptr32 _IRP
   +0x018 Timer            : Ptr32 _IO_TIMER
   +0x01c Flags            : Uint4B
   +0x020 Characteristics  : Uint4B
   +0x024 Vpb              : Ptr32 _VPB
   +0x028 DeviceExtension  : Ptr32 Void
   +0x02c DeviceType       : Uint4B
   +0x030 StackSize        : Char
   +0x034 Queue            : __unnamed
   +0x05c AlignmentRequirement : Uint4B
   +0x060 DeviceQueue      : _KDEVICE_QUEUE
   +0x074 Dpc              : _KDPC
   +0x094 ActiveThreadCount : Uint4B
   +0x098 SecurityDescriptor : Ptr32 Void
   +0x09c DeviceLock       : _KEVENT
   +0x0ac SectorSize       : Uint2B
   +0x0ae Spare1           : Uint2B
   +0x0b0 DeviceObjectExtension : Ptr32 _DEVOBJ_EXTENSION
   +0x0b4 Reserved         : Ptr32 Void

在循环中下断,进去看数据:
kd> dd 81d23b28
81d23b28  00cc0003 00000000 81e64f38 00000000

对照看看:
+0x000 Type             : Int2B   00cc0003中的03
+0x002 Size             : Uint2B  00cc0003中的cc

一般来说,如果内存中涉及堆栈,那么堆中放数据,栈中放数据指针......反正就这么慢慢看吧。

posted on 2010-04-18 19:25 iniwf 阅读(316) 评论(0)  编辑 收藏 引用 所属分类: 驱动反汇编


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

收藏夹

IT技术

积分与排名

最新评论

阅读排行榜

评论排行榜