?? exports.cpp
字號:
/*========================================================================
文件: 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 + -