⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exports.cpp

📁 Hook API 实现文件名自动变换。并提供相关的测试程序。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*========================================================================
文件: exports.cpp
说明:全局消息钩子 
时间:2004-09-15
编写:oshj || oshj@21cn.com
环境:VC6.0/Win2000 Pro/SP4/1024*768
特别说明:本程序目的是更改其他程序窗口的显示内容(如数值)。用枚举主窗口
		  和子窗口的方法只能找到有句柄的控件,发消息进行更改。对无句柄
		  的控件就无能为力了,在spy++里都无法枚举Delphi/BCB/VB的label控件的
		  只能采用截获TextOut的方法了,没想到其他更好的办法:-)这种就是
		  所谓的屏幕取词技术了,金山词霸用的就是这种方法。

版权累死人,想用就用吧:-)
=========================================================================*/
//-------------------------------------------------------------------------
//原理:
//	采用类似屏幕取词的方式,动态注入DLL到EXE进程。截获TextOut并判断当前要写
//到屏幕的内容是否是数字(Int或者Float等),如果是则×0.5(或其他预先设定的基数)
//然后再写到屏幕上。
//	所以一定要清楚的认识到:本程序只是临时欺骗,更改屏幕显示的数字而已,
//并不更改实际的数据,包括报表打印和数据导出(如导出到Excel等)均无能为力。
//唯一的办法就是屏蔽,使之无效。或者干脆彻底注销界面上的这些按钮。
//已知BUG或缺陷:
//1、时间控件类的时间也被HOOK更改了;
//2、由于HOOK的数据×0.50(或其他基数)之后可能有了少数点,长度增长,可能导致
//	 新写到屏幕上的数据位置不准确;
//3、类似0010123的序号也被当作数字HOOK了,并×0.5,可以增加类似的判断;
//	 但由于采用的全局消息钩子,如果判断太多会导致系统消耗太大,必须精简算法。
//4、类似 [1234],:235,...等凡是中文和数字、字母和数字、符号和数字混合的,
//   均会忽略掉,不进行计算。
//5、由于无法更改打印和数据导出等实际数据,所以将包含有“导出”、“Excel”、
//	 “打印”字样的有句柄的窗口(button、form等)全部注销!
//-------------------------------------------------------------------------
//; 警告:本程序仅为学习研究作品,不涉及任何商业利益。
//; 请慎重使用,由此产生的一切后果由使用者承担!
//; FNUM为计算的基数 (0 < FNUM < 1),保留两位小数点。
//; 如果配置文件损坏或删除,程序将采用缺省值:0.50
//-------------------------------------------------------------------------
//系统热键定义如下:
//呼叫程序窗口:Alt + A
//彻底隐藏运行:Alt + B 
//开始数据钩子:Alt + C
//停止数据钩子:Alt + D
//悄悄退出程序:Alt + E 
//-------------------------------------------------------------------------
#include "exports.h"
#include "hookapi.h"
#include "public.h"
//-------------------------------------------------------------------------
#pragma data_seg(".sdata")
//缺省为0.5,从配置文件中读取
float m_fNumber = 0.50; //用于作弊计算的基数 0 < m_fNumber < 1
#pragma data_seg()
#pragma comment(linker,"-section:.sdata,rws")
//-------------------------------------------------------------------------
HHOOK		g_hHook		= NULL;	// 安装的鼠标钩子句柄
HINSTANCE	g_hinstDll	= NULL; // DLL实例句柄
HWND		g_hWndTag	= NULL;	//注入的EXE窗体句柄

//-------------------------------------------------------------------------
//
APIHOOKSTRUCT g_MessageBoxAHook = {
	"user32.dll",
	"MessageBoxA",
	0,
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	NULL,
	"NHMessageBoxA",
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	0,
	{0XFF, 0X15, 0XFA, 0X13, 0XF3, 0XBF, 0X33}
};

APIHOOKSTRUCT g_MessageBoxWHook = {
	"user32.dll",
	"MessageBoxW",
	0,
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	NULL,
	"NHMessageBoxW",
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	0,
	{0XFF, 0X15, 0XFA, 0X13, 0XF3, 0XBF, 0X33}
};

APIHOOKSTRUCT g_BitBltHook = {
	"gdi32.dll",
	"BitBlt",
	0,
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	NULL,
	"NHBitBlt",
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	0,
	{0XFF, 0X15, 0XFA, 0X13, 0XF3, 0XBF, 0X33}
};

APIHOOKSTRUCT g_TextOutAHook = {
	"gdi32.dll",
	"TextOutA",
	0,
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	NULL,
	"NHTextOutA",
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	0,
	{0XFF, 0X15, 0XFA, 0X13, 0XF3, 0XBF, 0X33}
};

APIHOOKSTRUCT g_TextOutWHook = {
	"gdi32.dll",
	"TextOutW",
	0,
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	NULL,
	"NHTextOutW",
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	0,
	{0XFF, 0X15, 0XFA, 0X13, 0XF3, 0XBF, 0X33}
};

APIHOOKSTRUCT g_ExtTextOutAHook = {
	"gdi32.dll",
	"ExtTextOutA",
	0,
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	NULL,
	"NHExtTextOutA",
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	0,
	{0XFF, 0X15, 0XFA, 0X13, 0XF3, 0XBF, 0X33}
};

APIHOOKSTRUCT g_ExtTextOutWHook = {
	"gdi32.dll",
	"ExtTextOutW",
	0,
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	NULL,
	"NHExtTextOutW",
	NULL,
	{0, 0, 0, 0, 0, 0, 0},
	0,
	{0XFF, 0X15, 0XFA, 0X13, 0XF3, 0XBF, 0X33}
};

//-------------------------------------------------------------------------
//dll main
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason) 
	{
		case DLL_PROCESS_ATTACH:

			g_hinstDll = hinstDLL;

			g_BitBltHook.hInst = hinstDLL;
			g_TextOutAHook.hInst = hinstDLL;
			g_TextOutWHook.hInst = hinstDLL;
			g_ExtTextOutAHook.hInst = hinstDLL;
			g_ExtTextOutWHook.hInst = hinstDLL;
			g_MessageBoxAHook.hInst = hinstDLL;
			g_MessageBoxWHook.hInst = hinstDLL;
			//DisableThreadLibraryCalls(hinstDLL);

			break;

		case DLL_THREAD_ATTACH:
			 break;

		case DLL_THREAD_DETACH:
			 break;
		
		case DLL_PROCESS_DETACH:

			UnHookAllTextOut();

			break;
    }

    return TRUE;
}

//-------------------------------------------------------------------------
//从这里转到各HOOK函数
void HookAllTextOut()
{
	//HookWin32Api(&g_BitBltHook, HOOK_CAN_WRITE);
	HookWin32Api(&g_TextOutAHook, HOOK_CAN_WRITE);
	HookWin32Api(&g_TextOutWHook, HOOK_CAN_WRITE);
	HookWin32Api(&g_ExtTextOutAHook, HOOK_CAN_WRITE);
	HookWin32Api(&g_ExtTextOutWHook, HOOK_CAN_WRITE);
	HookWin32Api(&g_MessageBoxAHook, HOOK_CAN_WRITE);
	HookWin32Api(&g_MessageBoxWHook, HOOK_CAN_WRITE);
}
//-------------------------------------------------------------------------
//恢复HOOK函数
void UnHookAllTextOut()
{
	//RestoreWin32Api(&g_BitBltHook, HOOK_NEED_CHECK);
	RestoreWin32Api(&g_TextOutAHook, HOOK_NEED_CHECK);
	RestoreWin32Api(&g_TextOutWHook, HOOK_NEED_CHECK);
	RestoreWin32Api(&g_ExtTextOutAHook, HOOK_NEED_CHECK);
	RestoreWin32Api(&g_ExtTextOutWHook, HOOK_NEED_CHECK);
	RestoreWin32Api(&g_MessageBoxAHook, HOOK_NEED_CHECK);
	RestoreWin32Api(&g_MessageBoxWHook, HOOK_NEED_CHECK);
}

//-------------------------------------------------------------------------
//以下的函数干的就是狸猫换太子的勾当:-)
DLLEXPORT BOOL WINAPI NHMessageBoxA(HWND hWnd, 
									LPCTSTR lpText,
									LPCTSTR lpCaption,  
									UINT uType )
{
	
	// restore
	RestoreWin32Api(&g_MessageBoxAHook, HOOK_NEED_CHECK);

	// call BitBlt
	MessageBoxA(hWnd,lpText,"【独钓寒江雪】",uType);

	HookWin32Api(&g_MessageBoxAHook, HOOK_NEED_CHECK);

	return TRUE;
}

DLLEXPORT BOOL WINAPI NHMessageBoxW(HWND hWnd, 
									LPCWSTR lpText,
									LPCWSTR lpCaption,  
									UINT uType )
{
	
	// restore
	RestoreWin32Api(&g_MessageBoxWHook, HOOK_NEED_CHECK);

	// call BitBlt
	MessageBoxW(hWnd,lpText,L"【独钓寒江雪】",uType);

	HookWin32Api(&g_MessageBoxWHook, HOOK_NEED_CHECK);

	return TRUE;
}

DLLEXPORT BOOL WINAPI NHBitBlt(HDC hdcDest,
						       int nXDest,
						       int nYDest,
						       int nWidth,
						       int nHeight,
						       HDC hdcSrc,
						       int nXSrc,
						       int nYSrc,
						       DWORD dwRop)
{
	
	// restore
	RestoreWin32Api(&g_BitBltHook, HOOK_NEED_CHECK);

	// call BitBlt
	BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight,
		   hdcSrc, nXSrc, nYSrc, dwRop);

	HookWin32Api(&g_BitBltHook, HOOK_NEED_CHECK);

	return TRUE;
}

DLLEXPORT BOOL WINAPI NHTextOutA(HDC hdc,
							     int nXStart,
							     int nYStart,
							     LPCTSTR lpString,
							     int cbString)
{
	
	float fNumTmp;
	char sTmp[1024]={'\0'}; 

	// restore
	RestoreWin32Api(&g_TextOutAHook, HOOK_NEED_CHECK);

	//---------------------------------------------------
	try

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -