首页
社区
课程
招聘
[原创]打造史上最完整APIHOOK完整开发库
发表于: 2010-10-16 22:53 65257

[原创]打造史上最完整APIHOOK完整开发库

2010-10-16 22:53
65257
收藏
免费 7
支持
分享
最新回复 (53)
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
不错,学习学习
2010-10-18 15:25
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
学习了~~   
2010-10-18 19:46
0
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
下面这段代码好像就是汇编JMP (机器E9),可以拦截 输入法,比如可以翻译输入的中文为火星文的。用楼主的 APIhook是否可以实现同样的功能呢?还是不太懂楼主的最后的那个例子:(
楼主的库看上去应该更强一些啊。

还有,这个DLL好像没法调试??
===============
bool HookApi(LPCTSTR strDllName,LPCTSTR strFunName,int lngFunAddr)
        {
                hookBeOK=false;
                HMODULE hModule=NULL;
                int dwJmpAddr=0;
                hModule=GetModuleHandle(strDllName);
                if (hModule==NULL) {return false;}
                mlngFunAddr=(int)GetProcAddress(hModule,strFunName);
                if (mlngFunAddr==NULL) {return false;}
                CopyMemory(mbytOldCode,(const void *)mlngFunAddr,5);
                mbytNewCode[0]=0xE9;
                dwJmpAddr=lngFunAddr-mlngFunAddr-5;
                CopyMemory(&mbytNewCode[1],&dwJmpAddr,4);
                hookBeOK=true;
                HookStatus(true);
                return true;
        }

===========

这个是完整的代码。
//hxwdllwx.cpp
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"imm32.lib")

#pragma data_seg("mysechx")
HHOOK g_hKeyboard=NULL;
HWND g_hMainhWnd=NULL;
char g_IMEString[256]="";
bool g_HOOKflag=false;
#pragma data_seg()

class clsHookInfo
{
private:
        BYTE mbytOldCode[5];
        BYTE mbytNewCode[5];
        int mlngFunAddr;
        bool hookBeOK;
public:
        bool HookApi(LPCTSTR strDllName,LPCTSTR strFunName,int lngFunAddr)
        {
                hookBeOK=false;
                HMODULE hModule=NULL;
                int dwJmpAddr=0;
                hModule=GetModuleHandle(strDllName);
                if (hModule==NULL) {return false;}
                mlngFunAddr=(int)GetProcAddress(hModule,strFunName);
                if (mlngFunAddr==NULL) {return false;}
                CopyMemory(mbytOldCode,(const void *)mlngFunAddr,5);
                mbytNewCode[0]=0xE9;
                dwJmpAddr=lngFunAddr-mlngFunAddr-5;
                CopyMemory(&mbytNewCode[1],&dwJmpAddr,4);
                hookBeOK=true;
                HookStatus(true);
                return true;
        }
        bool HookStatus(bool blnIsHook)
        {
                DWORD oldACC,newACC;
                if (!hookBeOK) {return false;}
                if (blnIsHook)
                {
                        VirtualProtect((LPVOID)mlngFunAddr,5,PAGE_WRITECOPY,&oldACC);
                        CopyMemory((void *)mlngFunAddr,mbytNewCode,5);
                        VirtualProtect((LPVOID)mlngFunAddr,5,oldACC,&newACC);
                }
                else
                {
                        VirtualProtect((LPVOID)mlngFunAddr,5,PAGE_WRITECOPY,&oldACC);
                        CopyMemory((void *)mlngFunAddr,mbytOldCode,5);
                        VirtualProtect((LPVOID)mlngFunAddr,5,oldACC,&newACC);
                }
                return true;
        }
};

clsHookInfo g_myHOOK1;
clsHookInfo g_myHOOK2;
char g_StringBuf1[256]="";
char g_StringBuf2[256]="";
UINT WM_HXWDLLWX_QQBTX=NULL;
UINT WM_HXWDLLWX_HOOKKEY=NULL;

BOOL MByteToWChar(LPCSTR lpcszStr,LPWSTR lpwszStr,DWORD dwSize)
{
    DWORD dwMinSize;
    dwMinSize = MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, NULL, 0);
    if(dwSize < dwMinSize)
    {
     return FALSE;
    }
    MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
    return TRUE;
}

BOOL WCharToMByte(LPCWSTR lpcwszStr,LPSTR lpszStr,DWORD dwSize)
{
   DWORD dwMinSize;
   dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
   if(dwSize < dwMinSize)
   {
    return FALSE;
   }
   WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
   return TRUE;
}

LONG WINAPI myImmGetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
{
        LONG myReturn=0;
        LONG tempLen=0;
        int StrBufLen=0;
        if (dwIndex==GCS_RESULTSTR && g_HOOKflag)
        {
                memset(g_IMEString,0,256);
                tempLen=255;
                g_myHOOK1.HookStatus(false);
                ImmGetCompositionStringA(hIMC,GCS_RESULTSTR,g_IMEString,tempLen);
                g_myHOOK1.HookStatus(true);
                g_IMEString[tempLen]=0;
                if (lstrcmp(g_IMEString,g_StringBuf1)!=0)
                {
                        memset(g_StringBuf1,0,256);
                        lstrcpy(g_StringBuf1,g_IMEString);
                        SendMessage(g_hMainhWnd,WM_HXWDLLWX_QQBTX,0,0);
                        memset(g_StringBuf2,0,256);
                        lstrcpy(g_StringBuf2,g_IMEString);
                }
                if (lpBuf==NULL || dwBufLen==0)
                {
                        myReturn=lstrlen(g_StringBuf2);
                }
                else
                {
                        StrBufLen=lstrlen(g_StringBuf2);
                        memset(lpBuf,0,dwBufLen);
                        if (dwBufLen>=StrBufLen)
                        {
                                dwBufLen=StrBufLen;
                                myReturn=StrBufLen;
                        }
                        else
                        {
                                myReturn=0;
                        }
                        memcpy(lpBuf,g_StringBuf2,dwBufLen);
                }
        }
        else
        {
                g_myHOOK1.HookStatus(false);
                myReturn=ImmGetCompositionStringA(hIMC,dwIndex,lpBuf,dwBufLen);
                g_myHOOK1.HookStatus(true);
        }
        return myReturn;
}

LONG WINAPI myImmGetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
{
        LONG myReturn=0;
        LONG tempLen=0;
        int StrBufLen=0;
        if (dwIndex==GCS_RESULTSTR && g_HOOKflag)
        {
                memset(g_IMEString,0,256);
                tempLen=254;
                g_myHOOK2.HookStatus(false);
                ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,g_IMEString,tempLen);
                g_myHOOK2.HookStatus(true);
                g_IMEString[254]=0;
                g_IMEString[255]=0;
                if (lstrcmpW((wchar_t *)g_IMEString,(wchar_t *)g_StringBuf1)!=0)
                {
                        memset(g_StringBuf1,0,256);
                        lstrcpyW((wchar_t *)g_StringBuf1,(wchar_t *)g_IMEString);
                        WCharToMByte((wchar_t *)g_StringBuf1,g_IMEString,256);
                        SendMessage(g_hMainhWnd,WM_HXWDLLWX_QQBTX,0,0);
                        memset(g_StringBuf2,0,256);
                        MByteToWChar(g_IMEString,(wchar_t *)g_StringBuf2,128);
                }
                if (lpBuf==NULL || dwBufLen==0)
                {
                        myReturn=lstrlenW((wchar_t *)g_StringBuf2)*2;
                }
                else
                {
                        StrBufLen=lstrlenW((wchar_t *)g_StringBuf2)*2;
                        memset(lpBuf,0,dwBufLen);
                        if (dwBufLen>=StrBufLen)
                        {
                                dwBufLen=StrBufLen;
                                myReturn=StrBufLen;
                        }
                        else
                        {
                                myReturn=0;
                        }
                        memcpy(lpBuf,g_StringBuf2,dwBufLen);
                }
        }
        else
        {
                g_myHOOK2.HookStatus(false);
                myReturn=ImmGetCompositionStringW(hIMC,dwIndex,lpBuf,dwBufLen);
                g_myHOOK2.HookStatus(true);
        }
        return myReturn;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
   switch(fdwReason)
    {
      case DLL_PROCESS_ATTACH:
                  WM_HXWDLLWX_QQBTX=RegisterWindowMessage("WM_HXWDLLWX_QQBTX");
                  WM_HXWDLLWX_HOOKKEY=RegisterWindowMessage("WM_HXWDLLWX_HOOKKEY");
                  g_myHOOK1.HookApi("imm32.dll","ImmGetCompositionStringA",(int)myImmGetCompositionStringA);
                  g_myHOOK2.HookApi("imm32.dll","ImmGetCompositionStringW",(int)myImmGetCompositionStringW);
        break;
          case DLL_THREAD_ATTACH:
                 break;
          case DLL_THREAD_DETACH:
                 break;
      case DLL_PROCESS_DETACH:
                  g_myHOOK1.HookStatus(false);
                  g_myHOOK2.HookStatus(false);
        break;
      default:
        break;
    }
        return true;
}

LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
        if (code==0 && g_HOOKflag)
        {
                SendMessage(g_hMainhWnd,WM_HXWDLLWX_HOOKKEY,wParam,lParam);
        }
        return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
}

void setHOOK()
{
        g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("hxwdllwx.dll"),0);
}

int WINAPI DLLstartHOOK(HWND myhWnd)
{
        if (g_hMainhWnd==NULL)
        {
                g_hMainhWnd=myhWnd;
        }
        return 1;
}

int WINAPI DLLstopHOOK()
{
        if (g_hKeyboard!=NULL)
        {
                UnhookWindowsHookEx(g_hKeyboard);
                g_hKeyboard=NULL;
        }
        return 1;
}

int WINAPI DLLsetHOOKState(bool myState)
{
        if (myState)
        {
                if (g_hKeyboard==NULL)
                {
                        setHOOK();
                }
                g_HOOKflag=true;
        }
        else
        {
                g_HOOKflag=false;
        }
        return 1;
}

LPCTSTR WINAPI DLLGetPubString()
{
        char tmpStr[258]="";
        lstrcpy(tmpStr,g_IMEString);
        tmpStr[256]=0;
        tmpStr[257]=0;
        return (LPCTSTR)SysAllocString((const OLECHAR *)tmpStr);
}

int WINAPI DLLSetPubString(LPCTSTR tmpStr)
{
        memset(g_IMEString,0,256);
        if (lstrlen(tmpStr)>255)
        {
                lstrcpyn(g_IMEString,tmpStr,256);
        }
        else
        {
                lstrcpy(g_IMEString,tmpStr);
        }
        return 1;
}
2010-10-18 20:55
0
雪    币: 168
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
强大,赞一个
2010-10-18 22:14
0
雪    币: 202
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
内容较详细,就是题目有点唬人
2010-10-19 09:27
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
进来学习,看一下
2010-10-19 09:52
0
雪    币: 2
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
为打游戏屏蔽win键,学习之。
2010-10-19 10:06
0
雪    币: 1600
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
这种HOOK还能有用?  现在随便什么都能检测的到
2010-10-20 06:59
0
雪    币: 348
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
这个看的我有点晕!
2010-10-21 09:52
0
雪    币: 16
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
hThread = ::CreateRemoteThread(hProcess, NULL, 0, pfnThreadRoutine, (LPVOID)hModule, 0, NULL);
        if (hThread == NULL)
            break;
        //等待远程线程终止
::WaitForSingleObject(hThread, INFINITE);
这段代码在XP 下没问题,但是在win7下 远程线程结束时不会置为信号态(线程确实结束了),也就是说 会永久等待
2010-10-21 12:18
0
雪    币: 2347
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
学习一下。
2010-10-21 19:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
有空了好好学习下,辛苦了
2010-10-22 01:11
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
正在学习这方面的东西,谢谢分享
2010-10-22 17:34
0
雪    币: 126
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
mark一个
2010-10-24 16:56
0
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
40
论坛有收藏功能
2010-10-24 17:04
0
雪    币: 318
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
41
这也太强悍了
2010-10-25 14:20
0
雪    币: 126
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
mark!
2010-10-25 22:46
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
不管别人怎么说,就从LZ的精神,我支持你。
2010-10-27 11:44
0
雪    币: 163
活跃值: (75)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
44
刚想说试试detours吧......点进去学习之
2010-10-28 20:33
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
45


怪不得写了这么多字。。。都混到精化。。。

写滴太罗嗦。。。概念都含糊。。。 这不是小学作文考试。。。添够字数就能得分。。。

把简单滴问题复杂化。把复杂滴问题简单化。   技术文章滴败笔。。。
2010-11-17 15:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
46
很不错的东西,核心一书中的错误不知道耽误的多少新手,**
2010-11-17 16:21
0
雪    币: 208
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
where?
2010-11-22 23:26
0
雪    币: 49
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
谢谢分享。收藏了。
2010-11-23 19:26
0
雪    币: 292
活跃值: (126)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
49
列位看官,人家贴了源码也贴解释的也花不少时间咯,虽然有点标题党的嫌疑,不过精神值得褒奖吧!
2010-11-23 21:54
0
雪    币: 189
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
感谢楼猪!
2010-11-25 08:27
0
游客
登录 | 注册 方可回帖
返回