TA的每日心情 | 奋斗 2016-1-13 12:25 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
|
本帖最后由 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[5] = {0};
- inline BOOL WINAPI Load()
- {
- TCHAR tzPath[MAX_PATH];
- TCHAR tzTemp[MAX_PATH * 2];
- 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[16];
- TCHAR tzTemp[MAX_PATH];
- 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)(IN LCID Locale);
- pfnSetThreadLocale Kernel_SetThreadLocale = SetThreadLocale;
- int WINAPI MySetThreadLocale(IN LCID 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[MAX_PATH] = {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:[EDX],0x90909090
- add edx,0x4
- MOV [EDX],0x90
- }
- }
- else
- {
- CHAR szTemp[MAX_PATH] = {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)
- {
- case DLL_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[0 * TYPE long];
- GetAddress("vSetDdrawflag")();
- __asm JMP m_dwReturn[0 * TYPE long];
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ALCDECL MsimgLib_AlphaBlend(void)
- {
- __asm POP m_dwReturn[1 * TYPE long];
- GetAddress("AlphaBlend")();
- __asm JMP m_dwReturn[1 * TYPE long];
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ALCDECL MsimgLib_DllInitialize(void)
- {
- __asm POP m_dwReturn[2 * TYPE long];
- GetAddress("DllInitialize")();
- __asm JMP m_dwReturn[2 * TYPE long];
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ALCDECL MsimgLib_GradientFill(void)
- {
- __asm POP m_dwReturn[3 * TYPE long];
- GetAddress("GradientFill")();
- __asm JMP m_dwReturn[3 * TYPE long];
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ALCDECL MsimgLib_TransparentBlt(void)
- {
- __asm POP m_dwReturn[4 * TYPE long];
- GetAddress("TransparentBlt")();
- __asm JMP m_dwReturn[4 * TYPE long];
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
复制代码
说明:此代码出自我的VS2013,我是代码搬运工!原创哦!
感谢飘云! |
评分
-
查看全部评分
|