中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 看雪学院专区 > Win32/Win64编程
一个GetProcAddress
作者:buguty 时间:2006-12-15 15:44 出处:pediy.com 责编:月夜寒箫
              摘要:一个GetProcAddress
昨天心血来潮就自己写了个.并复习下pe哈哈...
写作原因:
因为要在一个文件中读入一行函数名然后将其找到(我的一个dll库)所以刚开始
我用的是ms自己的GetProcAddress发现怎样都成功不了.实在找不到原因.所以就
自己写了个并温习了下pe.(感谢看学上的pe方面的文章!)
刚开始写出来后发现还是成功不了.经过跟踪终于发现原因,并且这个也是GetProcAddress不可以成功的原因.就是,在一个文件中读入一行字符后在结尾处
是"\x0A\x00"本来应该是没有\x0a的.比如文件中一行
buguty
被读入后就是
"buguty'\x0a'\x0'"本来没有那个换行符的.所以我在第一次计算hash的时候加了个cmp al,0xa
后来我改进了下.就是在之前将我的所有读入的字符串(读入的字符串还有参数等信息)进行了一下转换去掉结尾的\x0a:
      _asm
      {
        push  esi
        mov    esi,pBuff
FindA:
        lodsb
        cmp    al,0x0a
        jnz    FindA
        xor    al,al
        mov    byte ptr [esi-1],al
        pop    esi
      }
然后一下是改进后的代码:

pExploit GetProcAddr(char* pFuncName,HMODULE hDll)
{
  unsigned long hash;

  pExploit  RetVanlue;

  _asm
  {
    mov    esi,pFuncName
    call  GetHash
    mov    hash,eax

    ;找到数据目录表  ebx,edi
    mov    ebx,hDll                ;base to eax
    mov    edi,[ebx+0x3c]
    mov    edi,[edi+ebx+0x78]
    add    edi,ebx                  ;edi==Addr of IMAGE_EXPORT_DIRECTORY

    mov    edx,[edi+0x20]
    mov    esi,dword ptr [edx+ebx]
    add    esi,ebx                  ;esi-->names

    xor    edx,edx                  ;counter...
    dec    edx
    mov    ecx,[edi+0x18]              ;Number of Names of Funcs

    push  ebx
GetByNameLoop:
    dec    ecx
    inc    edx

    call  GetHash
    mov    eax,hash
    cmp    eax,ebx
    jz    HashFind
    cmp    ecx,0
    jnz    GetByNameLoop
    jmp    UnFindAndEnd

HashFind:
    mov    eax,[edi+0x24]              ;Get AddressOfNameOrdinals's Address
    pop    ebx
    add    eax,ebx
    movzx  ax,word ptr [eax+edx*2]
    mov    edx,[edi+0x1c]
    add    edx,ebx
    and    eax,0x0ffff
    mov    eax,[edx+eax*4]
    add    eax,ebx
    jmp    FindAndEnd


/* GetHashFunc */
GetHash:
    xor    ebx,ebx
    xor    eax,eax
HashLoop:
    lodsb
    cmp    ah,al
    jz    GetHashRet
    ror    ebx,7
    add    ebx,eax
    jmp    HashLoop

GetHashRet:
    mov    eax,ebx
    ret
/* GetHashFuncEnd */

UnFindAndEnd:
    pop    esi
    xor    eax,eax
FindAndEnd:
    mov    RetVanlue,eax
  }
  return RetVanlue;
}

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有