zcxt1980
驱动牛犊
驱动牛犊
  • 注册日期2002-11-08
  • 最后登录2013-10-18
  • 粉丝0
  • 关注0
  • 积分63分
  • 威望47点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2592回复:7

我是一个新手,请来看看我的问题吧!!

楼主#
更多 发布于:2002-11-15 11:05
.586
.model flat, stdcall
option casemap :none   ; case sensitive
include c:\\hd\\hd.h
include c:\\hd\\mac.h

;;--------------

GetApiA         proto :DWORD,:DWORD

;;--------------
.CODE
appBase         dd ?
k32Base         dd ?

lpApiAddrs      label   near
               dd      offset sGetModuleHandle
               dd      offset sGetProcAddress
               dd      offset sExitProcess
               dd      offset sLoadLibrary
               dd      0

sGetModuleHandle       db \"GetModuleHandleA\",0
sGetProcAddress        db \"GetProcAddress\",0
sExitProcess           db \"ExitProcess\",0
sLoadLibrary           db \"LoadLibraryA\",0

sMessageBoxA           db \"MessageBoxA\",0

 
aGetModuleHandle                dd 0
aGetProcAddress                 dd 0
aExitProcess                    dd 0
aLoadLibrary                    dd 0
aMessageBoxA                    dd 0

u32                     db \"User32.dll\",0
k32                     db \"Kernel32.dll\",0

sztit                   db \"By Hume,2002\",0
szMsg0                  db \"Hey,Hope U enjoy it!\",0
;;-----------------------------------------

__Start:
       invokeInitCommonControls
      
       call    delta
delta:  
       pop     ebp                                   sub     ebp,offset delta                      
mov     dword ptr [ebp+offset appBase],ebp          
mov     ecx,[esp] ;这是文件的返回地址是什么意思?            
       xor     edx,edx
getK32Base:
       dec     ecx     (why?)  
       mov     dx,word  ptr [ecx+IMAGE_DOS_HEADER.e_lfanew]  
       test    dx,0f000h                       ;
       jnz     getK32Base                      ;
       cmp     ecx,dword ptr[ecx+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase];      

       jnz     getK32Base                      ;
       mov     [ebp+offset k32Base],ecx        ;      
       lea     edi,[ebp+offset aGetModuleHandle]
       lea     esi,[ebp+offset lpApiAddrs]
lop_get:
       lodsd
       cmp     eax,0
       jz      End_Get
       push    eax
       push    dword ptr [ebp+offset k32Base]
       callGetApiA                         ;为什么这样就获取API地址        
       stosd
       jmp     lop_get
End_Get:
       push    offset u32
       call    dword ptr [ebp+offset aLoadLibrary]     ;在程序空间加载User32.dll
      
       lea     EDX,[EBP+OFFSET sMessageBoxA]
       push    edx
       push    eax
       mov     eax,dword ptr [ebp+aGetProcAddress]     ;用GetProcAddress获得MessageBoxA的地址
       call    eax                                     ;调用GetProcAddress

       push    40h+1000h                               ;style
       push    offset sztit                            ;title
       push    offset  szMsg0                          ;消息内容
       push    0
       call    eax                                     @@:                                                     ;       push    0
       call    [ebp+aExitProcess]
      
;-----------------------------------------
K32_api_retrieve        proc Base:DWORD ,sApi:DWORD

       push    edx                     ;保存edx    
       xor     eax,eax                 ;此时esi=sApi
Next_Api:                               ;edi=AddressOfNames
       mov     esi,sApi
       xor     edx,edx
       dec     edx
Match_Api_name:
       mov     bl,byte  ptr [esi]
       inc     esi
       cmp     bl,0
       jz      foundit

       inc     edx

       push    eax
       mov     eax,[edi+eax*4]         ;AddressOfNames的指针,递增
       add     eax,Base                ;注意是RVA,一定要加Base值
       cmp     bl,byte  ptr [eax+edx]  ;逐字符比较  
       pop     eax
       jz      Match_Api_name          ;继续搜寻
       inc     eax                     ;不匹配,下一个api
       loop    Next_Api
       jmp     no_exist                ;若全部搜完,即未存在
foundit:
       pop     edx                     ;edx=AddressOfNameOrdinals
       shl     eax,1                   ;*2得到AddressOfNameOrdinals的指针
       movzx   eax,word  ptr [edx+eax] ;eax返回指向AddressOfFunctions的指针
       ret
no_exist:
       pop     edx
       xor     eax,eax
       ret
K32_api_retrieve        endp
;-----------------------------------------

GetApiA         proc  Base:DWORD,sApi:DWORD
       local    ADDRofFun:DWORD
       pushad
       mov     edi,Base
       add     edi,IMAGE_DOS_HEADER.e_lfanew
       mov     edi,[edi]                       ;现在edi=off PE_HEADER
       add     edi,Base                        ;得到IMAGE_NT_HEADERS的偏移                        

       mov     ebx,edi
       mov     edi,[edi+IMAGE_NT_HEADERS.OptionalHeader.DataDirectory.VirtualAddress]
       add     edi,Base                        ;得到edi=IMAGE_EXPORT_DIRECTORY入口
      
       mov     eax,[edi+1ch]                   ;AddressOfFunctions的地址
       add     eax,Base
       mov     ADDRofFun,eax
                                               ;ecx=NumberOfNames
       mov     ecx,[edi+18h]                  
       mov     edx,[edi+24h]                  
       add     edx,Base                        ;edx=AddressOfNameOrdinals

       mov     edi,[edi+20h]
       add     edi,Base                        ;edi=AddressOfNames
       invokeK32_api_retrieve,Base,sApi
       mov     ebx,ADDRofFun
       shl     eax,2                           ;要*4才得到偏移
       add     eax,ebx
       mov     eax,[eax]
       add     eax,Base                        ;加上Base!
       mov     [esp+7*4],eax                   ;eax返回api地址
       popad
       ret
GetApiA         endp

;-----------------------------------------

END__Start

另外PELOADER加载PE文件的具体过程是什么?

 :D

最新喜欢:

okincnokincn
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-15 11:20
我没时间仔细看
去我签名论坛入门版问吧,肯定有人回答的
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
ooze
驱动牛犊
驱动牛犊
  • 注册日期2001-09-26
  • 最后登录2004-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-16 03:22
另外PELOADER加载PE文件的具体过程是什么?
这个问题MSDN有解答,另外本站提供下载的书籍里面也有提及,好象内存管理啥书
Be a true hacker of Windows NT alike
ooze
驱动牛犊
驱动牛犊
  • 注册日期2001-09-26
  • 最后登录2004-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-16 03:56
mov dword ptr [ebp+offset appBase],ebp
mov ecx,[esp] ;这是文件的返回地址是什么意思?
esp保存的是程序返回时系统地址


dec ecx (why?)
下面的代码都是搜索内存里面程序的IMAGE,不用dec ecx,估计可以按memory对齐的字节数来搜

虽然我没看关于系统怎么加载程序的image,但是我认为可以这么想,系统就象对dll一样,只是不用引用记数而已,将程序的image加载到内存,不过中间要调用一些函数分析是否合法的文件头,EP是否正确等,并设置这片内存为可执行,可读等模式,最后开始从EP执行,当程序执行完后,应该把控制权交给系统,即系统的IP register.(我的理解可能不对,最好看看msdn里面怎么阐述的)



Be a true hacker of Windows NT alike
BeforeHan
驱动牛犊
驱动牛犊
  • 注册日期2003-04-22
  • 最后登录2007-07-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-05 12:26
到这里我才知道自己有多菜!
hsdjl
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2009-01-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-18 09:09
跟楼上的有同感啊!
hdh4638
驱动牛犊
驱动牛犊
  • 注册日期2004-06-19
  • 最后登录2004-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-19 17:15
这是文件的返回地址是什么意思?
答:是得到kernel32.dll的返回地址啊!
dec ecx (why?)
答:是安1的递减量,暴力搜内存啊!目的是得到kernel32.dll的基址。
为什么这样就获取API地址 ?
答:他是调用后面的GetApiA过程啊!应该有空格的吧!
另外PELOADER加载PE文件的具体过程是什么?
可以参考izcelion的pe文件教材,在http://www.aogosoft.com网站可以下载啊!名称是masm32教程。
 
 我也是病毒的初学者,以后多多交流,我的QQ8584371,愿意话加我。
youyuas
驱动牛犊
驱动牛犊
  • 注册日期2004-06-25
  • 最后登录2008-02-01
  • 粉丝0
  • 关注0
  • 积分277分
  • 威望32点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-25 14:26
mov dword ptr [ebp+offset appBase],ebp
mov ecx,[esp] ;这是文件的返回地址是什么意思?
esp保存的是程序返回时系统地址

这是病毒搜索kernel32的方法之一,前提条件是
[esp]在kernel32的地址之内,
初始化的默认情况是这样的,
不过这样的方法有一定的局限性,当我们在一开始的时候
有对堆栈的操作后,这种方法便不合适了
不提倡使用
另外,还有利用seh和利用系统默认固定地址的方法
游客

返回顶部