吐槽一下:CF窗口化解除鼠标限制DLL msimg32.dll的源代码发布。~

社区服务
高级搜索
猴岛论坛CF穿越火线吐槽一下:CF窗口化解除鼠标限制DLL msimg32.dll的源代码发布。~
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
42个回复

吐槽一下:CF窗口化解除鼠标限制DLL msimg32.dll的源代码发布。~

楼层直达
小枫工作组

ZxID:17878826

等级: 上尉
举报 只看楼主 使用道具 楼主   发表于: 2012-10-20 0
— 本帖被 清风沐竹 执行压帖操作(2013-10-21) —
这个没有窗口化,这个仅仅是解除鼠标限制的代码,要窗口化的朋友不用看了,以下是头文件:
  1. #ifndef __APIHOOK
  2. #define __APIHOOK
  3. #include <windows.h>
  4. // APIHook类
  5. class APIHook
  6. {
  7. private:
  8. TCHAR m_szModName[256];
  9. char m_szProcName[256];
  10. PROC m_dwProcAddress;
  11. PROC m_dwNewProcAddress;
  12. byte *m_pBytesGoBack;
  13. byte m_bytesGoHookProc[5];
  14. bool m_bInitialed;
  15. bool m_bHooked;
  16. public:
  17. APIHook()
  18. {
  19.   m_bInitialed = false;
  20.   m_bHooked = false;
  21. }
  22. ~APIHook()
  23. {
  24.   
  25.   if ( m_bHooked )
  26.    UnHook();
  27. }
  28. bool InitHook(TCHAR *szModName, const char *szProcName, PROC dwNewProcAddress)
  29. {
  30.   
  31.   if ( m_bHooked )
  32.    UnHook();
  33.   if ( szModName == NULL || szProcName == NULL )
  34.    return false;
  35.   
  36.   HMODULE hMod = GetModuleHandle( szModName );
  37.   if ( !hMod )
  38.   {
  39.    hMod = LoadLibrary( szModName );
  40.    if ( !hMod )
  41.     return false;
  42.   }
  43.   
  44.   m_dwProcAddress = (PROC)GetProcAddress( hMod, szProcName );
  45.   if ( m_dwProcAddress == 0 )
  46.   {
  47.    CloseHandle( hMod );
  48.    return false;
  49.   }
  50.   
  51.   strcpy( m_szModName, szModName );
  52.   strcpy( m_szProcName, szProcName );
  53.   m_dwNewProcAddress = dwNewProcAddress;
  54.   m_bInitialed = true;
  55.   return true;
  56. }
  57. bool Hook()
  58. {
  59.   
  60.   if ( !m_bInitialed )
  61.    return false;
  62.   
  63.   if ( m_bHooked )
  64.    UnHook();
  65.   
  66.      m_pBytesGoBack = (byte *)VirtualAlloc( NULL, 10, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );  
  67.   if ( NULL == m_pBytesGoBack )
  68.    return false;
  69.   HANDLE hProcess = GetCurrentProcess();
  70.   
  71.   if ( !ReadProcessMemory(hProcess, (LPCVOID)m_dwProcAddress, m_pBytesGoBack, 5, NULL) )
  72.    return false;
  73.   
  74.   m_pBytesGoBack[5] = 0xe9;
  75.   int nDistance = (int)m_dwProcAddress - (int)m_pBytesGoBack - 5;
  76.   memcpy( m_pBytesGoBack + 6, &nDistance, 4 );
  77.   
  78.   m_bytesGoHookProc[0] = 0xe9;
  79.   nDistance = (int)m_dwNewProcAddress - (int)m_dwProcAddress - 5;
  80.   memcpy( m_bytesGoHookProc + 1, &nDistance, 4 );
  81.   
  82.   if ( !WriteProcessMemory(hProcess, (LPVOID)m_dwProcAddress, m_bytesGoHookProc, 5, NULL) )
  83.    return false;
  84.   m_bHooked = true;
  85.   return true;
  86. }
  87. void UnHook()
  88. {
  89.   if ( m_bHooked )
  90.   {
  91.    HANDLE hProcess = GetCurrentProcess();
  92.   
  93.    if ( m_pBytesGoBack != NULL )
  94.    {
  95.     
  96.     WriteProcessMemory(hProcess, (LPVOID)m_dwProcAddress, m_pBytesGoBack, 5, NULL);
  97.     VirtualFree( m_pBytesGoBack, 0, MEM_RELEASE );
  98.     m_pBytesGoBack = NULL;
  99.    }
  100.    m_bHooked = false;
  101.   }
  102. }
  103.     inline void CallOriginFunction(int &nRetValue, unsigned int nParamCount, ...)
  104. {
  105.   if ( nParamCount > 0 )
  106.   {
  107.    LPVOID *pParamArray = new LPVOID[nParamCount];
  108.   
  109.    va_list params;
  110.    va_start( params, nParamCount );
  111.     for ( unsigned int i = 0; i < nParamCount; ++i )
  112.     {
  113.      pParamArray[nParamCount - i - 1] = (LPVOID)va_arg( params, LPVOID );
  114.     }
  115.    va_end( params );
  116.   
  117.    for ( unsigned int u = 0; u < nParamCount; ++u )
  118.    {
  119.     LPVOID param = pParamArray[u];
  120.     __asm
  121.     {
  122.      push param
  123.     }
  124.    }
  125.    delete[] pParamArray;
  126.   }
  127.   DWORD dwAddr = (DWORD)m_pBytesGoBack;
  128.   int nRet = -1;
  129.   
  130.   __asm
  131.   {
  132.    call dwAddr
  133.    mov nRet, eax
  134.   }
  135.   nRetValue = nRet;
  136. }
  137. PROC GetOriginFunction()
  138. {
  139.   return m_dwProcAddress;
  140. }
  141. };
  142. #endif

以下是msimg32源文件:
  1. // 头文件
  2. #include <Windows.h>
  3. #include "APIHOOKCLASS.H"
  4. #pragma comment(linker, "/EXPORT:vSetDdrawflag=_MsimgLib_vSetDdrawflag,@1")
  5. #pragma comment(linker, "/EXPORT:AlphaBlend=_MsimgLib_AlphaBlend,@2")
  6. #pragma comment(linker, "/EXPORT:DllInitialize=_MsimgLib_DllInitialize,@3")
  7. #pragma comment(linker, "/EXPORT:GradientFill=_MsimgLib_GradientFill,@4")
  8. #pragma comment(linker, "/EXPORT:TransparentBlt=_MsimgLib_TransparentBlt,@5")
  9. // 宏定义
  10. #define EXTERNC extern "C"
  11. #define NAKED __declspec(naked)
  12. #define EXPORT __declspec(dllexport)
  13. #define ALCPP EXPORT NAKED
  14. #define ALSTD EXTERNC EXPORT NAKED void __stdcall
  15. #define ALCFAST EXTERNC EXPORT NAKED void __fastcall
  16. #define ALCDECL EXTERNC NAKED void __cdecl
  17. APIHook hook;
  18. // MsimgLib 命名空间
  19. namespace MsimgLib
  20. {
  21.     HMODULE m_hModule = NULL;
  22.     DWORD m_dwReturn[5] = {0};
  23.     inline BOOL WINAPI Load()
  24.     {
  25.         TCHAR tzPath[MAX_PATH];
  26.         TCHAR tzTemp[MAX_PATH * 2];
  27.         GetSystemDirectory(tzPath, MAX_PATH);
  28.         lstrcat(tzPath, TEXT("\\msimg32"));
  29.         m_hModule = LoadLibrary(tzPath);
  30.         if (m_hModule == NULL)
  31.         {
  32.             wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
  33.             MessageBox(NULL, tzTemp, TEXT("MsimgLib"), MB_ICONSTOP);
  34.         }
  35.         return (m_hModule != NULL);    
  36.     }
  37.         
  38.     inline VOID WINAPI Free()
  39.     {
  40.         if (m_hModule)
  41.         {
  42.             FreeLibrary(m_hModule);
  43.         }
  44.     }
  45.     FARPROC WINAPI GetAddress(PCSTR pszProcName)
  46.     {
  47.         FARPROC fpAddress;
  48.         CHAR szProcName[16];
  49.         TCHAR tzTemp[MAX_PATH];
  50.         fpAddress = GetProcAddress(m_hModule, pszProcName);
  51.         if (fpAddress == NULL)
  52.         {
  53.             if (HIWORD(pszProcName) == 0)
  54.             {
  55.                 wsprintf(szProcName, "%d", pszProcName);
  56.                 pszProcName = szProcName;
  57.             }
  58.             wsprintf(tzTemp, TEXT("无法找到函数 %hs,程序无法正常运行。"), pszProcName);
  59.             //MessageBox(NULL, tzTemp, TEXT("MsimgLib"), MB_ICONSTOP);
  60.             ExitProcess(-2);
  61.         }
  62.         return fpAddress;
  63.     }
  64. }
  65. using namespace MsimgLib;
  66. BOOL MyClipCursor(CONST RECT * lpRect)
  67. {
  68.     int ret = FALSE;
  69.     hook.CallOriginFunction(ret,1,NULL);
  70.     return ret;
  71. }
  72. // 入口函数
  73. BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
  74. {
  75.     char szFileName[MAX_PATH] = { 0 };
  76.     char szProcessName[MAX_COMPUTERNAME_LENGTH] = { 0 };
  77.     if (dwReason == DLL_PROCESS_ATTACH)
  78.     {
  79.         GetModuleFileName(NULL,szFileName,MAX_PATH);
  80.         int nStrLen = strlen(szFileName);
  81.         for(int i = nStrLen; i > 0; i--)
  82.         {
  83.             if (szFileName[i] == '\\')
  84.             {
  85.                 strcpy(szProcessName,&szFileName[i+1]);
  86.                 break;
  87.             }
  88.         }
  89.         if (strcmp(szProcessName,"crossfire.exe") == 0)
  90.         {
  91.             if (hook.InitHook( TEXT("User32"), "ClipCursor", (PROC)MyClipCursor ) == false)
  92.             {
  93.                 MessageBox(NULL, TEXT("msimg32 Init Faild!"), TEXT("MsimgLib"), MB_ICONSTOP);
  94.             }
  95.             ;
  96.             ClipCursor(NULL);
  97.             if (hook.Hook() == false)
  98.             {
  99.                 MessageBox(NULL, TEXT("msimg32 Run Faild!"), TEXT("MsimgLib"), MB_ICONSTOP);
  100.             }
  101.             ClipCursor(NULL);
  102.         };
  103.         DisableThreadLibraryCalls(hModule);
  104.         return Load();
  105.     }
  106.     else if (dwReason == DLL_PROCESS_DETACH)
  107.     {
  108.         Free();
  109.         hook.UnHook();
  110.         hook.~APIHook();
  111.     }
  112.     return TRUE;
  113. }
  114. ALCDECL MsimgLib_vSetDdrawflag(void)
  115. {
  116.     
  117.     __asm POP m_dwReturn[0 * TYPE long];
  118.     
  119.     GetAddress("vSetDdrawflag")();
  120.     
  121.     __asm JMP m_dwReturn[0 * TYPE long];
  122. }
  123. ALCDECL MsimgLib_AlphaBlend(void)
  124. {
  125.     
  126.     __asm POP m_dwReturn[1 * TYPE long];
  127.     
  128.     GetAddress("AlphaBlend")();
  129.     
  130.     __asm JMP m_dwReturn[1 * TYPE long];
  131. }
  132. ALCDECL MsimgLib_DllInitialize(void)
  133. {
  134.     
  135.     __asm POP m_dwReturn[2 * TYPE long];
  136.     
  137.     GetAddress("DllInitialize")();
  138.     
  139.     __asm JMP m_dwReturn[2 * TYPE long];
  140. }
  141. ALCDECL MsimgLib_GradientFill(void)
  142. {
  143.     
  144.     __asm POP m_dwReturn[3 * TYPE long];
  145.     
  146.     GetAddress("GradientFill")();
  147.     
  148.     __asm JMP m_dwReturn[3 * TYPE long];
  149. }
  150. ALCDECL MsimgLib_TransparentBlt(void)
  151. {
  152.     
  153.     __asm POP m_dwReturn[4 * TYPE long];
  154.     
  155.     GetAddress("TransparentBlt")();
  156.     
  157.     __asm JMP m_dwReturn[4 * TYPE long];
  158. }


附上完整源代码,vc6工程可直接编译。~
msimg32.rar[点击下载](9 K) 下载次数:31 累计下载获得 DB 58

附上已经编译好的dll,放入CF目录可直接解除窗口化鼠标限制,要写窗口化的朋友可以考虑把这个dll注入到crossfire.exe。
msimg32.rar[点击下载](16 K) 下载次数:37 累计下载获得 DB 68

结贴,收功。
元芳,你怎么看?
本帖de评分: 3 条评分 DB +5
DB+1 2012-10-22

额 怎么找到的,!

DB+1 2012-10-21

牛人

DB+3 2012-10-20

精品文章

无奈^

ZxID:1545768

等级: 上将
多问凭什么                         少问为什么         

举报 只看该作者 沙发   发表于: 2012-10-20 0
谢谢分享。
揪掉你的鸡儿

ZxID:1080

等级: 元老

举报 只看该作者 板凳   发表于: 2012-10-20 0
看J8看
     _y

ZxID:17939641

等级: 元帅
安全密码 仓库0218

举报 只看该作者 地板   发表于: 2012-10-20 0
谢谢分享
.
小枫工作组

ZxID:17878826

等级: 上尉
举报 只看该作者 4楼  发表于: 2012-10-20 0
引用
引用第1楼无奈^于2012-10-20 16:07发表的  :
谢谢分享。

哥哥,你的手好快呀,妹妹受不了。。。刚发就回了。。
本帖de评分: 1 条评分 DB +3
DB+3 2012-10-20

- -刚刚刷新就看到你的了

Arivn9

ZxID:19343277

等级: 上将
配偶: 败★小晴

举报 只看该作者 5楼  发表于: 2012-10-20 0
哇啊啊啊
小枫工作组

ZxID:17878826

等级: 上尉
举报 只看该作者 6楼  发表于: 2012-10-20 0
引用
引用第2楼动手就打头于2012-10-20 16:08发表的  :
看J8看

卧哦槽....现在的元芳都好屌的呀...被问烦了。

际遇之神

奖励

小枫工作组 路遇凹凸曼打小怪兽,分得10DB

卡卡bug

ZxID:9015531

等级: 上校
配偶: 菊花世界
[^_^]CShell.dll 好好吃[^_^]
举报 只看该作者 7楼  发表于: 2012-10-21 0
VC的解除鼠標限制...會內存錯誤
[ 此帖被卡卡bug在2012-10-21 17:55重新编辑 ]
[^_^]CShell.dll 好好吃[^_^]
常在 

ZxID:20647001

等级: 大将
新人请加QQ群:585213189

举报 只看该作者 8楼  发表于: 2012-10-21 0
新人请加QQ群:585213189
小枫工作组

ZxID:17878826

等级: 上尉
举报 只看该作者 9楼  发表于: 2012-10-21 0
回 7楼(卡卡bug) 的帖子
我倒没遇到这个问题,其实用什么语言都是一样的。只是我比较喜欢VC的感觉。
     花花

ZxID:20261349

等级: 上将
软件代做。价格面谈。

举报 只看该作者 10楼  发表于: 2012-10-22 0
额 怎么找到的,!
小枫工作组

ZxID:17878826

等级: 上尉
举报 只看该作者 11楼  发表于: 2012-10-22 0
回 10楼(     花花) 的帖子
写的呗,还能怎么找。
you_ know

ZxID:16905352

等级: 新兵
举报 只看该作者 12楼  发表于: 2012-10-24 0
木有db啊啊啊
zou19940707

ZxID:18172528

等级: 上等兵
举报 只看该作者 13楼  发表于: 2012-11-09 0
我要我要要要要亚欧要
qq1132421

ZxID:2981952

等级: 上等兵
举报 只看该作者 14楼  发表于: 2012-11-21 0
fdsafafdsaf32fweafew
qq1132421

ZxID:2981952

等级: 上等兵
举报 只看该作者 15楼  发表于: 2012-11-21 0
rewqreqr442erewr
dong8023niu

ZxID:16574341

等级: 新兵
举报 只看该作者 16楼  发表于: 2012-11-21 0
            
YY1135501

ZxID:19846377

等级: 新兵
举报 只看该作者 17楼  发表于: 2013-01-26 0
顶你顶你
顶你顶你
本文来自猴岛游戏论坛 :http://bbs.houdao.com/r6895904_u19846377/顶你顶你
本文来自猴岛游戏论坛 :http://bbs.houdao.com/r6895904_u19846377/顶你顶你
本文来自猴岛游戏论坛 :http://bbs.houdao.com/r6895904_u19846377/顶你顶你
渊栀

ZxID:9088765

等级: 元老

举报 只看该作者 18楼  发表于: 2013-01-26 0
真心不懂。
一个不想

ZxID:22709708

等级: 大校
也许,伤得彻底,是为了放得彻底!

举报 只看该作者 19楼  发表于: 2013-01-26 0
路过

际遇之神

奖励

一个不想 路遇凹凸曼打小怪兽,分得10DB

« 返回列表
发帖 回复