首页
社区
课程
招聘
[下载]AheadLib修改版本
发表于: 2014-12-30 19:52 39292

[下载]AheadLib修改版本

2014-12-30 19:52
39292

基于AheadLib修改版本 Happy 牛 Year! 修改的。

修正一些BUG。大家用用看


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 9
支持
分享
最新回复 (27)
雪    币: 8
活跃值: (2801)
能力值: ( 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;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2014-12-30 19:54
0
雪    币: 175
活跃值: (2601)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个荧光很有用处,收藏一个。
2014-12-30 20:04
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
4
请问修改了哪些BUG?
2014-12-30 20:24
0
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
同问。。。
2014-12-30 21:13
0
雪    币: 13396
活跃值: (4441)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
三问求解
2014-12-30 22:44
0
雪    币: 8
活跃值: (2801)
能力值: ( 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里的比对一下吧。

谢谢
2014-12-31 01:56
0
雪    币: 433
活跃值: (1930)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
先说感谢

感谢!
2014-12-31 02:58
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
目测会有大手围观!第一页广告位!
2014-12-31 06:19
0
雪    币: 220
活跃值: (766)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我记得LPK中有几个函数是个数组??
2014-12-31 07:19
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
11
生成的CPP文件缺少InitializeAddresses()函数。不能用。
2015-1-12 09:04
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
12
我记得原版中对于LpkEditControl要特殊处理
2015-1-12 11:36
0
雪    币: 8
活跃值: (2801)
能力值: ( 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];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

没有见到特殊处理呀
2015-1-15 00:53
0
雪    币: 2434
活跃值: (1427)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
老 K 說的【特殊处理】,跟 dll 無關。
這是 lpk.dll  的特殊性。
其它 dll 大多沒這煩惱。
2015-1-15 14:55
0
雪    币: 8
活跃值: (2801)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
知道了。 谢谢K大,Z大。
2015-1-16 12:41
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
16
lz再改改,争取支持x64
2015-1-16 15:29
0
雪    币: 8
活跃值: (2801)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我水平有限,对x64没太多研究。 把源码放上来,让有兴趣的朋友一起努力。
上传的附件:
2015-1-16 22:48
0
雪    币: 8
活跃值: (2801)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
XP、Win 7都可以用的lpk.cpp应该是怎样的呢?
2015-1-16 23:59
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
19
LpkEditControl导出的是数组,不是单一的函数,所以需要修改一下

EXTERNC EXPORT void __cdecl MemCode_LpkEditControl(void);
EXTERNC __declspec(dllexport) void (*LpkEditControl[14])() = {MemCode_LpkEditControl};
2015-1-17 14:27
0
雪    币: 8
活跃值: (2801)
能力值: ( 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;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2015-1-24 15:50
0
雪    币: 139
活跃值: (1175)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
有符号的导出函数DLL,也能劫持调用吗?
2018-2-8 11:04
0
雪    币: 1085
活跃值: (250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bxb
22
不错的东西,还给出了源码,非常感谢
2018-12-5 14:23
0
雪    币: 244
活跃值: (189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
旧贴新问,
/ 保存返回地址
        __asm POP m_dwReturn[4 * TYPE long];

        // 调用原始函数
        GetAddress("LpkExtTextOut")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[4 * TYPE long];

这个是在多线程调用时,是否有问题呢?俺现在遇到大部分函数都没问题,有些崩溃的问题
2019-6-28 09:45
0
雪    币: 38
活跃值: (11)
能力值: ( 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”  这怎么解?
2020-3-18 09:50
0
雪    币: 299
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
感谢!
2021-8-13 19:34
0
游客
登录 | 注册 方可回帖
返回
//