DLL劫持 LPK.dll

摘要:
“),tzPath);MessageBox(NULL,tzTemp,TEXT(”AheadLib“),MB_ICONSTOP);}return(m_hModule!

/ 上次写了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;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

免责声明:文章转载自《DLL劫持 LPK.dll》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IO口微信关注后自动回复,根据关键字回复下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)

阅读目录 一、配置安装包依赖项 二、自定义dll(测试数据库连接) 三、总结 正文 前言:上篇使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.config的过程,操作起来是相对比较简单的,只要知道了博主提供的方法,相信都不是问题,其实...

CSerialPort类的源码(程序文件和头文件)

#ifndef __SERIALPORT_H__#define __SERIALPORT_H__ #define WM_COMM_BREAK_DETECTED  WM_USER+1 // A break was detected on input.#define WM_COMM_CTS_DETECTED  WM_USER+2 // The CTS (cle...

Oracle 汉字转拼音

   --0 select fn_getpy('测试',0) from dual ceshi  --1 select fn_getpy('测试',1) from dual CESHI  --2 select fn_getpy('测试',1) from dual CeShi  --3 select fn_getpy('测试',3) from dual cs...

C#中的release和debug模式

以下内容来源:https://www.cnblogs.com/rgjycs/p/9254332.html 在程序调试时的debug和release 网上有如下的描述:Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好...

多路径下使用ASMLIB创建ASM磁盘

多路径下使用ASMLIB创建ASM磁盘 Asmlib有扫描磁盘有默认的顺序,通常为/dev/sd*,而多路径配置磁盘目录往往映射在/dev/mapper下 因此 #  egrep -v "^#" /etc/sysconfig/oracleasm ORACLEASM_ENABLED=true ORACLEASM_UID=grid ORACLEASM_GID...

基于 Istio 的全链路灰度方案探索和实践

​简介: 本文介绍的基于“流量打标”和“按标路由” 能力是一个通用方案,基于此可以较好地解决测试环境治理、线上全链路灰度发布等相关问题,基于服务网格技术做到与开发语言无关。同时,该方案适应于不同的7层协议,当前已支持 HTTP/gRpc 和 Dubbo 协议。 作者|曾宇星(宇曾) 背景微服务软件架构下,业务新功能上线前搭建完整的一套测试系统进行验证是相当...