用Aheadlib 生成lpk 修改了下


传送门:AheadLib 2.2.150

传送门:AheadLib 2.2.150 源码


Aheadlib 默认生成的lpk没办法直接使用 必须修改 

下面是我参考了一个朋友给我的源 修改而成





// 头文件
#include <Windows.h>



#pragma comment(linker, "/SECTION:.text,REW" ) //设PE节:.text,可读可执行    貌似是为了那个特殊函数而设置的?

// 导出函数
#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((LPSTR)tzPath,MAX_PATH);
		strcat_s(tzPath,"\\lpk.dll");
		m_hModule = LoadLibrary(tzPath);
		if (m_hModule == NULL)
		{
			wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
			MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
		}

		return (m_hModule != NULL);	
	}
		
	// 释放原始模块
	inline VOID WINAPI Free()
	{
		if (m_hModule)
		{
			FreeLibrary(m_hModule);
		}
	}

	// 获取原始函数地址
	FARPROC WINAPI GetAddress(PCSTR pszProcName)
	{
		FARPROC fpAddress;
		CHAR szProcName[16];
		TCHAR tzTemp[MAX_PATH];

		fpAddress = GetProcAddress(m_hModule, pszProcName);
		if (fpAddress == NULL)
		{
			if (HIWORD(pszProcName) == 0)
			{
				wsprintf(szProcName, "%d", pszProcName);
				pszProcName = szProcName;
			}

			wsprintf(tzTemp, TEXT("无法找到函数 %hs,程序无法正常运行。"), pszProcName);
			MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
			ExitProcess(-2);
		}

		return fpAddress;
	}
}
using namespace AheadLib;

extern "C" {
void	AheadLib_LpkEditControl();
}
BOOL	g_Init=FALSE;

// 入口函数

/***********************************************************
*		创建日期:	2011/08/18	1:47	
*		作    者:	SW
*		备    注:	newl.cpp
*		函数功能:	
*		返 回 值:	
***********************************************************/
BOOL WINAPI InitializeMyData()
{
	BOOL bREt = Load();
	DWORD pLpkEditControl =  (DWORD)GetProcAddress(m_hModule,"LpkEditControl");
	CopyMemory((LPVOID)((DWORD)AheadLib_LpkEditControl-4),(PVOID)((DWORD)pLpkEditControl-4),0x44);

	//初始化放在这里好了
	OutputDebugString("初始化放到这里好了");

	return bREt;
}
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		BOOL bRet =TRUE;
		DisableThreadLibraryCalls(hModule);
		if (g_Init)
		{
			OutputDebugString("DllMain lpk has Initialized");
		}
		else
		{
			g_Init=TRUE;
			OutputDebugString("lpk DllMain  Initialize");
			bRet = InitializeMyData();
		}
		return bRet;
	}
	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];
//	OutputDebugString("AheadLib_LpkDllInitialize");
	// 调用原始函数
	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];
}




extern "C" {
	__declspec(naked) void	AheadLib_LpkEditControl()
	{
		__asm nop	__asm nop	__asm nop		__asm nop		__asm nop		__asm nop		__asm nop		__asm nop
		__asm nop		__asm nop		__asm nop		__asm nop	__asm nop
		__asm nop
		__asm nop
		__asm nop
		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm nop
		__asm nop
		__asm nop
		__asm nop

		__asm _emit 0
		__asm _emit 0
		__asm _emit 0
		__asm _emit 0
	}
}

// 导出函数
// 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];
	if (!g_Init)	//这个函数可能会优于 dllmain 被调用 so...
	{
		OutputDebugString("LpkInitialize Initialize");
		g_Init=TRUE;
		if (!InitializeMyData())
		{
			MessageBox(0,"lpk Initialize Failure!","error",0);
			ExitProcess(EXIT_FAILURE);
		}
	}
	// 调用原始函数
	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];
}




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、简介   AheadLib 是用来生成一个特洛伊DLL的工具,用于分析DLL中的函数参数调用(比如记录Socket send了什么等等)、更改函数功能(随心所欲了:)、更改界面功能(比如在Hook里面生成一个按钮,截获事件等等)。 二、使用   1.用 AheadLib 打开要模拟的 DLL,生成一个 CPP 文件。   2.用 Visual Studio 6.0/.NET 建立一个 DLL 工程,把这个 CPP 文件加入到项目中。   3.使用 Release 方式编译,生成的 DLL 将和原来的 DLL 具有一模一样的导出函数,并且能顺利把这些函数转发到原来的函数中。   4.AheadLib 还可以生成 Hook 代码,用于截取当前进程的所有消息,这样就可以随心所欲地处理各种消息了 (修改第三方程序界面功能的好助手)。 三、备注   1.如果导出函数过多,在 Visual Studio 6.0 中,如果出现编译错误,请在项目属性关闭与编译头功能。   2.如果是 C++ 、C __stdcall、C __fastcall 的方式导出的话,生成的函数声明将会还原成原代码级别(可能需要修改才能编译,比如导出C++类的情况)。此时使用 __declspec(dllexport) 导出 ——不能指定导出序号。   3.如果是 NONAME 或者 C _CDECL 方式导出(比如 DEF 导出,大多数Windows DLL都是这种情况,比如WS2_32等等),则使用#pragma comment(linker, "/EXPORT:...)导出,且指定导出序号。   4.如果系统中没有 DbgHelp.dll,将无法识别 C++ 模式的导出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值