monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
阅读:2285回复:18

GetProcAddrss失效!

楼主#
更多 发布于:2002-06-20 16:14
在2K下,我找到了Kernel32的地址,是77E60000,不知道为什么与
大侠们说的不一样,同时,用GetPorcAddress来获得MessageBoxA的
是首地址时,程序自动结束运行。可以肯定GetProcAddress的地址
没有错,因为当时还取得其他的函数首地址,不可能那么巧合吧,所
有的函数都在导出表中找到了。为什么它就自动结束运行呢??为什么GetProcAddress就会失效呢????????
:( :( :( :( :(
请赐教!!!!

最新喜欢:

flyfoxflyfox
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-20 16:22
把你的代码贴上来!!!!!!!!!!!
[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]
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-20 16:43
.586
.model flat, stdcall
option casemap :none   ; case sensitive
 
include \\masm32\\include\\windows.inc
include \\masm32\\include\\kernel32.inc
include \\masm32\\include\\comdlg32.inc
include \\masm32\\include\\user32.inc
includelib \\masm32\\lib\\user32.lib
includelib \\masm32\\lib\\kernel32.lib
includelib \\masm32\\lib\\comdlg32.lib
;****************************************************************************************
.DATA
sGetModuleHandle       db \"GetModuleHandleA\",0
sGetProcAddress        db \"GetProcAddress\",0
sExitProcess           db \"ExitProcess\",0
sLoadLibrary           db \"LoadLibraryA\",0
sMessageBoxA           db \"MessageBoxA\",0

szTitle                db \"Title\",0
szMsg                  db \"Hooking is Good! :) \",0
szMsgErr               db \"Hooking isn\'t Good! @~@ \",0

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

aGetModuleHandle       dd 0
aLoadLibrary           dd 0
aGetProcAddress        dd 0
aExitProcess           dd 0
aMessageBox            dd 0

;****************************************************************************************
.CODE
lpApiAddrs             label near
                       dd      offset sGetModuleHandle
                       dd      offset sGetProcAddress
                       dd      offset sExitProcess
                       dd      offset sLoadLibrary
                       dd      0

_Start:
  ASSUME  FS:NOTHING
call @1
@1:
        pop     ebp
sub     ebp, offset @1

;        invoke InitCommonControls  ;为了能在2K下运行,兼容考虑!
;进行Kernel和User的重定位!
         mov     ecx, [esp]  ;在PE Loader装入我们的程序启动后堆栈顶的地址是是程序的返回地址,
                    ;肯定在Kernel32中!
xor     edx, edx
;***************************************************************************************
;构件SEH结构以防出错,但注意由于下面要用到堆栈,务必不要不要破坏堆栈!
        push      offset Exit
push      fs:[0]      
        mov       fs:[0],esp                    
;***************************************************************************************

GetKernel32Base:
         dec     ecx
         mov     dx, word ptr [ecx+IMAGE_DOS_HEADER.e_lfanew]

test    dx, 0f000H
jnz     GetKernel32Base
cmp     ecx, dword ptr [ecx+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase]
jnz     GetKernel32Base

lea     edi, [ebp+offset aGetModuleHandle]
         lea     esi, [ebp+offset lpApiAddrs]

LoopGetApiA:
         lodsd
cmp     eax, 0
jz      End_Loop

push    eax
push    ecx

call    GetApiA
        
stosd

jmp     LoopGetApiA

End_Loop:
         push    offset u32
         call    dword ptr [ebp+offset aLoadLibrary]  ;在程序空间加载User32.dll
        
         lea     edx,[ebp+offset sMessageBoxA]
         push    edx
         push    eax
         mov     edx, dword ptr [ebp+offset aGetProcAddress]  ;用GetProcAddress获得
                                                     ;MessageBoxA的地址
         call    edx                                          ;调用GetProcAddress

         push    40h+1000h                             ;style
         push    offset szTitle                        ;title
         push    offset  szMsg                         ;消息内容
         push    0
         call    eax                                   ;一个消息框产生了...嘿嘿
                                                       ;有理由为此高兴吧,因为我们没有预先引入
@@:                                                    ;这些函数
         push    0
         call    [ebp+offset aExitProcess]
;此时程序结束了!
Exit:
        invoke    MessageBox,NULL,addr szMsgErr,addr szTitle,MB_OK
        mov    eax,1        
        ret
;***************************************************************************************

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

       mov     ecx,[edi+18h]                   ;ecx=NumberOfNames从函数名引出函数的数目
       mov     edx,[edi+24h]                  
       add     edx,Base                        ;edx=AddressOfNameOrdinals完成名字数组到序
                                          ;数数组的映射,在名字数组中包含该函数的名字
  ;然后跟它同索引号的AddressOfNameOrdinals中
  ;包含有函数在数组AddressOfFunctions中的索引值

       mov     edi,[edi+20h]
       add     edi,Base                        ;edi=AddressOfNames从函数名引出的函数的地
                                          ;址数组首地址
   
  push    sApi
    push    Base
       call    K32_api_retrieve                ;在EAX中返回函数的地址数组的索引值

       mov     ebx,ADDRofFun
       shl     eax,2                           ;要*4才得到偏移
       add     eax,ebx
       mov     eax,[eax]
       add     eax,Base                        ;加上Base!
       mov     [esp+7*4],eax                   ;eax返回api地址
exit:
       popad
       ret
GetApiA         endp
;***************************************************************************************

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]
       cmp     bl,0
       jz      foundit

       inc     esi
       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

end _Start
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-20 16:46
我也是看的别人的,然后自己加了一些东西!觉得很奇怪!!
斑竹,就靠你救我了!!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-20 17:11
各位,有礼了!!!!斑竹,不要因为是masm写的就不舒服嘛!!!
我实在是困惑了!!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-20 17:14
你再把汇编完的.exe给我一个
我不用MASM的,虽然我有。
还有,以后贴代码把笑脸功能去掉。
我看你这代码问题大了
[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]
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-20 17:22
OK!呵呵,谢谢斑竹了!我不会往这儿传文件!!!怎么传啊!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-20 17:23
OK!呵呵,谢谢斑竹了!我不会往这儿传文件!!!怎么传啊!

你回帖子的时候下面不是有个“附件”吗???
[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]
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-20 17:32
知道了!!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-20 17:38
大兄弟!!!!!!!!
你好好看看你的API,字符串指针和地址的顺序一致吗???
aGetModuleHandle dd 0
aLoadLibrary dd 0
aGetProcAddress dd 0
aExitProcess dd 0
aMessageBox dd 0

;****************************************************************************************
.CODE
lpApiAddrs label near
dd offset sGetModuleHandle
dd offset sGetProcAddress
dd offset sExitProcess
dd offset sLoadLibrary
dd 0

好好看看!!!


[编辑 -  6/20/02 by  Koms Bomb]
[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]
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-06-20 17:51
呵呵!谢谢斑竹,谢谢斑竹!!得到的地址是对的吗??????
老大,是对的对吗?????
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-06-20 17:54
呵呵!谢谢斑竹,谢谢斑竹!!得到的地址是对的吗??????
老大,是对的对吗?????

地址是对的
不过你call LoadLibrary的时候其实call的是GetProcAddrss了
[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]
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-06-20 17:54
斑竹你说的用1M间隔进行分析,DLL和EXE的标志是什么??
也就是IMAGE_NT_HEADERS.FileHeader.Characteristics的具体意义是什么???
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-06-20 17:58
0x0001 There are no relocations in this file
0x0002 File is an executable image (not a OBJ or LIB)
0x2000 File is a dynamic-link library, not a program

看看winnt.h
还有,我从来不在汇编里用结构的
[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]
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-06-20 18:00
呵呵,再也不敢在汇编中用结构了,以后一定该。不然就打PP了!!!!
哈哈哈哈哈,终于可以吃饭了,我已经一天没吃东西了,现在感觉
好饿!!谢谢斑竹
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-06-20 18:43
呼呼呼呼,感觉你好怪异
[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]
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
16楼#
发布于:2002-06-20 23:52
0x0001 There are no relocations in this file
0x0002 File is an executable image (not a OBJ or LIB)
0x2000 File is a dynamic-link library, not a program

看看winnt.h
还有,我从来不在汇编里用结构的
 


跟我习惯一样嘛,不过我是因为从来没用过。
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-06-21 13:21
呵呵,还忘了给分了!!补上!!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-06-21 13:44
呵呵,还忘了给分了!!补上!!

谢了兄弟
[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]
游客

返回顶部