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,我是代码搬运工!原创哦!
感谢飘云! 沙发 又没有抢到沙发
又没有抢到沙发 膜拜 ~! {:handshake:}好强大的分享 楼主威武,不错额 {:lol:}谢谢小猪的源代码。学习了 有码就给力
{:lol:} 不懂前排围观