• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 如何HOOKDirectDraw中的Blt等绘图函数[分不够可加,顶者有分]

如何HOOKDirectDraw中的Blt等绘图函数[分不够可加,顶者有分]

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了blt,blt精品超市,blt超市,blt模式,博莱特blt 10a等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 如何HOOK DirectDraw中的Blt等绘图函数[分不够可加,顶者有分]
描述:

如题
谢谢各位


解决方案1:

帮顶!蹭分!

解决方案2:

帮顶!蹭分!

解决方案3:

查找到该方法在进程中的vtbl的偏移。然后写一个该与方法相同形式的方法。把该地址替换成你的地址。原理就这样。我没有具体实现过。

解决方案4:

mark

解决方案5:

帮顶下

解决方案6:

学习。

解决方案7:

修改了一下别人代码,钩子Dll大致是这样
HHOOK     g_hHook;
HINSTANCE g_hinstDll;
FARPROC   fpBlt;
HMODULE hModule ;
BYTE    OldBltCode[5], NewBltCode[5];
DWORD   dwIdOld, dwIdNew;
BOOL   bHook = false;
void HookOn();
void HookOff();
BOOL Init();
int WINAPI  MyBlt(.....);//你自己的Blt函数
//---------------------------------------------------------------------------
// 空的钩子函数
LRESULT WINAPI Hook(int nCode, WPARAM wParam, LPARAM lParam)
{
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}
//---------------------------------------------------------------------------
// 输出,安装空的钩子函数
extern "C" __declspec(dllexport) __stdcall
BOOL InstallHook()
{
    g_hinstDll = LoadLibrary("MyAPIHook.dll"); // 这里的文件名为Dll本身的文件名
    g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)Hook, g_hinstDll, 0);
    if (!g_hHook)
    {
        MessageBoxA(NULL, "SET ERROR", "ERROR", MB_OK);
        return(false);
    }
    return(true);
}
//---------------------------------------------------------------------------
// 输出,Uninstall钩子函数
extern "C" __declspec(dllexport) __stdcall
BOOL UninstallHook()
{
    return(UnhookWindowsHookEx(g_hHook));
}
//---------------------------------------------------------------------------
// 初始化得到Blt的地址,并生成Jmp XXX(MyBlt)的跳转指令
BOOL Init()
{
    hModule = LoadLibrary(".....dll");//包含Blt的Dll
    fpBlt = GetProcAddress(hModule, "Blt");
    if(fpBlt == NULL)
        return false;
    _asm
    {
        pushad
        lea edi, OldBltCode
        mov esi, fpBlt
        cld
        movsd
        movsb
        popad
    }
    NewBltCode[0] = 0xe9; // jmp MyBlt的相对地址的指令
    _asm
    {
        lea eax, MyBlt
        mov ebx, fpBlt
        sub eax, ebx
        sub eax, 5
        mov dword ptr [NewBltCode + 1], eax
    }
    dwIdNew = GetCurrentProcessId(); // 得到所属进程的ID
    dwIdOld = dwIdNew;
    HookOn(); // 开始拦截
    return(true);
}
//---------------------------------------------------------------------------
// 首先关闭拦截,然后才能调用被拦截的Api 函数
int WINAPI MyBlt(.......)
{
    int nReturn;
    HookOff();
    ........//你的代码
    HookOn();
    return(nReturn);
}
void HookOn()
{
    HANDLE hProc;
    dwIdOld = dwIdNew;
    // 得到所属进程的句柄
    hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
    // 修改所属进程中Blt的前5个字节的属性为可写
    VirtualProtectEx(hProc, fpBlt, 5, PAGE_READWRITE,&dwIdOld);
    // 将所属进程中Blt的前5个字节改为JMP 到MyBlt
    WriteProcessMemory(hProc, fpBlt, NewBltCode, 5, 0);
    // 修改所属进程中Blt的前5个字节的属性为原来的属性
    VirtualProtectEx(hProc, fpBlt, 5, dwIdOld, &dwIdOld);
    bHook=true;
}
//---------------------------------------------------------------------------
// 将所属进程中JMP MyBlt的代码改为Jmp Blt
void HookOff()
{
    HANDLE hProc;
    dwIdOld = dwIdNew;
    hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
    VirtualProtectEx(hProc, fpBlt,5, PAGE_READWRITE, &dwIdOld);
    WriteProcessMemory(hProc, fpBlt, OldBltCode, 5, 0);
    VirtualProtectEx(hProc, fpBlt, 5, dwIdOld, &dwIdOld);
    bHook = false;
}
//---------------------------------------------------------------------------
int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    switch (reason)
    {
        case DLL_PROCESS_ATTACH:
            if(!Init())
            {
                MessageBoxA(NULL,"Init","ERROR",MB_OK);
                return(false);
            }
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            if(bHo

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • atl项目中StretchBlt操作失败
  • 用StretchBlt贴图失真问题
  • GDI中BitBlt函数问题。
  • 关于用BitBlt截窗口图后是黑图的总是
  • 关于StretchBlt函数的参数dwROP
  • 如何HOOKDirectDraw中的Blt等绘图函数[分不够可加,顶者有分]

相关文章

  • 2017-06-04 VC中为什么没有DataGrid这样的控件
  • 2017-06-04 URLDownloadToFile的缓存问题,在GetBindInfo中设了BINDF_NOWRITECACHE还是写了缓存
  • 2017-06-04 atl生成的activex控件,打印预览的问题。
  • 2017-06-04 100分求教ActiveDll中的方法中的参数为数组时,在asp中如何为此数组赋值
  • 2017-06-05 基于WTL与COM的客户端平台及服务器平台
  • 2017-06-05 _GetBaseClass与直接用RUNTIME_CLASSbase_class_name的区别
  • 2017-06-04 问两个基础问题,关于wrapclass和mfcautomation
  • 2017-06-04 VC90+MapX50无法解析的外部符号
  • 2017-06-05 请教一个关于多线程的问题。
  • 2017-06-04 寻找一个写DLL的源码!在线等!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 人才们,我做的键盘钩子有点问题,麻烦帮个忙
    • IUnknown的Addref/release功能都类似,为什么还要用户去实现?
    • MFC自动化程序的好处?
    • 如何快速有效地查出线程中倒底是哪部份出现内存泄露?
    • vc6调用vcnet编译的dll
    • 关于VC6工程移植到VS2010后编译失败的问题
    • 请问:在classwizard的MemberVariable页上如何激活addvariable按钮??
    • 请问如何生成ocx和cab文件?
    • 一个ActiveX问题如何用MFC开发一个具有对话框界面的控件
    • 我是一个菜鸟,求一简单的COM,包括源码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有