现在的位置: 首页 > 综合 > 正文

lpk.cpp

2013年03月10日 ⁄ 综合 ⁄ 共 9833字 ⁄ 字号 评论关闭

嗯、以前一直都没怎么写过……这次认真研究了下、最好纪录是编译出的Dll UPX压缩后3KB、RAR压缩后1.35KB,编译器是Visual  C++ 6.0

此Lpk用于补丁用于动网系列和谐软件KillAD

以下为src

 

#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

抱歉!评论已关闭.