分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

大家都对金山快译可以讲英文软件翻译成中文软件感到惊奇

其实就是全局钩子勾住textout函数

钩子头文件如下

void __declspec(dllexport) WINAPI InstallHook(BOOL,DWORD); BOOL WINAPI UnInstallHook(); LRESULT CALLBACK GetMsgProC(int code,WPARAM wParam,LPARAM lParam); void WINAPI HookOneAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,         PROC pfnDummyFuncAddress,HMODULE hModCallerModule); BOOL WINAPI HookAllAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,         PROC pfnDummyFuncAddress,HMODULE hModCallerModule); BOOL WINAPI UnhookAllAPIHooks(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,          PROC pfnDummyFuncAddress,HMODULE hModCallerModule); BOOL WINAPI H_TextOutA(HDC, int, int, LPCSTR, int); BOOL WINAPI H_TextOutW(HDC, int, int, LPCWSTR, int); BOOL WINAPI H_ExtTextOutA(HDC, int, int, UINT, CONST RECT *,LPCSTR, UINT, CONST INT *); BOOL WINAPI H_ExtTextOutW(HDC, int, int, UINT, CONST RECT *,LPCWSTR, UINT, CONST INT *); 

钩子源文件如下

#include "stdafx.h"   #include "APIHook_Dll.h"   #include <ImageHlp.h>   #include <tlhelp32.h>   #pragma comment(lib,"ImageHlp") //定义全局共享数据段   #pragma data_seg("Shared")   HMODULE hmodDll=NULL;   HHOOK hHook=NULL;   #pragma data_seg()   #pragma comment(linker,"/Section:Shared,rws") //设置全局共享数据段的属性   / DllMain 函数 /   //dll的入口点   BOOL APIENTRY DllMain( HMODULE hModule,                           DWORD  ul_reason_for_call,                           LPVOID lpReserved         )   {    switch(ul_reason_for_call)    {    case DLL_PROCESS_ATTACH:     //if(sHook)           case DLL_PROCESS_DETACH:     UnInstallHook();     break;    }    hmodDll=hModule;       return TRUE;   }   / HookOneAPI 函数 /   //进行IAT转换的关键函数,其参数含义:   //pszCalleeModuleName:需要hook的模块名   //pfnOriginApiAddress:要替换的自己API函数的地址   //pfnDummyFuncAddress:需要hook的模块名的地址   //hModCallerModule:我们要查找的模块名称,如果没有被赋值,   //     将会被赋值为枚举的程序所有调用的模块   void WINAPI HookOneAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,            PROC pfnDummyFuncAddress,HMODULE hModCallerModule)   {    ULONG size;    //获取指向PE文件中的Import中IMAGE_DIRECTORY_DESCRIPTOR数组的指针    PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)     ImageDirectoryEntryToData(hModCallerModule,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);    if (pImportDesc == NULL)     return;    //查找记录,看看有没有我们想要的DLL    for (;pImportDesc->Name;pImportDesc++)    {     LPSTR pszDllName = (LPSTR)((PBYTE)hModCallerModule+pImportDesc->Name);     if (lstrcmpiA(pszDllName,pszCalleeModuleName) == 0)      break;    }    if (pImportDesc->Name == NULL)    {     return;    }    //寻找我们想要的函数    PIMAGE_THUNK_DATA pThunk =      (PIMAGE_THUNK_DATA)((PBYTE)hModCallerModule+pImportDesc->FirstThunk);//IAT    for (;pThunk->u1.Function;pThunk++)    {     //ppfn记录了与IAT表项相应的函数的地址     PROC * ppfn= (PROC *)&pThunk->u1.Function;       if (*ppfn == pfnOriginApiAddress)      {      //如果地址相同,也就是找到了我们想要的函数,进行改写,将其指向我们所定义的函数      WriteProcessMemory(GetCurrentProcess(),ppfn,&(pfnDummyFuncAddress),       sizeof(pfnDummyFuncAddress),NULL);      return;     }    }   }   //查找所挂钩的进程所应用的dll模块的   BOOL WINAPI HookAllAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,           PROC pfnDummyFuncAddress,HMODULE hModCallerModule)   {    if (pszCalleeModuleName == NULL)    {     return FALSE;    }    if (pfnOriginApiAddress == NULL)    {     return FALSE;    }    //如果没传进来要挂钩的模块名称,枚举被挂钩进程的所有引用的模块,    //并对这些模块进行传进来的相应函数名称的查找        if (hModCallerModule == NULL)    {     MEMORY_BASIC_INFORMATION mInfo;     HMODULE hModHookDLL;     HANDLE hSnapshot;     MODULEENTRY32 me = {sizeof(MODULEENTRY32)};     //MODULEENTRY32:描述了一个被指定进程所应用的模块的struct     VirtualQuery(HookOneAPI,&mInfo,sizeof(mInfo));     hModHookDLL=(HMODULE)mInfo.AllocationBase;          hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);     BOOL bOk = Module32First(hSnapshot,&me);     while (bOk)     {      if (me.hModule != hModHookDLL)      {       hModCallerModule = me.hModule;//赋值       //me.hModule:指向当前被挂钩进程的每一个模块        HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,        pfnDummyFuncAddress,hModCallerModule);      }      bOk = Module32Next(hSnapshot,&me);     }     return TRUE;      }    //如果传进来了,进行查找    else    {     HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,       pfnDummyFuncAddress,hModCallerModule);     return TRUE;    }    return FALSE;   }    UnhookAllAPIHooks 函数 /   //通过使pfnDummyFuncAddress与pfnOriginApiAddress相等的方法,取消对IAT的修改   BOOL WINAPI UnhookAllAPIHooks(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,            PROC pfnDummyFuncAddress,HMODULE hModCallerModule)   {    PROC temp;    temp = pfnOriginApiAddress;    pfnOriginApiAddress = pfnDummyFuncAddress;    pfnDummyFuncAddress = temp;    return HookAllAPI(pszCalleeModuleName,pfnOriginApiAddress,     pfnDummyFuncAddress,hModCallerModule);   }   // GetMsgProc 函数    //钩子子程。与其它钩子子程不大相同,没做什么有意义的事情,继续调用下一个钩子子程,形成循环   LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam)   {    return CallNextHookEx(hHook,code,wParam,lParam);   }    InstallHook 函数 /   //安装或卸载钩子,BOOL IsHook参数是标志位   //对要钩哪个API函数进行初始化   //我们这里装的钩子类型是WH_GETMESSAGE   void __declspec(dllexport) WINAPI InstallHook(BOOL IsHook,DWORD dwThreadId)   {    if(IsHook)    {    hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,dwThreadId);        //GetProcAddress(GetModuleHandle("GDI32.dll"),"ExtTextOutA"):取得要钩的函数在所在dll中的地址        HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),     "TextOutW"),(PROC)&H_TextOutW,NULL);    HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),     "TextOutA"),(PROC)&H_TextOutA,NULL);    }    else    {     UnInstallHook();     UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),      "TextOutW"),(PROC)&H_TextOutW,NULL);     UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),      "TextOutA"),(PROC)&H_TextOutA,NULL);    }   }   / UnInstallHook 函数    //卸载钩子   BOOL WINAPI UnInstallHook()   {    UnhookWindowsHookEx(hHook);    return TRUE;   }   / H_TextOutA 函数 /   //我们的替换函数,可以在里面实现我们所要做的功能   //这里我做的是显示一个对话框,指明是替换了哪个函数   BOOL WINAPI H_TextOutA(HDC hdc,int nXStart,int nYStart,LPCSTR lpString,int cbString)   {   //  FILE *stream=fopen("logfile.txt","a+t");    MessageBox(NULL,"TextOutA","APIHook_Dll ---rivershan",MB_OK);    TextOutA(hdc,nXStart,nYStart,lpString,cbString);//返回原来的函数,以显示字符   // fprintf(stream,lpString);   // fclose(stream);    return TRUE;   }   / H_TextOutW 函数 /   //同上   BOOL WINAPI H_TextOutW(HDC hdc,int nXStart,int nYStart,LPCWSTR lpString,int cbString)   {     MessageBox(NULL,"TextOutW","APIHook_Dll ---rivershan",MB_OK);    TextOutW(hdc,nXStart,nYStart,lpString,cbString);//返回原来的函数,以显示字符    return TRUE;   

设置全局钩子如下

InstallHook(TRUE,0);

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

VC++实现全局钩子勾住textout金山快译的原理实现相关推荐

  1. VC++实现全局钩子勾住消息对话框

    #ifndef _HOOKAPI_H #define _HOOKAPI_H class CHOOKAPI { public: LPVOID pOldFunEntry, pNewFunEntry ; / ...

  2. 金山快译 2007 下载-个人收藏专业版

    金山快译2007下载版客户端 http://dl2.it168.com/1809/IT168.com-15404FastAIT2007_2.rar   请点击右边下载 若不能正常下载请留言 电信下载 ...

  3. 实现金山快译工具条的自动收缩功能

    使用了二个API: GetCursorPos(lpPoint As POINTAPI) as Long ScreenToClient(ByVal hwnd As Long, lpPoint As PO ...

  4. Qt实现类似金山快译那种鼠标移到上方移动滑出的窗口(钩子函数)

    首先说移到屏幕上方是在windows上操作的,所以必须用到windows自己的api,这里用到了Windows的钩子函数: HHOOK WINAPI SetWindowsHookEx( __in in ...

  5. VC++ Hook截取鼠标点击窗口消息的问题!全局钩子

    VC++ Hook截取鼠标点击窗口消息的问题!全局钩子,高手进! 悬赏分:0 - 提问时间: 2010年05月19日 06时20分 我在做毕业设计,现在遇到一个问题,像求教高手: 我想实现如下功能,当 ...

  6. 通过全局钩子发送自定义消息,实现进程通信

    利用钩子进行进程通信,在网上搜了许多帖子还是不明所以. 没办法自己摸索了4,5天终于测试好了代码.写下来,希望不要有人像我这样云里雾里的在这上面浪费时间. 钩子的加载 使用函数SetWindowsHo ...

  7. [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入

    [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入 [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入 [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入 1.扫描枪获取数据原理基本 ...

  8. Xposed: 勾住(Hook) Android应用程序对象的方法,实现AOP

    Xposed Xposed能够勾住(Hook) Android应用程序对象的方法,实现AOP,一个简单的例子: public class WebViewHook implements IXposedH ...

  9. 【沟通的艺术】你能勾住你的听众么?

    作者:范军 (Frank Fan)新浪微博:@frankfan7 在技术演讲中,有人技术水平高,内容好,可演讲效果并不好.甚至有时听众根本都听不下去.我作为听众,很多次有想离席而去,可介于对演讲者和其 ...

最新文章

  1. 随行付微服务测试之静态代码扫描
  2. Centos6.8下搭建SVN服务器
  3. HTTP系列之:HTTP缓存
  4. GeneralUpdate 2021.08.14更新公告
  5. 系统视图和用户视图的区别_读书笔记——数据库系统概论
  6. 从本地文件系统迁移oracle数据库到ASM
  7. string转int的方法_Spark——scala 实用小方法
  8. 计算机视觉实战(十二)全景图像拼接(附完整代码)
  9. SFB 项目经验-35-分配公网证书 For Exchange Server 2016(图解)
  10. apple/ios 获取udid
  11. 【VBA研究】关于工作表单元格复制粘贴的语句
  12. SSL单向认证和双向认证
  13. PKM个人知识管理整理(一)
  14. 线条的样式solid dotted dashed
  15. STM32 定时器编码器模式时,如何理解编码器计数
  16. Android复习系列④之《Android进阶》
  17. 算法二十二:倒水问题
  18. android一行三列,Android -- listview实现一行多列效果
  19. 红米K50电竞版上手体验
  20. Android:多分辨率适配

热门文章

  1. 计算机网络--七层结构(三)会话、表示、应用层详解
  2. 关于数字化转型点、线、面、体方法论,重要知识点都在这里了
  3. 嵌入式开发之移植MQTT到RK3568
  4. 输入10个整数将其中最小的数与第1个数对换,把最大的数与最后一个数对换
  5. ZOJ 3872 Beauty of Array (The 12th Zhejiang Provincial Collegiate Programming Contest )
  6. 【考研经验】2018年跨考北邮网研初试经验分享 专硕398分
  7. 智能风控决策引擎系统架构设计与开发实践
  8. WWDC,夜深,给果粉,熬夜党发个视频娱乐一下
  9. css发动机的机滤,更换发动机机油滤清器步骤(图解)
  10. 大数据分析,足球运动的“料理师”