iniwf

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

内核驱动反编译笔记1

转自:http://blog.sina.com.cn/s/blog_541329b40100eyrt.html
内核驱动反编译笔记1

 

所用程序:bz1,bz2

内核驱动反编译后,看看是什么样子,函数调用,全局局部变量,各种循环,数组,数据结构,各种算法都什么样子。

没什么捷径,一个个编写了反编译比对吧。

比对么,先要有个最简单的程序来做标本,所以以下有一个最原始最简单的程序,和一个添加了自定义函数的程序。

 

反汇编一般是在windbg中uf。

也会用win32Asm反汇编,Ida手头没有,反正一样,不能用太智能的。

程序全部是check版本,要free版本的学习,您自己编译了跟踪吧。

至于为什么一定要搞sys文件,呵呵,我喜欢,这不是教学文章,这只是学习过程。

 

开始前要了解一下命令,当然,这些定义有的有多义,先用目前需要的意思:

 

需要掌握:

MOV   赋值    mov     dword ptr [ebp
-8],5   将5赋值给 ebp-8所对应的地址,赋值?对,目前就是赋值 

ADD   加

ret   返回对应return

 

简单了解:

PUSH  入栈  保存一个数据或地址,调用函数前,把接下来要运行的地址先保存好

POP   出栈  函数调用结束,它不知道接下来要运行到哪,只能通过原来PUSH的地址,把它取出来,跳转到那里,取出数据的命令就是POP

SUB   减

 

 

不用了解:

PUSH    ebp        ;esp是栈指针,通过esp可以获得栈内容,所以进入函数时,要先把esp保存在ebp中:mov     ebp,esp

mov     ebp,esp

sub     esp,0Ch    ;如果函数内有局部变量,要开辟堆栈空间,保存局部变量,如果函数内没定义局部变量,则没有这一句。

ret     
8          ;return的同时,处理esp

 

 

 

用来比对的初始简单代码:

 

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)

{

    ULONG x1 
= 5;

    ULONG x2 
= 8;

    ULONG x3 ;

   

   

#if DBG

       _asm 
int 3

#endif

   

   

    x3 
= x1+x2;

   

    DbgPrint(
"Result:%d\n!",x3);

 

   

    driver
->DriverUnload = DriverUnload;

    
return STATUS_SUCCESS;

}


 

 

 

里面有个int 
3,当程序是调试的时候执行就可以自己断下来。

 

光看源程序没用,断下来以后,反编译情况:

 

 

 

 

kd
> uf bz!driverentry

bz
!DriverEntry [d:\mydriver\bz1\bz.c @ 13]:

   
13 f84484b0 8bff            mov     edi,edi

   
13 f84484b2 55              push    ebp

   
13 f84484b3 8bec            mov     ebp,esp

   
13 f84484b5 83ec0c          sub     esp,0Ch

   
14 f84484b8 c745f805000000  mov     dword ptr [ebp-8],5            

   
15 f84484bf c745fc08000000  mov     dword ptr [ebp-4],8

   
20 f84484c6 cc              int     3

   
24 f84484c7 8b45f8          mov     eax,dword ptr [ebp-8]

   
24 f84484ca 0345fc          add     eax,dword ptr [ebp-4]

   
24 f84484cd 8945f4          mov     dword ptr [ebp-0Ch],eax

   
26 f84484d0 8b4df4          mov     ecx,dword ptr [ebp-0Ch]

..

/////////

把汇编代码和C代码对应下:

    ULONG x1 
= 5;   //mov     dword ptr [ebp-8],5

    ULONG x2 
= 8;   //dword ptr [ebp-4],8

    _asm 
int 3      //int 3

    x3 
= x1+x2;     //mov     eax,dword ptr [ebp-8]

                  
//add     eax,dword ptr [ebp-4]

                 

///////////

运行看看:

  

kd
> dd ebp-8   看一下内容

f8286c74  
00000005       //5

 

kd
> dd ebp-4

f8286c78  
00000008       //8

 

 

中断到此:

 

f84404c6 cc              
int     3

kd
> p

bz
!DriverEntry+0x17:

f84404c7 8b45f8          mov     eax,dword ptr [ebp
-8]

kd
> p

bz
!DriverEntry+0x20:

f84404d0 8b4df4          mov     ecx,dword ptr [ebp
-0Ch]

kd
> dd ebp-0ch

f827ac70  0000000d       
//16进制d,十进制13

 

运行结果:

 

kd
> g

Result:
13

 

没什么问题,就把这个作为比较的原始版本。

 

/////////////////////////////////////////////////////

 

 

 

以下是开始添加需要研究的各种东东

 

 

这个程序只添加一个函数:

ULONG MyAdd(ULONG u1,ULONG u2)

{

   ULONG u3;

   u3 
= u1+u2;

   
return u3;

 

}


 

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)

{

    ULONG x1 
= 5;

    ULONG x2 
= 8;

    ULONG x3 ;

   

   

#if DBG

       _asm 
int 3

#endif

   

   

    x3 
= MyAdd(x1,x2);  //使用自定义函数,反汇编看看结果

   

    DbgPrint(
"Result:%d\n!",x3);

 

   

   

    
return STATUS_SUCCESS;

}


接下来看看反汇编以后的代码: 

 

kd
> uf bz2!DriverEntry

bz2
!DriverEntry [d:\mydriver\bz2\bz2.c @ 21]:

   
21 f842e4d0 8bff            mov     edi,edi

   
21 f842e4d2 55              push    ebp

   
21 f842e4d3 8bec            mov     ebp,esp

   
21 f842e4d5 83ec0c          sub     esp,0Ch

   
22 f842e4d8 c745f805000000  mov     dword ptr [ebp-8],5

   
23 f842e4df c745fc08000000  mov     dword ptr [ebp-4],8

   
28 f842e4e6 cc              int     3

   
32 f842e4e7 8b45fc          mov     eax,dword ptr [ebp-4]

   
32 f842e4ea 50              push    eax

   
32 f842e4eb 8b4df8          mov     ecx,dword ptr [ebp-8]

   
32 f842e4ee 51              push    ecx

   
32 f842e4ef e89cffffff      call    bz2!MyAdd (f842e490)

   
32 f842e4f4 8945f4          mov     dword ptr [ebp-0Ch],eax

   
34 f842e4f7 8b55f4          mov     edx,dword ptr [ebp-0Ch]

   
34 f842e4fa 52              push    edx

   
34 f842e4fb 6840e542f8      push    offset bz2! ?? ::FNODOBFM::`string' (f842e540)

   
34 f842e500 e81b000000      call    bz2!DbgPrint (f842e520)

   
34 f842e505 83c408          add     esp,8

   
37 f842e508 8b4508          mov     eax,dword ptr [ebp+8]

   
37 f842e50b c74034b0e442f8  mov     dword ptr [eax+34h],offset bz2!DriverUnload (f842e4b0)

   
38 f842e512 33c0            xor     eax,eax

   
39 f842e514 8be5            mov     esp,ebp

   
39 f842e516 5d              pop     ebp

   
39 f842e517 c20800          ret     8

 

和MyAdd:

    kd
> uf bz2!MyAdd

bz2
!MyAdd [d:\mydriver\bz2\bz2.c @ 5]:

    
5 f842e490 8bff            mov     edi,edi

    
5 f842e492 55              push    ebp

    
5 f842e493 8bec            mov     ebp,esp

    
5 f842e495 51              push    ecx

    
7 f842e496 8b4508          mov     eax,dword ptr [ebp+8]

    
7 f842e499 03450c          add     eax,dword ptr [ebp+0Ch]

    
7 f842e49c 8945fc          mov     dword ptr [ebp-4],eax

    
8 f842e49f 8b45fc          mov     eax,dword ptr [ebp-4]

   
10 f842e4a2 8be5            mov     esp,ebp

   
10 f842e4a4 5d              pop     ebp

   
10 f842e4a5 c20800          ret     8

  

  

显然以下为保存堆栈,指针等上下文:

    
5 f842e490 8bff            mov     edi,edi

    
5 f842e492 55              push    ebp    ;我们可以D ebp,可以看见保存的地址等数值:f842e4f4 00000005 00000008

    
5 f842e493 8bec            mov     ebp,esp

    
5 f842e495 51              push    ecx

   

以下为我们的代码,我们暂时只要关注这里就可以:

    
7 f842e496 8b4508          mov     eax,dword ptr [ebp+8]

    
7 f842e499 03450c          add     eax,dword ptr [ebp+0Ch]

    
7 f842e49c 8945fc          mov     dword ptr [ebp-4],eax

    
8 f842e49f 8b45fc          mov     eax,dword ptr [ebp-4]    //返回值都放在eax中

   

 以下为恢复上下文:

   
10 f842e4a2 8be5            mov     esp,ebp

   
10 f842e4a4 5d              pop     ebp    ;跳到f842e4f4,原来保存的地址

  

其它暂时没看出什么特别的。  

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


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


导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

收藏夹

IT技术

积分与排名

最新评论

阅读排行榜

评论排行榜