zoukankan      html  css  js  c++  java
  • DLL劫持 LPK.dll

    / 上次写了USP10的,这次把LPK的代码贴出来.
    //以下文件在 lpk.cpp 中,头文件和上次USP10的相同

    // lpk.cpp : Defines the entry point for the DLL application.
    //

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 头文件
    #include "stdafx.h"
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    #pragma comment(linker, "/EXPORT:LpkInitialize=_AheadLib_LpkInitialize,@1")
    #pragma comment(linker, "/EXPORT:LpkTabbedTextOut=_AheadLib_LpkTabbedTextOut,@2")
    #pragma comment(linker, "/EXPORT:LpkDllInitialize=_AheadLib_LpkDllInitialize,@3")
    #pragma comment(linker, "/EXPORT:LpkDrawTextEx=_AheadLib_LpkDrawTextEx,@4")
    //#pragma comment(linker, "/EXPORT:LpkEditControl=_AheadLib_LpkEditControl,@5")
    #pragma comment(linker, "/EXPORT:LpkExtTextOut=_AheadLib_LpkExtTextOut,@6")
    #pragma comment(linker, "/EXPORT:LpkGetCharacterPlacement=_AheadLib_LpkGetCharacterPlacement,@7")
    #pragma comment(linker, "/EXPORT:LpkGetTextExtentExPoint=_AheadLib_LpkGetTextExtentExPoint,@8")
    #pragma comment(linker, "/EXPORT:LpkPSMTextOut=_AheadLib_LpkPSMTextOut,@9")
    #pragma comment(linker, "/EXPORT:LpkUseGDIWidthCache=_AheadLib_LpkUseGDIWidthCache,@10")
    #pragma comment(linker, "/EXPORT:ftsWordBreak=_AheadLib_ftsWordBreak,@11")
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 宏定义
    #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
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    HINSTANCE g_hinstDll;
    FARPROC   fpCreateWindow;
    HMODULE   hModule;
    BYTE   OldCreateWindowCode[5],NewCreateWindowCode[5]/*,RelJmpCode[10]*/;
    DWORD   dwIdOld,dwIdNew;
    BOOL   bHook=false;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // AheadLib 命名空间
    namespace AheadLib
    {
    HMODULE m_hModule = NULL; // 原始模块句柄
    // 加载原始模块
    inline BOOL WINAPI Load()
    {
       TCHAR tzPath[MAX_PATH];
       TCHAR tzTemp[MAX_PATH * 2];
       GetSystemDirectory(tzPath, MAX_PATH);
       lstrcat(tzPath, TEXT("\\lpk.dll"));
       m_hModule=LoadLibrary(tzPath);
       if (m_hModule == NULL)
       {
        wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
        MessageBox(NULL, tzTemp, TEXT("AheadLib"), 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("AheadLib"), MB_ICONSTOP);
        ExitProcess(-2);
       }
       return fpAddress;
    }
    }
    using namespace AheadLib;
    ////////////////////////////////////////////////////////////////////////////////////////////////

    void   HookOn();
    void   HookOff();
    void WINAPIV Init(LPVOID pParam);
    HWND WINAPI MyCreateWindow(DWORD dwExStyle,LPCWSTR lpClassName,LPCWSTR lpWindowName,DWORD dwStyle,
             int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam);
    void WINAPIV ThreadProc (LPVOID pParam);
    void WINAPIV ThreadProc2 (LPVOID pParam);

    inline HWND WINAPI RelCreateWindowExW(DWORD dwExStyle,LPCWSTR lpClassName,LPCWSTR lpWindowName,DWORD dwStyle,
            int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam)
    {
    HookOff();
    HWND Ret=CreateWindowExW(
       dwExStyle,lpClassName,lpWindowName,
       dwStyle,X,Y,nWidth,nHeight,
       hWndParent,hMenu,hInstance,lpParam);
    HookOn();
    return Ret;
    }
    void WINAPIV Init(LPVOID pParam)
    {
    Sleep(100);
    hModule=LoadLibrary("User32.dll");
    fpCreateWindow=GetProcAddress(hModule,"CreateWindowExW");
    if(fpCreateWindow==NULL)
       return;
    _asm
    {
       pushad
        lea edi , OldCreateWindowCode
        mov esi , fpCreateWindow
        cld
        movsd
        movsb
        popad
    }
    NewCreateWindowCode[0]=0xe9;   //jmp   MyCreateWindow的相对地址的指令
    _asm
    {
       lea eax , MyCreateWindow
        mov ebx , fpCreateWindow
        sub eax , ebx
        sub eax , 5
        mov dword ptr [NewCreateWindowCode+1] , eax
    }
    dwIdNew=GetCurrentProcessId();   //   得到所属进程的ID
    dwIdOld=dwIdNew;
    _beginthread(ThreadProc2,NULL,(LPVOID)(int)(3*60));
    }
    //---------------------------------------------------------------------------
    HWND WINAPI MyCreateWindow(DWORD dwExStyle,
             LPCWSTR lpClassName,
             LPCWSTR lpWindowName,
             DWORD dwStyle,
             int X,
             int Y,
             int nWidth,
             int nHeight,
             HWND hWndParent ,
             HMENU hMenu,
             HINSTANCE hInstance,
             LPVOID lpParam)
    {
    HWND Ret=RelCreateWindowExW(
       dwExStyle,lpClassName,lpWindowName,
       dwStyle,X,Y,nWidth,nHeight,
       hWndParent,hMenu,hInstance,lpParam);
    if(dwExStyle==0)
       return Ret;
    if(dwExStyle!=768)
       return Ret;
    return Ret;
    }
    void WINAPIV ThreadProc(LPVOID pParam)
    {
    CHAR buffer[100];
    memset(buffer,0,100);
    if(IsWindow((HWND)pParam))
       GetWindowText((HWND)pParam,buffer,100);
    else
       return ;
    if(buffer[0]==81 && buffer[1]==81 && buffer[2]==-51 && buffer[3]==-8 && buffer[4]==-80 && buffer[5]==-55)
    {
       SendMessage((HWND)pParam,WM_CLOSE,NULL,NULL);
    }
    else if(buffer[0]==-67 && buffer[1]==-15 && buffer[2]==-56 && buffer[3]==-43 && buffer[4]==-46 && buffer[5]==-86)
    {
       SendMessage((HWND)pParam,WM_CLOSE,NULL,NULL);
    }
    else if(buffer[0]==-54 && buffer[1]==-42 && buffer[2]==-69 && buffer[3]==-6 && buffer[4]==-55 && buffer[5]==-6)
    {
       SendMessage((HWND)pParam,WM_CLOSE,NULL,NULL);
    }
    }
    void WINAPIV ThreadProc2(LPVOID pParam)
    {
    Sleep(1000);
    HookOn();
    for(int i=0;i<(int)pParam;i++)
       Sleep(1000);
    HookOff();
    }

    void HookOn()
    {
    HANDLE hProc;
    dwIdOld=dwIdNew;
    hProc=OpenProcess(PROCESS_ALL_ACCESS,0,dwIdOld); //   得到所属进程的句柄
    VirtualProtectEx(hProc,fpCreateWindow,5,PAGE_READWRITE,&dwIdOld); //修改所属进程中CreateWindow的前5个字节的属性为可写
    WriteProcessMemory(hProc,fpCreateWindow,NewCreateWindowCode,5,0); //将所属进程中CreateWindow的前5个字节改为JMP到MyCreateWindow
    VirtualProtectEx(hProc,fpCreateWindow,5,dwIdOld,&dwIdOld);//修改所属进程中CreateWindow的前5个字节的属性为原来的属性
    bHook=true;
    }
    //---------------------------------------------------------------------------
    //   将所属进程中JMP MyCreateWindow的代码改为Jmp CreateWindow
    void HookOff()
    {
    HANDLE hProc;
    dwIdOld=dwIdNew;
    hProc=OpenProcess(PROCESS_ALL_ACCESS,0,dwIdOld);
    VirtualProtectEx(hProc,fpCreateWindow,5,PAGE_READWRITE,&dwIdOld);
    WriteProcessMemory(hProc,fpCreateWindow,OldCreateWindowCode,5,0);
    VirtualProtectEx(hProc,fpCreateWindow,5,dwIdOld,&dwIdOld);
    bHook=false;
    }

    //LpkEditControl导出的是数组,不是单一的函数 (by Backer)   
    EXTERNC void __cdecl AheadLib_LpkEditControl(void);  
    EXTERNC __declspec(dllexport) void (*LpkEditControl[14])() = {AheadLib_LpkEditControl};  
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 入口函数
    BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
    {
    if (dwReason == DLL_PROCESS_ATTACH)
    {
       DisableThreadLibraryCalls(hModule);
       Load();
       //LpkEditControl这个数组有14个成员,必须将其复制过来   
            memcpy((LPVOID)(LpkEditControl+1), (LPVOID)((int*)GetAddress("LpkEditControl") + 1),52);  
       _beginthread(Init,NULL,NULL);
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
       Free();
    }
    return TRUE;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkInitialize(void)
    {
    GetAddress("LpkInitialize");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkTabbedTextOut(void)
    {
    GetAddress("LpkTabbedTextOut");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkDllInitialize(void)
    {
    GetAddress("LpkDllInitialize");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkDrawTextEx(void)
    {
    GetAddress("LpkDrawTextEx");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkEditControl(void)
    {
    GetAddress("LpkEditControl");
    __asm jmp DWORD ptr [EAX];
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkExtTextOut(void)
    {
    GetAddress("LpkExtTextOut");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkGetCharacterPlacement(void)
    {
    GetAddress("LpkGetCharacterPlacement");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkGetTextExtentExPoint(void)
    {
    GetAddress("LpkGetTextExtentExPoint");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkPSMTextOut(void)
    {
    GetAddress("LpkPSMTextOut");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_LpkUseGDIWidthCache(void)
    {
    GetAddress("LpkUseGDIWidthCache");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 导出函数
    ALCDECL AheadLib_ftsWordBreak(void)
    {
    GetAddress("ftsWordBreak");
    __asm JMP EAX;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  • 相关阅读:
    python timeit模块用法
    boto3库限速
    golang-Beego-orm创建的坑
    Java07
    Java06
    Java04
    Java03
    c
    Mac 安装GCC
    命令: go build
  • 原文地址:https://www.cnblogs.com/swordzj/p/2334410.html
Copyright © 2011-2022 走看看