首页
社区
课程
招聘
[求助]关于获取Kernel32的基地址遇到的问题~~~
发表于: 2009-9-5 11:17 3600

[求助]关于获取Kernel32的基地址遇到的问题~~~

2009-9-5 11:17
3600
在找这个DLL基地址时遇到一个问题~

网上说的是因为WINDOWS为了让该程序退出时调用ExitProcess所以把ExitProcess的地址首先就压入堆栈.然后程序结束后ret到该地址.由于ExitProcess位于Kernel32里.所以倒着找就能够找到该DLL的基地址.

于是我试着按照这个思路找了下.但是出现了个问题.下面是我写的代码(VC++6.0)
#include<iostream.h>
#include<conio.h>
void main()
{
       
        int tes=0;
     _asm
        {
                mov eax,esp                     
                mov eax,DWORD ptr ds:[eax]
beg:
                cmp word ptr ds:[eax],'ZM'
                jnz neql                                        
                cmp word ptr ds:[eax+240],'EP'
                jz a
neql:
                       dec eax
                               cmp eax,0x70000000
                jb over
                jmp beg  
over:
                mov eax,0

a:
                mov tes,eax               
        }       

       
        cout<<tes<<endl;
    getch();
}
这样并不能获得程序刚运行的首个ESP

我直接用VC反汇编后是如下代码
3:    void main()
4:    {
00401240   push        ebp                         ;这个才是我需要的
00401241   mov         ebp,esp
00401243   sub         esp,44h                   ;;但是这里esp就已经变了
00401246   push        ebx
00401247   push        esi
00401248   push        edi
00401249   lea         edi,[ebp-44h]
0040124C   mov         ecx,11h
00401251   mov         eax,0CCCCCCCCh
00401256   rep stos    dword ptr [edi]
5:
6:        int tes=0;
00401258   mov         dword ptr [ebp-4],0
..........这下面才是我写的_asm的代码
看来是没有在程序刚运行时捕捉esp.请高人提示下小弟该怎么做~~~???

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 377
活跃值: (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
http://bbs.pediy.com/showthread.php?t=97141&highlight= 这篇文章的就写了相关的内容.其实这个方法不一定要mov eax,esp 这样也可以 mov eax,[esp+XXX] XX就是偏移 你可以看堆栈中的地址 只要取到的地址在kernel32.dll中就可以使用
2009-9-5 13:55
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最简单的有个intrinsic 叫_ReturnAddress
连汇编都可以省了,就不知道VC6有没有
另外既然建立了框架,用[EBP+4]访问返回地址也是一样的
2009-9-5 16:24
0
游客
登录 | 注册 方可回帖
返回
//