small-q 发表于 2014-9-23 09:50:40

msimg32 HOOK劫持源代码

本帖最后由 small-q 于 2014-9-23 10:08 编辑


// 头文件
#include <Windows.h>
#include "一个搜索算法.h"
#include "NtHookEngine.h"
#pragma comment(lib, "NtHookEngine_x86.lib")


//函数声明
VOID HookAPI();
VOID UnHookAPI();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//中转函数定义
#pragma comment(linker, "/EXPORT:vSetDdrawflag=_MsimgLib_vSetDdrawflag,@1")
#pragma comment(linker, "/EXPORT:AlphaBlend=_MsimgLib_AlphaBlend,@2")
#pragma comment(linker, "/EXPORT:DllInitialize=_MsimgLib_DllInitialize,@3")
#pragma comment(linker, "/EXPORT:GradientFill=_MsimgLib_GradientFill,@4")
#pragma comment(linker, "/EXPORT:TransparentBlt=_MsimgLib_TransparentBlt,@5")

// 宏定义
#define EXTERNC extern "C"
#define NAKED __declspec(naked)
#define EXPORT __declspec(dllexport)
#define ALCPP EXPORT NAKED
//#define ALSTD EXTERNC EXPORT NAKED void __stdcall
#define ALCFAST EXTERNC EXPORT NAKED void __fastcall
#define ALCDECL EXTERNC NAKED void __cdecl


// MsimgLib 命名空间
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace MsimgLib
{
      HMODULE m_hModule = NULL;
      DWORD m_dwReturn = {0};

      inline BOOL WINAPI Load()
      {
                TCHAR tzPath;
                TCHAR tzTemp;

                GetSystemDirectory(tzPath, MAX_PATH);
                lstrcat(tzPath, TEXT("\\msimg32.dll"));
                m_hModule = LoadLibrary(tzPath);
                if (m_hModule == NULL)
                {
                        wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
                        MessageBox(NULL, tzTemp, TEXT("MsimgLib"), MB_ICONSTOP);
                }

                return (m_hModule != NULL);      
      }
               

      inline VOID WINAPI Free()
      {
                if (m_hModule)
                {
                        FreeLibrary(m_hModule);
                }
      }


      FARPROC WINAPI GetAddress(PCSTR pszProcName)
      {
                FARPROC fpAddress;
                CHAR szProcName;
                TCHAR tzTemp;

                fpAddress = GetProcAddress(m_hModule, pszProcName);
                if (fpAddress == NULL)
                {
                        if (HIWORD(pszProcName) == 0)
                        {
                              wsprintf(szProcName, "%d", pszProcName);
                              pszProcName = szProcName;
                        }

                        wsprintf(tzTemp, TEXT("无法找到函数 %hs,程序无法正常运行。"), pszProcName);
                        //MessageBox(NULL, tzTemp, TEXT("MsimgLib"), MB_ICONSTOP);
                        ExitProcess(-2);
                }

                return fpAddress;
      }
}
using namespace MsimgLib;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//PATCH函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void PatchIt1()
{
      //OpenFolderAndSelectFileA((LPSTR)pos);
      //OpenFolderAndSelectFileW((LPWSTR)pos);
      //MessageBox(NULL, "Inject success!!!", "PiaoYun/P.Y.G", MB_OK);

      //MessageBoxW(NULL, L"开始!", L"P.Y.G", MB_OK);


}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//NtHook自定义函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef int (WINAPI *pfnSetThreadLocale)(INLCID Locale);

pfnSetThreadLocale Kernel_SetThreadLocale = SetThreadLocale;


int WINAPI MySetThreadLocale(INLCID Locale)
{
      //MessageBoxA(NULL, "进入HOOK了!", "hi", MB_OK);
      
       //一个搜索算法会得出结果= POS

      if ( pos != -1)
      {
                DWORD dwOldProtect;
                //HMODULE BaseAddr;
                DWORD PatchAddr;
                //BaseAddr = GetModuleHandle(NULL);
                PatchAddr = g_dwStartAddr + pos;//(INT64)BaseAddr + 0x1ABA;
               
                VirtualProtect((LPVOID)PatchAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);

                //MessageBoxA(NULL, "找着了,准备ASM写入", "hi", MB_OK);

                CHAR szTemp = {0};
                wsprintf(szTemp, "%.8X",pos);
                //MessageBox(NULL, szTemp, "", MB_OK);
                if (::OpenClipboard (NULL))
                {
                        ::EmptyClipboard ();
                        HANDLE hData = ::GlobalAlloc (GMEM_MOVEABLE, ::lstrlen (szTemp) + 1);
                        LPSTR pData = (LPSTR) ::GlobalLock (hData);
                        ::lstrcpy (pData, szTemp);
                        ::GlobalUnlock (hData);
                        ::SetClipboardData (CF_TEXT, hData);
                        ::CloseClipboard ();
                }

                UnHookAPI();//不需要用时要解除NTHOOK


                __asm
                {
                        MOV EDX,PatchAddr
                        add edx,0xF
                        MOV DWORD PTR DS:,0x90909090
                        add edx,0x4
                        MOV ,0x90
                }

      }
      else
      {
                CHAR szTemp = {0};
                wsprintf(szTemp, "%.8X",pos);
                //MessageBox(NULL, szTemp, "", MB_OK);
                        if (::OpenClipboard (NULL))
                        {
                              ::EmptyClipboard ();
                              HANDLE hData = ::GlobalAlloc (GMEM_MOVEABLE, ::lstrlen (szTemp) + 1);
                              LPSTR pData = (LPSTR) ::GlobalLock (hData);
                              ::lstrcpy (pData, szTemp);
                              ::GlobalUnlock (hData);
                              ::SetClipboardData (CF_TEXT, hData);
                              ::CloseClipboard ();
                        }

      }      

      Kernel_SetThreadLocale = (pfnSetThreadLocale)GetOriginalFunction((ULONG_PTR) MySetThreadLocale);

      return Kernel_SetThreadLocale(Locale);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//NtHook函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
VOID HookAPI()
{
      NtHookEngineInit();
      HookFunction((ULONG_PTR)Kernel_SetThreadLocale,(ULONG_PTR) &MySetThreadLocale);   
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//NtHook解除函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
VOID UnHookAPI()
{
      UnhookFunction((ULONG_PTR)Kernel_SetThreadLocale);   
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 入口函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
      switch (dwReason)
      {
      caseDLL_PROCESS_ATTACH:
                {
                        DisableThreadLibraryCalls(hModule);
                        if(Load())
                        {
                              HookAPI();//从最开始的地方HOOK
                              PatchIt1();//自定义PATCH点
                              
                        }
                        else
                              return FALSE;

                        break;
                }
      case DLL_PROCESS_DETACH:
                {
                        Free();
                        break;
                }
      }

      return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//中转函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MsimgLib_vSetDdrawflag(void)
{
      __asm POP m_dwReturn;

      GetAddress("vSetDdrawflag")();

      __asm JMP m_dwReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MsimgLib_AlphaBlend(void)
{      
      __asm POP m_dwReturn;

      GetAddress("AlphaBlend")();

      __asm JMP m_dwReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MsimgLib_DllInitialize(void)
{
      __asm POP m_dwReturn;

      GetAddress("DllInitialize")();

      __asm JMP m_dwReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MsimgLib_GradientFill(void)
{
      __asm POP m_dwReturn;

      GetAddress("GradientFill")();

      __asm JMP m_dwReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MsimgLib_TransparentBlt(void)
{
      __asm POP m_dwReturn;

      GetAddress("TransparentBlt")();

      __asm JMP m_dwReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

说明:此代码出自我的VS2013,我是代码搬运工!原创哦!
感谢飘云!

GGLHY 发表于 2014-9-23 09:52:19

沙发

crackvip 发表于 2014-9-23 09:56:00

又没有抢到沙发

cassio 发表于 2014-9-23 10:04:17


又没有抢到沙发

Nisy 发表于 2014-9-23 10:11:42

膜拜 ~!

cjteam 发表于 2014-9-23 11:00:43

{:handshake:}好强大的分享

gujin162 发表于 2014-9-23 11:03:19

楼主威武,不错额

Dxer 发表于 2014-9-23 12:52:03

{:lol:}谢谢小猪的源代码。学习了

wgz001 发表于 2014-9-23 13:11:37

有码就给力
{:lol:}

whypro 发表于 2014-9-23 13:38:52

不懂前排围观
页: [1] 2 3 4
查看完整版本: msimg32 HOOK劫持源代码