首页
社区
课程
招聘
[旧帖] [求助]程序刚开始运行时esp指向的内容是指向PE文件头的IMAGE_DOS_HEADERS? 0.00雪花
发表于: 2009-2-20 17:27 3870

[旧帖] [求助]程序刚开始运行时esp指向的内容是指向PE文件头的IMAGE_DOS_HEADERS? 0.00雪花

2009-2-20 17:27
3870
刚刚学习本论坛的精华帖子http://bbs.pediy.com/showthread.php?t=51357 它一开始来了这么一句:
invoke  _GetKernelBase,[esp]
从后面的定义来看,好像[esp]指向PE文件头,不知是不是这样
函数定义如下
_GetKernelBase                          proc  _dwKernelRet                                                                     
                      local  @dwReturn
                                                                                                         
                      pushad                                                                                             
                      mov  @dwReturn,0                                                                                    
                                                     
                      call  @F                                                                                            
                      @@:                                                                                                
                                               pop  ebx                                                                                            
                                                                       sub  ebx,offset @B                                                                                                        
                                 
                                                                      mov  edi,_dwKernelRet                                                                              
                                                                      and  edi,0ffff0000h                                                                                 
                                                                      .while  TRUE                                                                                       
                                                                          .if  WORD  ptr [edi] == IMAGE_DOS_SIGNATURE                                                      
                                                                            mov  esi,edi                                                                                    
                                                                            add  esi,[esi+003ch]                                                                           
                                                                            .if WORD  ptr [esi] == IMAGE_NT_SIGNATURE                                                      
                                                                                      mov  @dwReturn,edi                                                                           
                                                                                      .break                                                                                       
                                                                            .endif                                                                                          
                                                                          .endif                                                                                            
                                                                          sub  edi,010000h                                                                                 
                                                                          .break  .if edi < 070000000h                                                                       .endw                                                                                               
                                                                      popad                                                                                               
                                                                      mov  eax,@dwReturn                                                                                 
                                                                      ret                                                                                                
_GetKernelBase                          endp

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
应该不是这样的,程序载入后[esp]是在kernel32.dll领空
mov edi,_dwKernelRet
and edi,0ffff0000h

根据这个结果再按如下跨度
sub edi,010000h

搜索就很快能找到kernel32.dll的加载基址了

我的理解,仅供参考
2009-2-20 18:05
0
雪    币: 75
活跃值: (623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
多谢楼上                       
  .if  WORD  ptr [edi] == IMAGE_DOS_SIGNATURE ;这里好像就是找PE文件头的IMAGE_DOS_HEADERS的第一个字                                                      
                            mov  esi,edi                                                                                    
                            add  esi,[esi+003ch]                                                                           
                            .if WORD  ptr [esi] == IMAGE_NT_SIGNATURE ;这里好像是找IMAGE_NT_HEADERS的第一个字,搜索的应该不是指kernel32的基地址,好像是PE头的地址
2009-2-21 09:26
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
4
是在找PE头,但这个PE应该指的是Kernel32.dll.
2009-2-21 11:28
0
雪    币: 75
活跃值: (623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
明白了,多谢楼上!!!
kernel32.dll也是一个pe文件,windows是用createprocess函数来创建进程,它压入了一个返回地址,这个返回地址属于kernel32.dll空间,所以可以直接通过[esp]进入kernel32地址空间暴力搜索kernel32这个pe文件的文件头
2009-2-21 11:53
0
游客
登录 | 注册 方可回帖
返回
//