收录日期:2018/12/15 03:55:01 时间:2016/05/22 09:12:24 标签:基础类
比如禁止使用
mouse_event

SendInput

又怎么开启?
用全局钩子拦截API,CSDN的首页里面有怎么写游戏外挂的那文章里面有
对,只能用全局钩子拦截api
呵呵。不怕别的程序异常??
用全局钩子拦截API
相关文章没找到
转载:


--------------------------------------------------------------------------------
 
Win2K下的Api函数的拦截 
原始文档:http://www.xfocus.net/article_view.php?id=336 
原创:tomh(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; 


 
 
发布时间:2002年01月21日11时 
阅读次数:988 

求大虾帮忙看一下什么错误,谢谢了 想做视频聊天的软件 请高手来指导下 如何将一个XML文件,读取到一个字符串变量中呀.. 如何得到表a中每条记录的最新插入时间和当前插入的信息,详情请进! 请问怎样用pb实现客户端远程调用服务器程序? 求大虾帮忙看一下什么错误,谢谢了! 我的超级难题 :( 使鼠标变成你现在指着我标题这只小手有多少种方法. 最近要画个OPENGL的图,那个老大贴过简单的代码看看! 请问我在一个ACCESS表里的许多项数据用同一种数据类型比如单精度浮点小数类型,是否可以有比较快捷的设定方法? 请问如何分批量取数据? 语法错误 (操作符丢失) 在查询表达式 \'Provider like \'%%\' and Data > \'%%\' and like \'%%\' < \'%%\'\' 中。 我的超级难题 :( 请大家帮下忙 combox定位问题!! 高手帮忙啊,郁闷了一个晚上,在线等…… 这是什么错误 入门请教各位 怎么在JBuilder打包时选择文件? 安装MSSQL2005后的问题??? 关于名称 关CPropertySheet的问题.. 高分求教手写签名 请大虾看下这个程序有什么问题~~~~ 在VB里image控件能装到coolbar里面并显示它上面吗 请问MessageBox发的消息可以是变量值吗? 谁知道计算机图形学中的高次表面技术,有这方面的论文吗? 感冒一次花了7000多 求jbuilder2005里配置数据源的方法 __doPostBack报脚本错误??? 请问:调用用户控件的问题