登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 技术文档 - 黑客编程 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

Win2K下的Api函数的拦截
发表日期:2003-10-30作者:tomh[] 出处:  

 Api拦截并不是一个新的技术,很多商业软件都采用这种技术。对windows的Api函数的拦截,不外乎两种方法,第一种是Mr. Jeffrey Richter 的修改exe文件的模块输入节,种方法,很安全,但很复杂,而且有些exe文件,没有Dll的输入符号的列表,有可能出现拦截不到的情况。第二种方法就是常用的JMP XXX的方法,虽然很古老,却很简单实用。

  本文一介绍第二种方法在Win2k下的使用。第二种方法,Win98/me 下因为进入Ring0级的方法很多,有LDT,IDT,Vxd等方法,很容易在内存中动态修改代码,但在Win2k下,这些方法都不能用,写WDM太过复杂,表面上看来很难实现,

其实不然。Win2k为我们提供了一个强大的内存Api操作函数---VirtualProtectEx,WriteProcessMemeory,ReadProcessMemeory,有了它们我们就能在内存中动态修改代码了,其原型为:

     BOOL VirtualProtectEx(

                HANDLE hProcess,   // 要修改内存的进程句柄

                LPVOID lpAddress,  // 要修改内存的起始地址

                DWORD dwSize,    // 修改内存的字节

                DWORD flNewProtect, // 修改后的内存属性

                PDWORD lpflOldProtect // 修改前的内存属性的地址

                );

    BOOL WriteProcessMemory(

                HANDLE hProcess, // 要写进程的句柄

                LPVOID lpBaseAddress, // 写内存的起始地址

                LPVOID lpBuffer, // 写入数据的地址

                DWORD nSize,   // 要写的字节数

                LPDWORD lpNumberOfBytesWritten // 实际写入的子节数

                );

    BOOL ReadProcessMemory(

                HANDLE hProcess, // 要读进程的句柄

                LPCVOID lpBaseAddress,  // 读内存的起始地址

                LPVOID lpBuffer, // 读入数据的地址

                DWORD nSize,   // 要读入的字节数

                LPDWORD lpNumberOfBytesRead  // 实际读入的子节数

                );

具体的参数请参看MSDN帮助。在Win2k下因为Dll和所属进程在同一地址空间,这点又和Win9x/me存在所有进程存在共享的地址空间不同,

因此,必须通过钩子函数和远程注入进程的方法,现以一个简单采用钩子函数对MessageBoxA进行拦截例子来说明:

其中Dll文件为:

     HHOOK g_hHook;

     HINSTANCE g_hinstDll;

     FARPROC pfMessageBoxA;

     int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);

     BYTE OldMessageBoxACode[5],NewMessageBoxACode[5];

     HMODULE hModule ;

     DWORD dwIdOld,dwIdNew;

     BOOL bHook=false;

     void HookOn();

     void HookOff();

     BOOL init();

LRESULT WINAPI MousHook(int nCode,WPARAM wParam,LPARAM lParam);

BOOL APIENTRY DllMain( HANDLE hModule,

            DWORD ul_reason_for_call,

            LPVOID lpReserved

           )

{

  switch (ul_reason_for_call)

  {

    case DLL_PROCESS_ATTACH:

      if(!init())

      {

             MessageBoxA(NULL,"Init","ERROR",MB_OK);

             return(false);

      }

    case DLL_THREAD_ATTACH:

    case DLL_THREAD_DETACH:

    case DLL_PROCESS_DETACH:

           if(bHook) UnintallHook(); 

          break;

  }

  return TRUE;

}

LRESULT WINAPI Hook(int nCode,WPARAM wParam,LPARAM lParam)//空的钩子函数

{

  

  return(CallNextHookEx(g_hHook,nCode,wParam,lParam));

}

HOOKAPI2_API BOOL InstallHook()//输出安装空的钩子函数

  g_hinstDll=LoadLibrary("HookApi2.dll");

  g_hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Hook,g_hinstDll,0);

 if (!g_hHook)

 {

    MessageBoxA(NULL,"SET ERROR","ERROR",MB_OK);

    return(false);

  }

 

     

  return(true);

}

HOOKAPI2_API BOOL UninstallHook()//输出御在钩子函数

{

 

  return(UnhookWindowsHookEx(g_hHook));

}

BOOL init()//初始化得到MessageBoxA的地址,并生成Jmp XXX(MyMessageBoxA)的跳转指令

{

  hModule=LoadLibrary("user32.dll");

  pfMessageBoxA=GetProcAddress(hModule,"MessageBoxA");

  if(pfMessageBoxA==NULL)

   return false;

  _asm

  {

    lea edi,OldMessageBoxACode

    mov esi,pfMessageBoxA

    cld

    movsd

    movsb

  }

  NewMessageBoxACode[0]=0xe9;//jmp MyMessageBoxA的相对地址的指令

  _asm

  {

    lea eax,MyMessageBoxA

    mov ebx,pfMessageBoxA

    sub eax,ebx

    sub eax,5

    mov dword ptr [NewMessageBoxACode+1],eax

  }

  dwIdNew=GetCurrentProcessId(); //得到所属进程的ID

  dwIdOld=dwIdNew;

  HookOn();//开始拦截

  return(true);

}

int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText,LPCTSTR lpCaption, UINT uType )//首先关闭拦截,然后才能调用被拦截的Api 函数

  int nReturn=0;

  HookOff();

  nReturn=MessageBoxA(hWnd,"Hook",lpCaption,uType);

  HookOn();

  return(nReturn);

}

void HookOn()

{

  HANDLE hProc;

  dwIdOld=dwIdNew;

  hProc=OpenProcess(PROCESS_ALL_ACCESS,0,dwIdOld);//得到所属进程的句柄

  VirtualProtectEx(hProc,pfMessageBoxA,5,PAGE_READWRITE,&dwIdOld);//修改所属进程中MessageBoxA的前5个字节的属性为可写

  WriteProcessMemory(hProc,pfMessageBoxA,NewMessageBoxACode,5,0);//将所属进程中MessageBoxA的前5个字节改为JMP 到MyMessageBoxA

  VirtualProtectEx(hProc,pfMessageBoxA,5,dwIdOld,&dwIdOld);//修改所属进程中MessageBoxA的前5个字节的属性为原来的属性

  bHook=true;

}

void HookOff()//将所属进程中JMP MyMessageBoxA的代码改为Jmp MessageBoxA

{

  HANDLE hProc;

  dwIdOld=dwIdNew;

  hProc=OpenProcess(PROCESS_ALL_ACCESS,0,dwIdOld);

  VirtualProtectEx(hProc,pfMessageBoxA,5,PAGE_READWRITE,&dwIdOld);

  WriteProcessMemory(hProc,pfMessageBoxA,OldMessageBoxACode,5,0);

  VirtualProtectEx(hProc,pfMessageBoxA,5,dwIdOld,&dwIdOld);

  bHook=false;

}

//测试文件:

int APIENTRY WinMain(HINSTANCE hInstance,

           HINSTANCE hPrevInstance,

           LPSTR   lpCmdLine,

           int    nCmdShow)

{

  

  if(!InstallHook())

  {

    MessageBoxA(NULL,"Hook Error!","Hook",MB_OK);

    return 1;

  }

   MessageBoxA(NULL,"TEST","TEST",MB_OK);//可以看见Test变成了Hook,也可以在其他进程中看见

  if(!UninstallHook())

  {

    MessageBoxA(NULL,"Uninstall Error!","Hook",MB_OK);

    return 1;

  }

  return 0;

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 Win2K下的Api函数的拦截

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接  
Copyright ©2001-2006 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00207