改造的HookYou的代码,但是出现access violation 错误,不知如何是好,着急

Delphi 通过Access Violation地址错误找到错误的哪行代码 什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。 DELPHI下生成MAP文件的方法:生成详细的MAP信息的方法(二选一)1. project -> options -> Linker -> Map file ... 阅读详情

/*========================================================================
文件: exports.h
说明:全局消息钩子
时间:2004-09-15
编写:oshj || oshj@21cn.com
环境:VC6.0/Win2000 Pro/SP4/1024*768
特别说明:本程序目的是更改其他程序窗口的显示内容(如数值)。用枚举主窗口
          和子窗口的方法只能只能找到有句柄的控件,发消息进行更改。对无句柄
          的控件就无能为力了,在spy++里都无法枚举Delphi/BCB/VB的label控件的
          只能采用截获TextOut的方法了,没想到其他更好的办法:-)这种就是
          所谓的屏幕取词技术了,金山词霸用的就是这种方法。
=========================================================================*/
//-------------------------------------------------------------------------
#ifndef _INC_EXPORTS
#define _INC_EXPORTS

#include <windows.h>
#include <stdio.h>
//-------------------------------------------------------------------------
#define DLLEXPORT __declspec(dllexport)
//-------------------------------------------------------------------------
#define MAX_TEXTLEN 1024
#define UM_GETTEXT WM_USER + 0x392
//-------------------------------------------------------------------------
//开始钩
void HookAllTextOut();
//停止钩子
void UnHookAllTextOut();
//-------------------------------------------------------------------------
//消息回调函数
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam);
//枚举子窗体回调函数
BOOL CALLBACK EnumChildWindowsProc( HWND hWnd, LPARAM lParam );
//-------------------------------------------------------------------------
// hook api
DLLEXPORT BOOL WINAPI NHBitBlt(HDC hdcDest,
                               int nXDest,
                               int nYDest,
                               int nWidth,
                               int nHeight,
                               HDC hdcSrc,
                               int nXSrc,
                               int nYSrc,
                               DWORD dwRop);

DLLEXPORT BOOL WINAPI NHTextOutA(HDC hdc,
                                 int nXStart,
                                 int nYStart,
                                 LPCTSTR lpString,
                                 int cbString);

DLLEXPORT BOOL WINAPI NHTextOutW(HDC hdc,
                                 int nXStart,
                                 int nYStart,                                
                                 LPCWSTR lpString,
                                 int cbString);

DLLEXPORT BOOL WINAPI NHExtTextOutA(HDC hdc,
                                    int X,
                                    int Y,
                                    UINT fuOptions,
                                    CONST RECT *lprc,
                                    LPCTSTR lpString,
                                    UINT cbCount,
                                    CONST INT *lpDx);

DLLEXPORT BOOL WINAPI NHExtTextOutW(HDC hdc,
                                    int X,
                                    int Y,
                                    UINT fuOptions,
                                    CONST RECT *lprc,
                                    LPCWSTR lpString,
                                    UINT cbCount,
                                    CONST INT *lpDx);

DLLEXPORT BOOL WINAPI ReadFile2(HANDLE hFile,
                                LPVOID lpBuffer,
                                DWORD nNumberOfBytesToRead,
                                LPDWORD lpNumberOfBytesRead,
                                LPOVERLAPPED lpOverlapped );

//-------------------------------------------------------------------------

#endif // _INC_EXPORTS

 

/*========================================================================
文件: 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"


#include <string.h>
#include <TCHAR.H>
#include "PSAPI.H"


#pragma comment(lib, "psapi.lib")

#define BUFSIZE 512

//-------------------------------------------------------------------------
#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}
};


APIHOOKSTRUCT g_ReadFile = {
    "kernel32.dll",
    "ReadFile",
    0,
    NULL,
    {0, 0, 0, 0, 0, 0, 0},
    NULL,
    "ReadFile2",
    NULL,
    {0, 0, 0, 0, 0, 0, 0},
    0,
    {0XFF, 0X15, 0XFA, 0X13, 0XF3, 0XBF, 0X33}
};




//************************************
// Method   :  ReadFile2
// FullName : 
// Returns  :  BOOL
// Parameter: 
// Remark   :  our api ReadFile to hook ReadFile in WINAPI
//************************************
DLLEXPORT BOOL WINAPI ReadFile2(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped )
{

    // restore
    RestoreWin32Api(&g_ReadFile, HOOK_NEED_CHECK);
   
    // call BitBlt
    MessageBoxA(NULL,"","【独钓寒江雪】",0);
   
   


    //RestoreWin32Api(&g_ReadFile, HOOK_NEED_CHECK);   

    //GetFileNameFromHandle(hFile);


    BOOL ret = ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped );

    HookWin32Api(&g_ReadFile, HOOK_NEED_CHECK);
               
    //HookWin32Api(&g_ReadFile, HOOK_NEED_CHECK);
   

    //return ret;
    return TRUE;
}




//-------------------------------------------------------------------------
//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);

            //MessageBox(NULL,"before","",0);
            g_ReadFile.hInst = hinstDLL;
            //MessageBox(NULL,"after","",0);
           

            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);

    //HookWin32Api(&g_ReadFile, 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);

    //RestoreWin32Api(&g_ReadFile, 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
    {
        //---------------------------------------------------
        if( IsDigital(lpString) || IsFloat(lpString) )
        {
            fNumTmp = (float)(m_fNumber * strtod(lpString,NULL));   
            sprintf(sTmp,"%0.2f",fNumTmp);
            TextOutA(hdc, nXStart, nYStart, sTmp, strlen(sTmp));
           
        }
        else
        {
            TextOutA(hdc, nXStart, nYStart, lpString, cbString);
        }   
    }
    catch(...)
    {
        TextOutA(hdc, nXStart, nYStart, lpString, cbString);
    }
   
    //---------------------------------------------------
    //TextOutA(hdc, nXStart, nYStart, lpString, cbString);
   
    HookWin32Api(&g_TextOutAHook, HOOK_NEED_CHECK);

    return TRUE;
}

DLLEXPORT BOOL WINAPI NHTextOutW(HDC hdc,
                                 int nXStart,
                                 int nYStart,
                                 LPCWSTR lpString,
                                 int cbString)
{
   
    float fNumTmp;
    wchar_t sTmp[1024]={'/0'};

    // restore
    RestoreWin32Api(&g_TextOutWHook, HOOK_NEED_CHECK);
   
    //--------------------------------------------------------------
    try
    {
        if( IsWDigital(lpString) || IsWFloat(lpString) )
        {
            fNumTmp = (float)(wcstod(lpString,NULL) * m_fNumber);
            swprintf(sTmp,L"%0.2f",fNumTmp);
            TextOutW(hdc, nXStart, nYStart, sTmp, wcslen(sTmp));

        }
        else
        {
            // call ExtTextOutA
            TextOutW(hdc, nXStart, nYStart, lpString, cbString);
        }
    }
    catch(...)
    {
        TextOutW(hdc, nXStart, nYStart, lpString, cbString);
    }
    //--------------------------------------------------------------
   
    // call TextOutW
    //TextOutW(hdc, nXStart, nYStart, lpString, cbString);

    HookWin32Api(&g_TextOutWHook, HOOK_NEED_CHECK);

    return TRUE;
}

DLLEXPORT BOOL WINAPI NHExtTextOutA(HDC hdc,
                                    int X,
                                    int Y,
                                    UINT fuOptions,
                                    CONST RECT *lprc,
                                    LPCTSTR lpString,
                                    UINT cbCount,
                                    CONST INT *lpDx)
{
    float fNumTmp=0;
    char sTmp[1024]={'/0'};

    // restore
    RestoreWin32Api(&g_ExtTextOutAHook, HOOK_NEED_CHECK);

    try
    {
        //---------------------------------------------------
        if( IsDigital(lpString) || IsFloat(lpString) )
        {
            fNumTmp = (float)(m_fNumber * strtod(lpString,NULL));   
            sprintf(sTmp,"%0.2f",fNumTmp);
            ExtTextOutA(hdc, X-6, Y, fuOptions, lprc, sTmp, strlen(sTmp), lpDx);
           
        }
        else
        {
            // call ExtTextOutA
            ExtTextOutA(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx);
        }   
    }
    catch(...)
    {
        ExtTextOutA(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx);
    }

    // call ExtTextOutA
    //ExtTextOutA(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx);

    HookWin32Api(&g_ExtTextOutAHook, HOOK_NEED_CHECK);

    return TRUE;
}

DLLEXPORT BOOL WINAPI NHExtTextOutW(HDC hdc,
                                    int X,
                                    int Y,
                                    UINT fuOptions,
                                    CONST RECT *lprc,
                                    LPCWSTR lpString,
                                    UINT cbCount,
                                    CONST INT *lpDx)
{
    float fNumTmp;
    wchar_t sTmp[1024]={'/0'};

    // restore
    RestoreWin32Api(&g_ExtTextOutWHook, HOOK_NEED_CHECK);
   
    //---------------------------------------------------
    try
    {
        if( IsWDigital(lpString) || IsWFloat(lpString) )
        {
            fNumTmp = (float)(wcstod(lpString,NULL) * m_fNumber);
            swprintf(sTmp,L"%0.2f",fNumTmp);
            ExtTextOutW(hdc, X-6, Y, fuOptions, lprc, sTmp, wcslen(sTmp), lpDx);

        }
        else
        {
            // call ExtTextOutA
            ExtTextOutW(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx);
        }
    }
    catch(...)
    {
        ExtTextOutW(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx);
    }
   
    // call ExtTextOutW
    //ExtTextOutW(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx);

    HookWin32Api(&g_ExtTextOutWHook, HOOK_NEED_CHECK);

    return TRUE;
}

//-------------------------------------------------------------------------
//消息回调函数
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{   
    HookAllTextOut();
   
    char sClass[255]={'/0'};   
    if(nCode >= 0)
    { 
        LPMSG pMsg = (LPMSG)lParam;       
        g_hWndTag = pMsg->hwnd;
       
        if(NULL != g_hWndTag)
        {
            GetClassName(g_hWndTag,sClass,256);
            //如果这个窗口的类名是T开头的
            if( 0 == strncmp(sClass,"T",1) )
            {
               
                EnumChildWindows(g_hWndTag, EnumChildWindowsProc,0);
            }

        }
    }
   
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);

}

//-------------------------------------------------------------------------
//枚举子窗体回调函数
BOOL CALLBACK EnumChildWindowsProc( HWND hWnd, LPARAM lParam )
{
    char buff[256]={'/0'};

    if(::GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE)
    {
        ::GetWindowText(hWnd,buff,256);

        //注销这些按钮或窗体
        if(NULL != strstr(buff,"打印") ||
            NULL != strstr(buff,"Excel") ||
            NULL != strstr(buff,"导出") )
        {
            //这种只是屏蔽,界面上仍可看见
            //EnableWindow(hWnd,FALSE);
            //彻底注销,一劳永逸:-)
            DestroyWindow(hWnd);
        }

    }

    return TRUE;
}


//-------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////
//-------------------------------------------------------------------------
//输出函数
//开始钩
DLLEXPORT BOOL WINAPI SetNHW32()
{
    //------------------------------------------------------------
    LPCTSTR iniFile = ".//config.ini";        // “.//”表示当前路径       
    char sTmp[256] = {'/0'};
    GetPrivateProfileString("NUM","FNUM",NULL,sTmp,256,iniFile);
    //MsgErr(sTmp);
    m_fNumber = strtod(sTmp,NULL);
    if(m_fNumber<=0.00)
    {
        m_fNumber = 0.50;
    }
   
    //------------------------------------------------------------

    if(g_hHook == NULL)
    {
        g_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hinstDll, 0);
        if (g_hHook == NULL)
        {
            //MessageBox(NULL, __TEXT("Error hooking."),
            //           __TEXT("GetWord"), MB_OK);
            return FALSE;
        }
    }

    return TRUE;
}

//-------------------------------------------------------------------------
//输出函数
//停止钩子
DLLEXPORT BOOL WINAPI ResetNHW32()
{
    if (g_hHook != NULL)
    {
        if (!UnhookWindowsHookEx(g_hHook))
        {
            return FALSE;
        }

        g_hHook = NULL;
       
    }

    return TRUE;
}

 

hook api 的主要方法

 

/////////////////////////////////////////////////////////////////////////
//
// hookapi.c
//
// Date   : 04/18/99
//
// oshj add 20040916 有这些现成的函数真爽,原作者好像是个台湾同胞
//
/////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include "hookapi.h"
#include "string.h"

//#pragma comment(lib, "k32lib.lib")

//extern BOOL g_bCanWrite;

/////////////////////////////////////////////////////////////////////////
// Hook Api
/////////////////////////////////////////////////////////////////////////
FARPROC WINAPI NHGetFuncAddress(HINSTANCE hInst, LPCSTR lpMod, LPCSTR lpFunc)
{
    HMODULE hMod;
    FARPROC procFunc;

    if (NULL != lpMod)
    {
        hMod=GetModuleHandle(lpMod);
        procFunc = GetProcAddress(hMod,lpFunc);
    }
    else
    {
        procFunc = GetProcAddress(hInst,lpFunc);

    }
   
    return  procFunc;
}

void MakeJMPCode(LPBYTE lpJMPCode, LPVOID lpCodePoint)
{
    BYTE temp;
    WORD wHiWord = HIWORD(lpCodePoint);
    WORD wLoWord = LOWORD(lpCodePoint);
    WORD wCS;

    _asm                        // 取當前選擇符﹒
    {
        push ax;
        push cs;
        pop  ax;
        mov  wCS, ax;
        pop  ax;
    };
   
    lpJMPCode[0] = 0xea;        // 填入 JMP 指令的機器碼﹒

    temp = LOBYTE(wLoWord);        // -------------------------
    lpJMPCode[1] = temp;
    temp = HIBYTE(wLoWord);
    lpJMPCode[2] = temp;        // 填入地址﹒在內存中的順序為;
    temp = LOBYTE(wHiWord);        // Point: 0x1234
    lpJMPCode[3] = temp;        // 內存: 4321
    temp = HIBYTE(wHiWord);
    lpJMPCode[4] = temp;        // -------------------------
   
    temp = LOBYTE(wCS);            // 填入選擇符﹒
    lpJMPCode[5] = temp;
    temp = HIBYTE(wCS);
    lpJMPCode[6] = temp;

    return;
}

void HookWin32Api(LPAPIHOOKSTRUCT lpApiHook, int nSysMemStatus)
{   
    DWORD  dwReserved;
    DWORD  dwTemp;
    BYTE   bWin32Api[5];

    bWin32Api[0] = 0x00;

    //TextOut(GetDC(GetActiveWindow()),2,15,"here",20);

    // 取得被攔截函數地址﹒
    if(lpApiHook->lpWinApiProc == NULL)
    {   
        lpApiHook->lpWinApiProc = (LPVOID)NHGetFuncAddress(lpApiHook->hInst, lpApiHook->lpszApiModuleName,lpApiHook->lpszApiName);
        if (lpApiHook->dwApiOffset != 0)
            lpApiHook->lpWinApiProc = (LPVOID)((DWORD)lpApiHook->lpWinApiProc + lpApiHook->dwApiOffset);
    }
    // 取得替代函數地址﹒
    if(lpApiHook->lpHookApiProc == NULL)
    {
        lpApiHook->lpHookApiProc = (LPVOID)NHGetFuncAddress(lpApiHook->hInst,
            lpApiHook->lpszHookApiModuleName,lpApiHook->lpszHookApiName);
    }
    // 形成 JMP 指令﹒
    if (lpApiHook->HookApiFiveByte[0] == 0x00)
    {
        MakeJMPCode(lpApiHook->HookApiFiveByte, lpApiHook->lpHookApiProc);
    }

    if (!VirtualProtect(lpApiHook->lpWinApiProc, 16, PAGE_READWRITE,
            &dwReserved))
    {
        MessageBox(NULL, "VirtualProtect-READWRITE", NULL, MB_OK);
        return;
    }
   
    if (nSysMemStatus == HOOK_NEED_CHECK)
    {
        memcpy(lpApiHook->lpWinApiProc, (LPVOID)lpApiHook->HookApiFiveByte,BUFFERLEN);
    }
    else
    {
        if (lpApiHook->WinApiFiveByte[0] == 0x00)            // 判斷是否已經攔截﹒
        {
            // 否﹒
            // 備份 API 函數頭五個字節﹒
            memcpy(lpApiHook->WinApiFiveByte,(LPVOID)lpApiHook->lpWinApiProc,BUFFERLEN);
            // 判斷是否重複攔截﹒(即判斷備份的頭五個字節是否為形成的JMP指令)
            if (strncmp((const char*)lpApiHook->WinApiFiveByte,
                (const char*)lpApiHook->HookApiFiveByte, BUFFERLEN) == 0)
            {
                // 恢復備份的字節﹒
                memcpy(lpApiHook->WinApiFiveByte,(LPVOID)lpApiHook->WinApiBakByte,BUFFERLEN);
            }
        }
        else
        {
            // 是﹒
            memcpy(bWin32Api,(LPVOID)lpApiHook->lpWinApiProc,BUFFERLEN);
        }

        if (strncmp((const char*)bWin32Api, (const char*)lpApiHook->HookApiFiveByte,
            BUFFERLEN) != 0)
        {
            // 將 JMP 指定填入 API 函數的頭﹒
            memcpy(lpApiHook->lpWinApiProc, (LPVOID)lpApiHook->HookApiFiveByte,BUFFERLEN);
        }
    }

    if (!VirtualProtect(lpApiHook->lpWinApiProc, 16, dwReserved, &dwTemp))
    {
        MessageBox(NULL, "VirtualProtect-RESTORE", NULL, MB_OK);
        return;
    }
   
}

void RestoreWin32Api(LPAPIHOOKSTRUCT lpApiHook, int nSysMemStatus)
{
    DWORD dwReserved;
    DWORD dwTemp;

    if (lpApiHook->lpWinApiProc == NULL)
        return;

    if (!VirtualProtect(lpApiHook->lpWinApiProc, 16, PAGE_READWRITE,
            &dwReserved))
    {
        MessageBox(NULL, "VirtualProtect-READWRITE", NULL, MB_OK);
        return;
    }
    memcpy(lpApiHook->lpWinApiProc,(LPVOID)lpApiHook->WinApiFiveByte,BUFFERLEN);
    if (!VirtualProtect(lpApiHook->lpWinApiProc, 16, dwReserved, &dwTemp))
    {
        MessageBox(NULL, "VirtualProtect-RESTORE", NULL, MB_OK);
        return;
    }
}

CMOS sensor 基础 NA 阅读详情

相关推荐

YOLO11 锚框机制全解析:从改进 K-means 聚类到自适应优化,附多场景实战(附代码

摘要 YOLO11的锚框机制采用"自适应、动态化、场景感知"的设计理念,通过数据驱动的锚框生成、多尺度感知分配和实时优化策略,显著提升目标检测性能。相较于早期YOLO版本,YOLO11的锚框完全基于训练集目标分布自适应生成,并引入智能分配策略,使不同尺寸目标获得最优匹配。技术架构包含自适应锚框生成、多尺度分配器和动态优化模块,通过改进的K-means聚类和交并比计算实现精准匹配。YOLO11锚框机制在检测精度、训练稳定性和场景适应性方面均有显著提升,为复杂场景下的目标检测提供更优解决方案

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1289

HOOK API技术

里面是我从网站上查询的HOOK技术,对此有了个了解急需赚取积分下载文件,请原谅

金山词霸屏幕取词原理(源代码)

自己写的 金山词霸类翻译软件的屏幕取词的原理性的源代码 分为三个部分 dll中是HOOK TextOutA的代码和安装钩子的代码 test是目标程序 此程序使用了TextOut函数 DLL_test是将DLL注入到目标程序的

Hook textout可能遇到的问题

一、因为TextOutA等函数还会调用ExtTextOutW之类函数,如果hook所有TextOut函数,则对同一次文本输出,会产生两次拦截。 二、ExtTextOutA(.......UINT c,.....)函数中,参数c表示输出字符串的个数。按API参手册,如果c为-1,则字符串必须以'\0'字符结束。这是一个陷阱,c 是UINT类型,不可能等于-1。如果不仔细,很容易根据参考手册写出以下...

eliuxiaoming1的博客 1308

VC++实现全局钩子勾住textout金山快译的原理实现

VC++实现全局钩子勾住textout金山快译的原理实现

fdgugfv的博客 396

关于HOOK和屏幕取词

[地址空间]在Win9X中,2GB到4GB这部分虚拟地址空间实际上是由所有的WIN32进程所共享的,这部分地址空间加载了共享Win32 DLL、内存映射文件和VXD、内存管理器和文件系统码,Win9X中这部分对于每一个进程都是可见的,这也是Win9X操作系统不够健壮的原因。 Win9X中为16位操作系统保留了0到4MB的地址空间,而在4MB到2GB之间也就是Win32进程私有的地址空间,由于

jia_xiaoxin的专栏 1652

HOOK

摘要: 本文针对HOOK技术在VC编程中的应用进行讨论,并着重对应用比较广泛的全局HOOK做了阐述。  引言  Windows操作系统是建立在事件驱动机制之上的,系统各部分之间的沟通也都是通过消息的相互传递而实现的。但在通常情况下,应用程序只能处理来自进程内部的消息或是从其他进程发过来的消息,如果需要对在进程外传递的消息进行拦截处理就必须采取一种被称为HOOK(钩子)的技术。钩子是Wind

小猪的Blog 1251

Detours库APIHook演示抓取微信界面绘制文字函数

写在前面的话 演示环境VS2019+Windows10+微信win3.0.0.57+Detour Detour库编译 项目地址:https://github.com/microsoft/Detours 代码直接git clone拉取下来,打开VS2019的开发环境配置 nmake /f makefile 配置VS2019 配置项目属性 或者不用操作第三步 #pragma comment (lib,"detours.lib") 这样环境就算配置好了… 下面贴一下关键代码吧… #include

、moddemod 1107

文本输出API函数:TextOut,ExtTextOut,DrawText,DrawTextEx,PolyTextOut,TabbedTextOut

前阵子由于做一个软件需要用Detour库HOOK其它程序的文本输出,以实现对第三方程序文字的监控。         对这六个文本输出API函数:TextOut,ExtTextOut,DrawText,DrawTextEx,PolyTextOut,TabbedTextOut,作了一番学习。         以前只是使用,HOOK以后才发现它们有很大的不同。 // TextOut(分为TextO

Reviter的专栏 8167

wn32拦截ExtTextOut屏幕取词

通过拦截ExtTextOut这个API可以实现屏幕取词的部分功能

jfu22的专栏 7798

攻破“金山词霸”的技术堡垒!

library PigLatinDll;uses  Windows,  SysUtils,  Classes,  HookTextUnit in HookTextUnit.pas;function PigLatinWord(s: String): String;Var start: String; Capitalize, AllCapitals: Boolean; i: Integer; be

smhpnuaa的专栏 1349

屏幕取词实现

要建个DLL实现钩子unit GetWord;interfaceuses  SysUtils,  windows,  messages;const NHD_GETWORD_TIMER = 2;const NHD_MAX_TEXTLEN = 1024;const NHD_WIN_INITPOSX = -1;const NHD_WIN_INITPOSY = -1;const NHD_FLYWIN_WI

RENYUAN 4829

hook API 详解

来源:http://cisco.chinaitlab.com/safety/366596.html详谈HOOK API的技术HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API、中断服务、IFS和NDIS过滤等。比如大家熟悉的即时翻译软件,就是靠HOOK TextOut()或Ex

jsl8998620的专栏 1866

Windows下的函数hook技术

都是很成熟的东西了,这几天看了看,总结一下而已。讨论了Windowshook函数的几种方法。提供了一个hook TextOutA的完整例子。通过CreateRemoteThread的方法把hook dll注入到一个普通的应用程序中。Hooking Imported Functions by name调用imported functions时的步骤/实现在程序中调用从其它模块引入的函数的方法和普通

klabc的专栏 1994

vc++HOOK详细讲解

消息钩子函数入门  Windows 系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实 现的。而钩子是 Windows 系统中非常重要的系统接口,用它可以截获并处理送给其他应用 程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件 消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子, 监视系统中特定事件的发生

独旅天涯 9605

Delphi Access violations 问题的解决之道[转]

    Windows用户可能经常会看到类似于错误提示:“Error:Access violation at address 836556F8. Read ...

weixin_34087503的博客 227

程序退出报错 Access Violation at 0x7c93b1fa 之类问题的解决办法

Access violation at xxxx,顾名思义,程序在执行过程中不恰当的访问了内存中某个位置,导致出现如上提示,一般可能造成此原因的有很多,例如dll版本问题,是否中毒等,但对于我们开发人员的来讲,你的程序在某个时刻出现了Access violation,则基本表明你代码某个地方编写的出了问题,常见的是访问了已释放的指针、资源,对于一般的项目来说,通篇查找问题所在不现实,现在在这里提供

天道酬勤 6500

python网络数据加密与隐私保护算法研究(django)(完整项目源码+mysql+说明文档+LW+PPT)计算机毕业设计源码.zip

用户模块(1)查看用户资料修改(2)AES密钥列表查看(3)加密文本管理:添加要发送的文本明文(文字形式),并且利用密钥加密,存储到数据库,数据库中是加密后的乱码文本。(4)加密文本发送:将加密后的文本,发送给指定的用户,从用户列表里选择,可以选择自己用户名发送,也可以匿名发送。(5)我的密文解密:查看收到的加密文本密文,使用密钥解密。(6)加密图片发送:将PNG图片,加入加密后的文本信息,发送给某个用户,可以选择自己用户名发送,也可以匿名发送。(7)加密图片解密:将收到的PNG图片,先进行lsb解密,解密出密文,再利用密钥解密成明文。(8)加密文件发送:将加密的TXT文件,发送给指定的用户,从用户列表里选择,可以选择自己用户名发送,也可以匿名发送。(9)加密文件解密:查看加密的TXT文件,使用密钥解密。管理员模块(1)管理员信息管理点击管理员信息管理栏目,管理员可以对已经存在的管理员信息进行修改或删除操作。(2)用户权限管理点击用户权限管理栏目,管理员可以对已经注册的用户设置相应的权限。(3)用户信息管理点击用户管理栏目,管理员可以对查看到目前为止的注册的用户信息,可以进行修改或删除操作。(4)加密秘钥管理点击秘钥管理栏目,管理员可以对查看现已生成的秘钥,可以进行新增、删除操作。(5)登录日志管理点击日志管理栏目,管理员可以对查看到目前为止的日志信息,可以选中其中一条或多条,导出为Excel表格。也可以进行删除操作。完整前后端源码,部署后可正常运行!环境说明开发语言:python后端python版本:3.7数据库:mysql 5.7+数据库工具:Navicat11+开发软件:pycharm

上一篇: 多线程,让我欢喜让我忧。
下一篇: 用rapidxml来读取xml文件
universeroc
博客等级 码龄19年 8粉丝 17原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值