能力值:
( LV2,RANK:10 )
|
-
-
2 楼
贴个生成的lpk.cpp
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 头文件
#include <Windows.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")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 原函数地址指针
PVOID pfnLpkInitialize;
PVOID pfnLpkTabbedTextOut;
PVOID pfnLpkDllInitialize;
PVOID pfnLpkDrawTextEx;
PVOID pfnLpkEditControl;
PVOID pfnLpkExtTextOut;
PVOID pfnLpkGetCharacterPlacement;
PVOID pfnLpkGetTextExtentExPoint;
PVOID pfnLpkPSMTextOut;
PVOID pfnLpkUseGDIWidthCache;
PVOID pfnftsWordBreak;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 宏定义
#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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// AheadLib 命名空间
namespace AheadLib
{
HMODULE m_hModule = NULL; // 原始模块句柄
DWORD m_dwReturn[11] = {0}; // 原始函数返回地址
// 获取原始函数地址
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;
}
// 初始化原始函数地址指针
inline VOID WINAPI InitializeAddresses()
{
pfnLpkInitialize = GetAddress("LpkInitialize");
pfnLpkTabbedTextOut = GetAddress("LpkTabbedTextOut");
pfnLpkDllInitialize = GetAddress("LpkDllInitialize");
pfnLpkDrawTextEx = GetAddress("LpkDrawTextEx");
pfnLpkEditControl = GetAddress("LpkEditControl");
pfnLpkExtTextOut = GetAddress("LpkExtTextOut");
pfnLpkGetCharacterPlacement = GetAddress("LpkGetCharacterPlacement");
pfnLpkGetTextExtentExPoint = GetAddress("LpkGetTextExtentExPoint");
pfnLpkPSMTextOut = GetAddress("LpkPSMTextOut");
pfnLpkUseGDIWidthCache = GetAddress("LpkUseGDIWidthCache");
pfnftsWordBreak = GetAddress("ftsWordBreak");
}
// 加载原始模块
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);
}
else
{
InitializeAddresses();
}
return (m_hModule != NULL);
}
// 释放原始模块
inline VOID WINAPI Free()
{
if (m_hModule)
{
FreeLibrary(m_hModule);
}
}
}
using namespace AheadLib;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
return Load();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
Free();
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkInitialize(void)
{
__asm JMP pfnLpkInitialize;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkTabbedTextOut(void)
{
__asm JMP pfnLpkTabbedTextOut;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkDllInitialize(void)
{
__asm JMP pfnLpkDllInitialize;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkDrawTextEx(void)
{
__asm JMP pfnLpkDrawTextEx;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkEditControl(void)
{
__asm JMP pfnLpkEditControl;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkExtTextOut(void)
{
__asm JMP pfnLpkExtTextOut;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkGetCharacterPlacement(void)
{
__asm JMP pfnLpkGetCharacterPlacement;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkGetTextExtentExPoint(void)
{
__asm JMP pfnLpkGetTextExtentExPoint;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkPSMTextOut(void)
{
__asm JMP pfnLpkPSMTextOut;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkUseGDIWidthCache(void)
{
__asm JMP pfnLpkUseGDIWidthCache;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_ftsWordBreak(void)
{
__asm JMP pfnftsWordBreak;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
这个荧光很有用处,收藏一个。
|
能力值:
( LV12,RANK:980 )
|
-
-
4 楼
请问修改了哪些BUG?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
同问。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
三问求解
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
1、生成的.cpp可直接编译。
2、恢复导出函数。
3、加载DLL时,自动进行函数指针初始化。
4、当原dll有Noname函数,解决"__asm JMP pfn"错误。
大概是这样。其他懒得写了。
下载http://bbs.pediy.com/showthread.php?t=80903&highlight=AheadLib里的比对一下吧。
谢谢
|
能力值:
( LV4,RANK:40 )
|
-
-
8 楼
先说感谢
感谢!
|
能力值:
( LV5,RANK:70 )
|
-
-
9 楼
目测会有大手围观!第一页广告位!
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
我记得LPK中有几个函数是个数组??
|
能力值:
( LV12,RANK:980 )
|
-
-
11 楼
生成的CPP文件缺少InitializeAddresses()函数。不能用。
|
能力值:
( LV12,RANK:2670 )
|
-
-
12 楼
我记得原版中对于LpkEditControl要特殊处理
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
yonsm原版程序生成的lpk.cpp
--------------------
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 头文件
#include <Windows.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
#pragma comment(linker, "/EXPORT:LpkTabbedTextOut=_AheadLib_LpkTabbedTextOut,@1")
#pragma comment(linker, "/EXPORT:LpkDllInitialize=_AheadLib_LpkDllInitialize,@2")
#pragma comment(linker, "/EXPORT:LpkDrawTextEx=_AheadLib_LpkDrawTextEx,@3")
#pragma comment(linker, "/EXPORT:LpkEditControl=_AheadLib_LpkEditControl,@4")
#pragma comment(linker, "/EXPORT:LpkExtTextOut=_AheadLib_LpkExtTextOut,@5")
#pragma comment(linker, "/EXPORT:LpkGetCharacterPlacement=_AheadLib_LpkGetCharacterPlacement,@6")
#pragma comment(linker, "/EXPORT:LpkGetTextExtentExPoint=_AheadLib_LpkGetTextExtentExPoint,@7")
#pragma comment(linker, "/EXPORT:LpkInitialize=_AheadLib_LpkInitialize,@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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// AheadLib 命名空间
namespace AheadLib
{
HMODULE m_hModule = NULL; // 原始模块句柄
DWORD m_dwReturn[11] = {0}; // 原始函数返回地址
// 加载原始模块
inline BOOL WINAPI Load()
{
TCHAR tzPath[MAX_PATH];
TCHAR tzTemp[MAX_PATH * 2];
GetSystemDirectory(tzPath, MAX_PATH);
lstrcat(tzPath, TEXT("\\lpk"));
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;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
return Load();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
Free();
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkTabbedTextOut(void)
{
// 保存返回地址
__asm POP m_dwReturn[0 * TYPE long];
// 调用原始函数
GetAddress("LpkTabbedTextOut")();
// 转跳到返回地址
__asm JMP m_dwReturn[0 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkDllInitialize(void)
{
// 保存返回地址
__asm POP m_dwReturn[1 * TYPE long];
// 调用原始函数
GetAddress("LpkDllInitialize")();
// 转跳到返回地址
__asm JMP m_dwReturn[1 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkDrawTextEx(void)
{
// 保存返回地址
__asm POP m_dwReturn[2 * TYPE long];
// 调用原始函数
GetAddress("LpkDrawTextEx")();
// 转跳到返回地址
__asm JMP m_dwReturn[2 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkEditControl(void)
{
// 保存返回地址
__asm POP m_dwReturn[3 * TYPE long];
// 调用原始函数
GetAddress("LpkEditControl")();
// 转跳到返回地址
__asm JMP m_dwReturn[3 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkExtTextOut(void)
{
// 保存返回地址
__asm POP m_dwReturn[4 * TYPE long];
// 调用原始函数
GetAddress("LpkExtTextOut")();
// 转跳到返回地址
__asm JMP m_dwReturn[4 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkGetCharacterPlacement(void)
{
// 保存返回地址
__asm POP m_dwReturn[5 * TYPE long];
// 调用原始函数
GetAddress("LpkGetCharacterPlacement")();
// 转跳到返回地址
__asm JMP m_dwReturn[5 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkGetTextExtentExPoint(void)
{
// 保存返回地址
__asm POP m_dwReturn[6 * TYPE long];
// 调用原始函数
GetAddress("LpkGetTextExtentExPoint")();
// 转跳到返回地址
__asm JMP m_dwReturn[6 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkInitialize(void)
{
// 保存返回地址
__asm POP m_dwReturn[7 * TYPE long];
// 调用原始函数
GetAddress("LpkInitialize")();
// 转跳到返回地址
__asm JMP m_dwReturn[7 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkPSMTextOut(void)
{
// 保存返回地址
__asm POP m_dwReturn[8 * TYPE long];
// 调用原始函数
GetAddress("LpkPSMTextOut")();
// 转跳到返回地址
__asm JMP m_dwReturn[8 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkUseGDIWidthCache(void)
{
// 保存返回地址
__asm POP m_dwReturn[9 * TYPE long];
// 调用原始函数
GetAddress("LpkUseGDIWidthCache")();
// 转跳到返回地址
__asm JMP m_dwReturn[9 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_ftsWordBreak(void)
{
// 保存返回地址
__asm POP m_dwReturn[10 * TYPE long];
// 调用原始函数
GetAddress("ftsWordBreak")();
// 转跳到返回地址
__asm JMP m_dwReturn[10 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
没有见到特殊处理呀
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
老 K 說的【特殊处理】,跟 dll 無關。
這是 lpk.dll 的特殊性。
其它 dll 大多沒這煩惱。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
知道了。 谢谢K大,Z大。
|
能力值:
( LV12,RANK:2670 )
|
-
-
16 楼
lz再改改,争取支持x64
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
我水平有限,对x64没太多研究。 把源码放上来,让有兴趣的朋友一起努力。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
XP、Win 7都可以用的lpk.cpp应该是怎样的呢?
|
能力值:
( LV12,RANK:2670 )
|
-
-
19 楼
LpkEditControl导出的是数组,不是单一的函数,所以需要修改一下
EXTERNC EXPORT void __cdecl MemCode_LpkEditControl(void);
EXTERNC __declspec(dllexport) void (*LpkEditControl[14])() = {MemCode_LpkEditControl};
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
高手验证一下,下面这份lpk.cpp是否可用。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 头文件
#include "stdafx.h"
#include <process.h>
#include "WatchDog.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")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 原函数地址指针
PVOID pfnLpkInitialize;
PVOID pfnLpkTabbedTextOut;
PVOID pfnLpkDllInitialize;
PVOID pfnLpkDrawTextEx;
PVOID pfnLpkEditControl;
PVOID pfnLpkExtTextOut;
PVOID pfnLpkGetCharacterPlacement;
PVOID pfnLpkGetTextExtentExPoint;
PVOID pfnLpkPSMTextOut;
PVOID pfnLpkUseGDIWidthCache;
PVOID pfnftsWordBreak;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 宏定义
#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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//LpkEditControl导出的是数组,不是单一的函数
EXTERNC void __cdecl AheadLib_LpkEditControl(void);
EXTERNC __declspec(dllexport) void (*LpkEditControl[14])() = {AheadLib_LpkEditControl};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// AheadLib 命名空间
namespace AheadLib
{
HMODULE m_hModule = NULL; // 原始模块句柄
DWORD m_dwReturn[11] = {0}; // 原始函数返回地址
// 获取原始函数地址
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;
}
// 初始化原始函数地址指针
inline VOID WINAPI InitializeAddresses()
{
pfnLpkInitialize = GetAddress("LpkInitialize");
pfnLpkTabbedTextOut = GetAddress("LpkTabbedTextOut");
pfnLpkDllInitialize = GetAddress("LpkDllInitialize");
pfnLpkDrawTextEx = GetAddress("LpkDrawTextEx");
pfnLpkEditControl = GetAddress("LpkEditControl");
RtlMoveMemory(LpkEditControl, (PVOID)GetAddress("LpkEditControl"), sizeof(LpkEditControl));
pfnLpkExtTextOut = GetAddress("LpkExtTextOut");
pfnLpkGetCharacterPlacement = GetAddress("LpkGetCharacterPlacement");
pfnLpkGetTextExtentExPoint = GetAddress("LpkGetTextExtentExPoint");
pfnLpkPSMTextOut = GetAddress("LpkPSMTextOut");
pfnLpkUseGDIWidthCache = GetAddress("LpkUseGDIWidthCache");
pfnftsWordBreak = GetAddress("ftsWordBreak");
}
// 加载原始模块
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);
}
else
{
InitializeAddresses();
}
return (m_hModule != NULL);
}
// 释放原始模块
inline VOID WINAPI Free()
{
if (m_hModule)
{
FreeLibrary(m_hModule);
}
}
}
using namespace AheadLib;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//函数声明
void WINAPIV Init(LPVOID pParam);
void WINAPIV Init(LPVOID pParam)
{
TCHAR tzTemp[MAX_PATH];
wsprintf(tzTemp, TEXT("成功劫持!......."));
MessageBox(NULL, tzTemp, TEXT("gamehacker"), MB_ICONSTOP);
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
CWatchDog wd;
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
if(Load())
{
//LpkEditControl这个数组有14个成员,必须将其复制过来
//memcpy((LPVOID)(LpkEditControl), (LPVOID)((int*)GetAddress("LpkEditControl")), sizeof(LpkEditControl));
//_beginthread(Init, NULL, NULL);
}
else
return FALSE;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
Free();
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkInitialize(void)
{
__asm JMP pfnLpkInitialize;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkTabbedTextOut(void)
{
__asm JMP pfnLpkTabbedTextOut;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkDllInitialize(void)
{
__asm JMP pfnLpkDllInitialize;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkDrawTextEx(void)
{
__asm JMP pfnLpkDrawTextEx;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkEditControl(void)
{
__asm JMP DWORD PTR [pfnLpkEditControl]; //这里的LpkEditControl是数组,eax存的是函数指针
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkExtTextOut(void)
{
__asm JMP pfnLpkExtTextOut;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkGetCharacterPlacement(void)
{
__asm JMP pfnLpkGetCharacterPlacement;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkGetTextExtentExPoint(void)
{
__asm JMP pfnLpkGetTextExtentExPoint;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkPSMTextOut(void)
{
__asm JMP pfnLpkPSMTextOut;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_LpkUseGDIWidthCache(void)
{
__asm JMP pfnLpkUseGDIWidthCache;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_ftsWordBreak(void)
{
__asm JMP pfnftsWordBreak;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
能力值:
( LV3,RANK:20 )
|
-
-
21 楼
有符号的导出函数DLL,也能劫持调用吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
不错的东西,还给出了源码,非常感谢
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
旧贴新问, / 保存返回地址 __asm POP m_dwReturn[4 * TYPE long];
// 调用原始函数 GetAddress("LpkExtTextOut")();
// 转跳到返回地址 __asm JMP m_dwReturn[4 * TYPE long];
这个是在多线程调用时,是否有问题呢?俺现在遇到大部分函数都没问题,有些崩溃的问题
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 #pragma comment(linker, "/EXPORT:Noname0=_AheadLib_Noname0,@0,NONAME") #pragma comment(linker, "/EXPORT:AddDllToBlacklist=nw_elfOrg.AddDllToBlacklist,@1") #pragma comment(linker, "/EXPORT:CrashForException_ExportThunk=nw_elfOrg.CrashForException_ExportThunk,@2") #pragma comment(linker, "/EXPORT:DisableHook=nw_elfOrg.DisableHook,@3") #pragma comment(linker, "/EXPORT:DrainLog=nw_elfOrg.DrainLog,@4") #pragma comment(linker, "/EXPORT:DumpHungProcessWithPtype_ExportThunk=nw_elfOrg.DumpHungProcessWithPtype_ExportThunk,@5") #pragma comment(linker, "/EXPORT:DumpProcessWithoutCrash=nw_elfOrg.DumpProcessWithoutCrash,@6") #pragma comment(linker, "/EXPORT:ElfGetReporterClient=nw_elfOrg.ElfGetReporterClient,@7") #pragma comment(linker, "/EXPORT:GetApplyHookResult=nw_elfOrg.GetApplyHookResult,@8") #pragma comment(linker, "/EXPORT:GetBlockedModulesCount=nw_elfOrg.GetBlockedModulesCount,@9") #pragma comment(linker, "/EXPORT:GetCrashReports_ExportThunk=nw_elfOrg.GetCrashReports_ExportThunk,@10") #pragma comment(linker, "/EXPORT:GetCrashpadDatabasePath_ExportThunk=nw_elfOrg.GetCrashpadDatabasePath_ExportThunk,@11") #pragma comment(linker, "/EXPORT:GetHandleVerifier=nw_elfOrg.GetHandleVerifier,@12") #pragma comment(linker, "/EXPORT:GetInstallDetailsPayload=nw_elfOrg.GetInstallDetailsPayload,@13") #pragma comment(linker, "/EXPORT:GetUniqueBlockedModulesCount=nw_elfOrg.GetUniqueBlockedModulesCount,@14") #pragma comment(linker, "/EXPORT:GetUserDataDirectoryThunk=nw_elfOrg.GetUserDataDirectoryThunk,@15") #pragma comment(linker, "/EXPORT:InjectDumpForHungInput_ExportThunk=nw_elfOrg.InjectDumpForHungInput_ExportThunk,@16") #pragma comment(linker, "/EXPORT:IsBlacklistInitialized=nw_elfOrg.IsBlacklistInitialized,@17") #pragma comment(linker, "/EXPORT:RegisterLogNotification=nw_elfOrg.RegisterLogNotification,@18") #pragma comment(linker, "/EXPORT:RequestSingleCrashUpload_ExportThunk=nw_elfOrg.RequestSingleCrashUpload_ExportThunk,@19") #pragma comment(linker, "/EXPORT:SetMetricsClientId=nw_elfOrg.SetMetricsClientId,@20") #pragma comment(linker, "/EXPORT:SetUploadConsent_ExportThunk=nw_elfOrg.SetUploadConsent_ExportThunk,@21") #pragma comment(linker, "/EXPORT:SignalChromeElf=nw_elfOrg.SignalChromeElf,@22") #pragma comment(linker, "/EXPORT:SignalInitializeCrashReporting=nw_elfOrg.SignalInitializeCrashReporting,@23") #pragma comment(linker, "/EXPORT:SuccessfullyBlocked=nw_elfOrg.SuccessfullyBlocked,@24") ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 宏定义 #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 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // AheadLib 命名空间 namespace AheadLib { HMODULE m_hModule = NULL; // 原始模块句柄 DWORD m_dwReturn[25] = {0}; // 原始函数返回地址
// 获取原始函数地址 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; }
// 加载原始模块 inline BOOL WINAPI Load() { TCHAR tzPath[MAX_PATH]; TCHAR tzTemp[MAX_PATH * 2];
lstrcpy(tzPath, TEXT("nw_elfOrg.dll")); m_hModule = LoadLibrary(tzPath); if (m_hModule == NULL) { wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath); MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP); } else { InitializeAddresses(); }
return (m_hModule != NULL); } // 释放原始模块 inline VOID WINAPI Free() { if (m_hModule) { FreeLibrary(m_hModule); } } } using namespace AheadLib; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 入口函数 BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved) { if (dwReason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hModule);
return Load(); } else if (dwReason == DLL_PROCESS_DETACH) { Free(); }
return TRUE; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL AheadLib_Noname0(void) { GetAddress(MAKEINTRESOURCE(0)); __asm JMP EAX; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1>dllmain.obj : fatal error LNK1119: 无效的序号“0” 这怎么解?
|
能力值:
( LV1,RANK:0 )
|
-
-
25 楼
感谢!
|
|
|