当前位置: 首页 > article >正文

winmm劫持详解

什么是DLL劫持注入,按照我的理解,程序在启动的时候,会调用DLL,使得注入成功,这是程序自己调用的
为什么程序会调用此DLL,Windows的资源共享机制明确规定,首先调用程序所在目录的系统DLL,若无,则调用C盘系统目录下的DLL

winmm劫持的要点:导出函数必须和原DLL的导出函数相同。当程序调用我们自己写的winmm时候,先执行我们要做的事情,然后把我们自己的winmm的导出函数全部跳转到系统目录下真正有用的导出函数中去,这样不会崩溃,而我们的目的也完成了,退出程序的时候,执行卸载DLL的命令,这样一个劫持程序就制作OK。


大致流程:
                1  加载原始模块
                2  写入我们自己的数据
                3   把自己的导出函数全部跳转到原始模块中去
                4  退出程序时释放我们自己写的模块

#define WIN_API extern "C" __declspec(dllexport)     //这句把C++转换成标准C 导出,这样使得导出函数的名称在外部调用时候不会出现乱码

写一个命名空间,方便我们调用
namespace MyFunction
{
    HMODULE m_hmodule=NULL;;//定义原始模块句柄
    //加载原始的模块
     inline BOOL WINAPI Load()
        {
            TCHAR tzPath[MAX_PATH];//原始模块名称
            TCHAR tzTemp[MAX_PATH;//寄存字符串
            lstrcpy(tzPath,L"winmm.dll");
             m_hmodule=LoadLibrary(tzPath);//加载模块
            if(m_hmodule==NULL)
                {
                    wsprintf(tzTemp,L"无法加载%s",tzPath);
                    MessageBox(NULL,tzTemp,L"winmm",MB_OK);
                    return FALSE;

                }  
                return TRUE;

        }
//释放原始模块
    inline void WINAPI Free()
     {
         if(m_hmodule)
            {
                FreeLibrary(m_hmodule);

            }
     }
//获得原始模块地址
FARPROC WINAPI GetAddress(PSTR pzProcName)
       {
            TCHAR tzTemp[MAX_PATH];
            FARPROC fAddr=GetProcAddress(m_hmodule,pzProcName);
            if(fAddr==NULL)
              {
                    wsprintf(tzTemp,"无法找到函数%s",pzProcName);
                    MessageBox(NULL,tzTemp,L"winmm",MB_OK);
                    ExitProcess(-2);

              }  
                return  fAddr;

        }
}

命名空间写完了,接下去就是把这个函数的全部导出函数写完,太多了,我就拿出一个来当例子

using namespace Myfunction;//使用命名空间
先要得到这个导出函数在原始模块中的地址:
PVOID pfnNotifyCallbackData=GetAddress("NotifyCallbackData");
接着在我们自己的导出函数中写入跳转即可

WIN_API void __cdecl NotifyCallbackData(void)
{
    __asm JMP pfnNotifyCallbackData;
}

在DLLMAIN中,我们一般在DLL_PROCESS_ATTACH 中先写入我们自己要做的事情,然后在调用Load函数以及取得原始模块中的全部导出函数相应的地址,最后在DLL_PROCESS_DETACH 中调用Free函数进行释放模块。

到这里一个winmm劫持注入就完成了,相应的还有lpk劫持,version劫持,usp10劫持等等,这些劫持都是木马进行攻击最方便最隐蔽的方法,并且目前360以及一些大型杀软是查不出的。。。winmm劫持就是查不出的,其他的我不怎么了解,lpk和usp10应该被玩坏了

http://www.kler.cn/news/365919.html

相关文章:

  • 【2024|滑坡数据集论文解读1】CAS滑坡数据集:用于深度学习滑坡检测的大规模多传感器数据集
  • 【Flutter】基础组件:Container
  • OpenCV与AI深度学习 | 实战 | OpenCV中更稳更快的找圆方法--EdgeDrawing使用演示(详细步骤 + 代码)
  • 毕业设计—基于 Inception-ResNet模型的皮肤癌分类系统实现
  • APP专项测试-冷启动-流量-电量-内存
  • uni-app 开发微信小程序,实现图片预览和保存
  • postman使用——在公司的项目落地回顾总结
  • 【计算机操作系统】课程 作业二 进程与线程 408考研
  • uniapp使用easyinput文本框显示输入的字数和限制的字数
  • WUP-MY-POS-PRINTER 旻佑热敏打印机票据打印uniapp插件使用说明
  • WebGL 3D基础
  • 常见Linux命令笔记
  • 【python爬虫】request发请求时需要携带cookies请求举例
  • 计算机网络:网络层 —— IPv4 协议的表示方法及其编址方法
  • 定位基站共线
  • 【卡尔曼滤波】观测模型包含输入的线性卡尔曼滤波
  • C++的汉诺塔
  • 【C语言教程】【嵌入式编程】(五)驱动开发实战(六)高级实践项目(七)附录
  • 10分钟使用Strapi(无头CMS)生成基于Node.js的API接口,告别繁琐开发,保姆级教程,持续更新中。
  • uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件
  • Go语言基础教程:递归
  • SpringBoot的自动装配原理详解
  • 防火墙是什么?科普为保护应用层而生的可靠工具
  • 排序算法 —— 冒泡排序
  • Linux文件目录结构
  • 【STM32 Blue Pill编程实例】-直接内存访问 (DMA)使用