#include <Windows.h>
#pragma comment(linker,"/entry:function1")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define EXTERNC extern "C"
#define NAKED __declspec(naked)
#define EXPORT __declspec(dllexport)
#define ALCPP EXPORT NAKED
#define ALSTD EXTERNC NAKED void __stdcall
#define ALCFAST EXTERNC NAKED void __fastcall
#define ALCDECL EXTERNC NAKED void __cdecl
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <TlHelp32.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 补丁程序
BOOL bPatched=FALSE;
inline void PatchProcess(HANDLE hProcess)
{
DWORD Oldpp;
/************************************************************************/
/* 补丁1:50 51 52 56 56 56 56 56 57 53 */
/*替换补丁:EB 2F ?? ?? ?? ?? ?? ?? ?? ?? */
/************************************************************************/
unsigned char p401496[2] = {
0xEB, 0x2F
};
PBYTE currentPos=NULL;
PBYTE endPos=(PBYTE)GetModuleHandle(0)+0x00100000;
for (currentPos=(PBYTE)GetModuleHandle(0)+0x1000;currentPos<endPos;currentPos++)
{
if ((*(PDWORD)currentPos==0x56525150)&&(*(PDWORD)(currentPos+4)==0x56565656))
{
VirtualProtectEx(hProcess, (LPVOID)currentPos, 2, PAGE_EXECUTE_READWRITE, &Oldpp);
// WriteProcessMemory(hProcess, (LPVOID)currentPos, p401496, 2, NULL);
*(PWORD)currentPos=0x2FEB;
bPatched=TRUE;
break;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 判断是否是目标程序
inline BOOL isTarget(HANDLE hProcess)
{
PBYTE fDecode=(PBYTE)GetModuleHandle(0)+0x1007;
if (*(PDWORD)fDecode == 0x0000A164)
return TRUE;
else
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
void hijack()
{
if (isTarget(GetCurrentProcess()))
{
PatchProcess(GetCurrentProcess());
}
}
PVOID pfnLpkTabbedTextOut;
PVOID pfnLpkDllInitialize;
PVOID pfnLpkDrawTextEx;
PVOID pfnLpkEditControl;
PVOID pfnLpkExtTextOut;
PVOID pfnLpkGetCharacterPlacement;
PVOID pfnLpkGetTextExtentExPoint;
PVOID pfnLpkInitialize;
PVOID pfnLpkPSMTextOut;
PVOID pfnLpkUseGDIWidthCache;
PVOID pfnftsWordBreak;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MemCode 命名空间
namespace MemCode
{
HMODULE m_hModule = NULL; // 原始模块句柄
// DWORD m_dwReturn[500] = {0}; // 原始函数返回地址
inline void InitLpkIAT();
// 加载原始模块
BOOL WINAPI Load()
{
TCHAR tzPath[MAX_PATH]={0};
TCHAR tzTemp[MAX_PATH]={0};
GetSystemDirectory(tzPath, sizeof(tzPath));
strcat(tzPath,"\\lpk.dll");
m_hModule = LoadLibrary(tzPath);
InitLpkIAT();
// if (m_hModule == NULL)
// {
// wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
// MessageBox(NULL, tzTemp, TEXT("MemCode"), MB_ICONSTOP);//MessageBox好像会自爆
// }
return (m_hModule != NULL);
}
// 释放原始模块
VOID inline WINAPI Free()
{
if (m_hModule)
{
FreeLibrary(m_hModule);
}
}
void InitLpkIAT()
{
if (m_hModule == NULL)
{
if (Load() == FALSE)
{
ExitProcess(-1);
}
}
pfnLpkTabbedTextOut=GetProcAddress(m_hModule,"LpkTabbedTextOut");
pfnLpkDllInitialize=GetProcAddress(m_hModule,"LpkDllInitialize");
pfnLpkDrawTextEx=GetProcAddress(m_hModule,"LpkDrawTextEx");
pfnLpkExtTextOut=GetProcAddress(m_hModule,"LpkExtTextOut");
pfnLpkGetCharacterPlacement=GetProcAddress(m_hModule,"LpkGetCharacterPlacement");
pfnLpkGetTextExtentExPoint=GetProcAddress(m_hModule,"LpkGetTextExtentExPoint");
pfnLpkInitialize=GetProcAddress(m_hModule,"LpkInitialize");
pfnLpkPSMTextOut=GetProcAddress(m_hModule,"LpkPSMTextOut");
pfnLpkUseGDIWidthCache=GetProcAddress(m_hModule,"LpkUseGDIWidthCache");
pfnftsWordBreak=GetProcAddress(m_hModule,"ftsWordBreak");
if (!(pfnLpkTabbedTextOut&& pfnLpkDllInitialize&&pfnLpkDrawTextEx&&pfnLpkExtTextOut&&pfnLpkGetCharacterPlacement&&
pfnLpkGetTextExtentExPoint&&pfnLpkInitialize&&pfnLpkPSMTextOut&&pfnLpkUseGDIWidthCache&&pfnftsWordBreak))
{
ExitProcess(-2);
}
}
}
using namespace MemCode;
////////////////////////////////////////////////////////////////////////////////////////////////
//LpkEditControl导出的是数组,不是单一的函数 (by Backer)
EXTERNC __declspec(dllexport) void (*LpkEditControl[14])() = {NULL};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函数
BOOL function1(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
// for (INT i = 0; i < sizeof(m_dwReturn) / sizeof(DWORD); i++)
// {
// m_dwReturn[i] = TlsAlloc();
// }
//LpkEditControl这个数组有14个成员,必须将其复制过来
Load();
memcpy(LpkEditControl, (int*)GetProcAddress(m_hModule,"LpkEditControl"),sizeof(LpkEditControl));
}
else if (dwReason == DLL_PROCESS_DETACH)
{
// for (INT i = 0; i < sizeof(m_dwReturn) / sizeof(DWORD); i++)
// {
// TlsFree(m_dwReturn[i]);
// }
Free();
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
#pragma comment(linker, "/EXPORT:LpkInitialize=_MemCode_LpkInitialize,@1")
#pragma comment(linker, "/EXPORT:LpkTabbedTextOut=_MemCode_LpkTabbedTextOut,@2")
#pragma comment(linker, "/EXPORT:LpkDllInitialize=_MemCode_LpkDllInitialize,@3")
#pragma comment(linker, "/EXPORT:LpkDrawTextEx=_MemCode_LpkDrawTextEx,@4")
//#pragma comment(linker, "/EXPORT:LpkEditControl=_MemCode_LpkEditControl,@5")
#pragma comment(linker, "/EXPORT:LpkExtTextOut=_MemCode_LpkExtTextOut,@6")
#pragma comment(linker, "/EXPORT:LpkGetCharacterPlacement=_MemCode_LpkGetCharacterPlacement,@7")
#pragma comment(linker, "/EXPORT:LpkGetTextExtentExPoint=_MemCode_LpkGetTextExtentExPoint,@8")
#pragma comment(linker, "/EXPORT:LpkPSMTextOut=_MemCode_LpkPSMTextOut,@9")
#pragma comment(linker, "/EXPORT:LpkUseGDIWidthCache=_MemCode_LpkUseGDIWidthCache,@10")
#pragma comment(linker, "/EXPORT:ftsWordBreak=_MemCode_ftsWordBreak,@11")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_LpkInitialize(void)
{
__asm jmp dword ptr[pfnLpkInitialize]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_LpkTabbedTextOut(void)
{
__asm jmp dword ptr[pfnLpkTabbedTextOut]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_LpkDllInitialize(void)
{
__asm jmp dword ptr[pfnLpkDllInitialize]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_LpkDrawTextEx(void)
{
__asm jmp dword ptr[pfnLpkDrawTextEx]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//ALCDECL MemCode_LpkEditControl(void)
//{
// memcpy(LpkEditControl+1, (int*)GetProcAddress(m_hModule,"LpkEditControl") + 1,sizeof(LpkEditControl) - 1);
// GetProcAddress(m_hModule,"LpkEditControl");
// __asm jmp dword ptr[eax]
// __asm jmp dword ptr[LpkEditControl]
//}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_LpkExtTextOut(void)
{
__asm jmp dword ptr[pfnLpkExtTextOut]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_LpkGetCharacterPlacement(void)
{
__asm jmp dword ptr[pfnLpkGetCharacterPlacement]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_LpkGetTextExtentExPoint(void)
{
if (!bPatched)
hijack();
__asm jmp dword ptr[pfnLpkGetTextExtentExPoint]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_LpkPSMTextOut(void)
{
__asm jmp dword ptr[pfnLpkPSMTextOut]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_LpkUseGDIWidthCache(void)
{
__asm jmp dword ptr[pfnLpkUseGDIWidthCache]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALCDECL MemCode_ftsWordBreak(void)
{
__asm jmp dword ptr[pfnftsWordBreak]
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
原文:http://hi.baidu.com/hackernewyangjt/blog/item/a4e15a8241ccaab10df4d200.html