飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 18848|回复: 32

msimg32 HOOK劫持源代码

[复制链接]
  • TA的每日心情
    奋斗
    2016-1-13 12:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-9-23 09:50:40 | 显示全部楼层 |阅读模式
    本帖最后由 small-q 于 2014-9-23 10:08 编辑

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


    6. //函数声明
    7. VOID HookAPI();
    8. VOID UnHookAPI();

    9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

    16. // 宏定义
    17. #define EXTERNC extern "C"
    18. #define NAKED __declspec(naked)
    19. #define EXPORT __declspec(dllexport)
    20. #define ALCPP EXPORT NAKED
    21. //#define ALSTD EXTERNC EXPORT NAKED void __stdcall
    22. #define ALCFAST EXTERNC EXPORT NAKED void __fastcall
    23. #define ALCDECL EXTERNC NAKED void __cdecl


    24. // MsimgLib 命名空间
    25. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    26. namespace MsimgLib
    27. {
    28.         HMODULE m_hModule = NULL;
    29.         DWORD m_dwReturn[5] = {0};

    30.         inline BOOL WINAPI Load()
    31.         {
    32.                 TCHAR tzPath[MAX_PATH];
    33.                 TCHAR tzTemp[MAX_PATH * 2];

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

    42.                 return (m_hModule != NULL);        
    43.         }
    44.                

    45.         inline VOID WINAPI Free()
    46.         {
    47.                 if (m_hModule)
    48.                 {
    49.                         FreeLibrary(m_hModule);
    50.                 }
    51.         }


    52.         FARPROC WINAPI GetAddress(PCSTR pszProcName)
    53.         {
    54.                 FARPROC fpAddress;
    55.                 CHAR szProcName[16];
    56.                 TCHAR tzTemp[MAX_PATH];

    57.                 fpAddress = GetProcAddress(m_hModule, pszProcName);
    58.                 if (fpAddress == NULL)
    59.                 {
    60.                         if (HIWORD(pszProcName) == 0)
    61.                         {
    62.                                 wsprintf(szProcName, "%d", pszProcName);
    63.                                 pszProcName = szProcName;
    64.                         }

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

    69.                 return fpAddress;
    70.         }
    71. }
    72. using namespace MsimgLib;
    73. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

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


    82. }
    83. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    84. //NtHook自定义函数
    85. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    86. typedef int (WINAPI *pfnSetThreadLocale)(IN  LCID Locale);

    87. pfnSetThreadLocale Kernel_SetThreadLocale = SetThreadLocale;


    88. int WINAPI MySetThreadLocale(IN  LCID Locale)
    89. {
    90.         //MessageBoxA(NULL, "进入HOOK了!", "hi", MB_OK);
    91.         
    92.        //一个搜索算法会得出结果  = POS

    93.         if ( pos != -1)
    94.         {
    95.                 DWORD dwOldProtect;
    96.                 //HMODULE BaseAddr;
    97.                 DWORD PatchAddr;
    98.                 //BaseAddr = GetModuleHandle(NULL);
    99.                 PatchAddr = g_dwStartAddr + pos;//(INT64)BaseAddr + 0x1ABA;
    100.                
    101.                 VirtualProtect((LPVOID)PatchAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);

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

    103.                 CHAR szTemp[MAX_PATH] = {0};
    104.                 wsprintf(szTemp, "%.8X",  pos);
    105.                 //MessageBox(NULL, szTemp, "", MB_OK);
    106.                 if (::OpenClipboard (NULL))
    107.                 {
    108.                         ::EmptyClipboard ();
    109.                         HANDLE hData = ::GlobalAlloc (GMEM_MOVEABLE, ::lstrlen (szTemp) + 1);
    110.                         LPSTR pData = (LPSTR) ::GlobalLock (hData);
    111.                         ::lstrcpy (pData, szTemp);
    112.                         ::GlobalUnlock (hData);
    113.                         ::SetClipboardData (CF_TEXT, hData);
    114.                         ::CloseClipboard ();
    115.                 }

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


    117.                 __asm
    118.                 {
    119.                         MOV EDX,PatchAddr
    120.                         add edx,0xF
    121.                         MOV DWORD PTR DS:[EDX],0x90909090
    122.                         add edx,0x4
    123.                         MOV [EDX],0x90
    124.                 }

    125.         }
    126.         else
    127.         {
    128.                 CHAR szTemp[MAX_PATH] = {0};
    129.                 wsprintf(szTemp, "%.8X",  pos);
    130.                 //MessageBox(NULL, szTemp, "", MB_OK);
    131.                         if (::OpenClipboard (NULL))
    132.                         {
    133.                                 ::EmptyClipboard ();
    134.                                 HANDLE hData = ::GlobalAlloc (GMEM_MOVEABLE, ::lstrlen (szTemp) + 1);
    135.                                 LPSTR pData = (LPSTR) ::GlobalLock (hData);
    136.                                 ::lstrcpy (pData, szTemp);
    137.                                 ::GlobalUnlock (hData);
    138.                                 ::SetClipboardData (CF_TEXT, hData);
    139.                                 ::CloseClipboard ();
    140.                         }

    141.         }        

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

    143.         return Kernel_SetThreadLocale(Locale);
    144. }
    145. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    146. //NtHook函数
    147. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    148. VOID HookAPI()
    149. {
    150.         NtHookEngineInit();
    151.         HookFunction((ULONG_PTR)Kernel_SetThreadLocale,  (ULONG_PTR) &MySetThreadLocale);     
    152. }
    153. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    154. //NtHook解除函数
    155. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    156. VOID UnHookAPI()
    157. {
    158.         UnhookFunction((ULONG_PTR)Kernel_SetThreadLocale);   
    159. }
    160. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    161. // 入口函数
    162. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    163.         BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
    164. {
    165.         switch (dwReason)
    166.         {
    167.         case  DLL_PROCESS_ATTACH:
    168.                 {
    169.                         DisableThreadLibraryCalls(hModule);
    170.                         if(Load())
    171.                         {
    172.                                 HookAPI();//从最开始的地方HOOK
    173.                                 PatchIt1();//自定义PATCH点
    174.                                 
    175.                         }
    176.                         else
    177.                                 return FALSE;

    178.                         break;
    179.                 }
    180.         case DLL_PROCESS_DETACH:
    181.                 {
    182.                         Free();
    183.                         break;
    184.                 }
    185.         }

    186.         return TRUE;
    187. }
    188. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    189. //中转函数
    190. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    191. ALCDECL MsimgLib_vSetDdrawflag(void)
    192. {
    193.         __asm POP m_dwReturn[0 * TYPE long];

    194.         GetAddress("vSetDdrawflag")();

    195.         __asm JMP m_dwReturn[0 * TYPE long];
    196. }
    197. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    198. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    199. ALCDECL MsimgLib_AlphaBlend(void)
    200. {        
    201.         __asm POP m_dwReturn[1 * TYPE long];

    202.         GetAddress("AlphaBlend")();

    203.         __asm JMP m_dwReturn[1 * TYPE long];
    204. }
    205. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    206. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    207. ALCDECL MsimgLib_DllInitialize(void)
    208. {
    209.         __asm POP m_dwReturn[2 * TYPE long];

    210.         GetAddress("DllInitialize")();

    211.         __asm JMP m_dwReturn[2 * TYPE long];
    212. }
    213. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    214. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    215. ALCDECL MsimgLib_GradientFill(void)
    216. {
    217.         __asm POP m_dwReturn[3 * TYPE long];

    218.         GetAddress("GradientFill")();

    219.         __asm JMP m_dwReturn[3 * TYPE long];
    220. }
    221. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    222. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    223. ALCDECL MsimgLib_TransparentBlt(void)
    224. {
    225.         __asm POP m_dwReturn[4 * TYPE long];

    226.         GetAddress("TransparentBlt")();

    227.         __asm JMP m_dwReturn[4 * TYPE long];
    228. }
    229. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    复制代码

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

    点评

    评不上分,严重支持  发表于 2014-10-28 12:45

    评分

    参与人数 7威望 +84 飘云币 +84 收起 理由
    hahacker + 4 + 4 可否分享下源码?
    tree_fly + 12 + 12 很给力!
    lucky_789 + 8 + 8 超赞!
    vcangel + 8 + 8 赞一个!
    Dxer + 8 + 8 神马都是浮云
    beijingren + 4 + 4 赞一个!
    GGLHY + 40 + 40 神马都是浮云

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2015-8-14 00:08
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    发表于 2014-9-23 09:56:00 | 显示全部楼层
    又没有抢到沙发
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-1-28 19:35
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-9-23 10:04:17 | 显示全部楼层

    又没有抢到沙发
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-5-31 13:17
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2014-9-23 11:00:43 | 显示全部楼层
    好强大的分享
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 959 天

    [LV.10]以坛为家III

    发表于 2014-9-23 11:03:19 | 显示全部楼层
    楼主威武,不错额
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2014-9-23 12:52:03 | 显示全部楼层
    谢谢小猪的源代码。学习了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-2-26 11:14
  • 签到天数: 459 天

    [LV.9]以坛为家II

    发表于 2014-9-23 13:11:37 | 显示全部楼层
    有码就给力
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-9-23 13:38:52 | 显示全部楼层
    不懂前排围观
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表