阅读:2285回复:18
GetProcAddrss失效!
在2K下,我找到了Kernel32的地址,是77E60000,不知道为什么与
大侠们说的不一样,同时,用GetPorcAddress来获得MessageBoxA的 是首地址时,程序自动结束运行。可以肯定GetProcAddress的地址 没有错,因为当时还取得其他的函数首地址,不可能那么巧合吧,所 有的函数都在导出表中找到了。为什么它就自动结束运行呢??为什么GetProcAddress就会失效呢???????? :( :( :( :( :( 请赐教!!!! |
|
最新喜欢:flyfox
|
沙发#
发布于:2002-06-20 16:22
把你的代码贴上来!!!!!!!!!!!
|
|
|
板凳#
发布于: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 |
|
|
地板#
发布于:2002-06-20 16:46
我也是看的别人的,然后自己加了一些东西!觉得很奇怪!!
斑竹,就靠你救我了!! |
|
|
地下室#
发布于:2002-06-20 17:11
各位,有礼了!!!!斑竹,不要因为是masm写的就不舒服嘛!!!
我实在是困惑了!! |
|
|
5楼#
发布于:2002-06-20 17:14
你再把汇编完的.exe给我一个
我不用MASM的,虽然我有。 还有,以后贴代码把笑脸功能去掉。 我看你这代码问题大了 |
|
|
6楼#
发布于:2002-06-20 17:22
OK!呵呵,谢谢斑竹了!我不会往这儿传文件!!!怎么传啊!
|
|
|
7楼#
发布于:2002-06-20 17:23
OK!呵呵,谢谢斑竹了!我不会往这儿传文件!!!怎么传啊! 你回帖子的时候下面不是有个“附件”吗??? |
|
|
8楼#
发布于:2002-06-20 17:32
知道了!!
|
|
|
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] |
|
|
10楼#
发布于:2002-06-20 17:51
呵呵!谢谢斑竹,谢谢斑竹!!得到的地址是对的吗??????
老大,是对的对吗????? |
|
|
11楼#
发布于:2002-06-20 17:54
呵呵!谢谢斑竹,谢谢斑竹!!得到的地址是对的吗?????? 地址是对的 不过你call LoadLibrary的时候其实call的是GetProcAddrss了 |
|
|
12楼#
发布于:2002-06-20 17:54
斑竹你说的用1M间隔进行分析,DLL和EXE的标志是什么??
也就是IMAGE_NT_HEADERS.FileHeader.Characteristics的具体意义是什么??? |
|
|
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 还有,我从来不在汇编里用结构的 |
|
|
14楼#
发布于:2002-06-20 18:00
呵呵,再也不敢在汇编中用结构了,以后一定该。不然就打PP了!!!!
哈哈哈哈哈,终于可以吃饭了,我已经一天没吃东西了,现在感觉 好饿!!谢谢斑竹 |
|
|
15楼#
发布于:2002-06-20 18:43
呼呼呼呼,感觉你好怪异
|
|
|
16楼#
发布于:2002-06-20 23:52
0x0001 There are no relocations in this file 跟我习惯一样嘛,不过我是因为从来没用过。 |
|
17楼#
发布于:2002-06-21 13:21
呵呵,还忘了给分了!!补上!!
|
|
|
18楼#
发布于:2002-06-21 13:44
呵呵,还忘了给分了!!补上!! 谢了兄弟 |
|
|