中国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
  当前位置:> 程序开发 > 编程语言 > Visual C++ > BasicDelphi
想在你的程序中截住API函数吗?那就快看吧!
作者:uaiia 时间:2001-10-13 10:18 出处:互联网 责编:chinaitpower
              摘要:想在你的程序中截住API函数吗?那就快看吧!

在你的程序中做一个函数func(...)

调用 func1 = ApiSpy(NULL,"GDI32.DLL","TextOutA",(PROC)func)

那么你的程序没次调用TextOut时,就会调用func 为了不破坏原有功能

请在func中调用func1。如果想截获整个系统的api,你需要做一个全局HOOK

在HOOK的DLL里的初始化时调用本函数。主要代码如下:

PROC WINAPI

ApiSpy(PSTR pDllUse,PSTR pDllName,PSTR pApiName,PROC pNewPorc)
{
    PIMAGE_DOS_HEADER   pDosHeader;
    PIMAGE_NT_HEADERS   pNTHeader;
    PIMAGE_IMPORT_DESCRIPTOR pImportDesc;
    PIMAGE_THUNK_DATA   pThunk;
    PROC      pOldProc;
    DWORD oldpr;
    static int Layer = 0;
    if ( pDllUse == NULL )
             Layer = 0;
    pOldProc = GetProcAddress( GetModuleHandle(pDllName),pApiName );
    if ( pOldProc == NULL )
           return NULL;
    pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(pDllUse);    
    if ( IsBadReadPtr(pDosHeader, sizeof(IMAGE_DOS_HEADER)) )
        return NULL;
    if ( pDosHeader->e_magic != IMAGE_DOS_SIGNATURE )
        return NULL;
    pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDosHeader, pDosHeader->e_lfanew);
   if ( IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) )
        return NULL;
   if ( pNTHeader->Signature != IMAGE_NT_SIGNATURE )
        return NULL;
  pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDosHeader,
                            pNTHeader->OptionalHeader.
                            DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].
                            VirtualAddress);
    if ( pImportDesc == (PIMAGE_IMPORT_DESCRIPTOR)pNTHeader )
        return NULL;
 __try{
     while ( pImportDesc->Name ){
    PSTR pszModName = MakePtr(PSTR, pDosHeader, pImportDesc->Name);
    REM("[%s]",pszModName);
    if ( stricmp(pszModName, pDllName) == 0 ){
     pThunk = MakePtr(PIMAGE_THUNK_DATA, pDosHeader, pImportDesc->FirstThunk);
     while ( pThunk->u1.Function ){ 
      REM("[%s:%s]  ?  %s %8x ==> %8x",pDllName,pApiName,pszModName,
      // (DWORD)pOldProc,(DWORD)pThunk->u1.Function);
      if ( pThunk->u1.Function == (PDWORD)pOldProc ){
       if (!VirtualProtect(pThunk, 16, PAGE_READWRITE,&oldpr)){
        REM("VirtualProtect False");
       }
       REM("ApiSpy [%s:%s] OK !",pDllName,pApiName);
       pThunk->u1.Function=(PDWORD)pNewPorc;
       return pOldProc;
      }
      pThunk++;  
     }      
     return NULL;
    }
    else{
     if ( Layer < __Layer ){
      Layer ++;
      ApiSpy(pszModName,pDllName,pApiName,pNewPorc);     
     }
    }
    pImportDesc++;
   }
    }
 __except(TRUE){
  return NULL;
 }
    return NULL; 
}

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