10.2 调试事件获取DLL装载

news2024/9/21 8:03:11

理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知事件,利用该方法并配合磁盘路径获取函数则可很容易的实现进程模块加载的监控。

获取加载的动态链接库DLL的详细信息,具体实现细节如下:

  • 首先,代码通过GetFileSize函数获取目标DLL文件的大小,如果大小为0,则立即退出函数。
  • 然后,代码调用CreateFileMappingMapViewOfFile函数创建了一个内存映射对象,该映射对象可以让代码访问DLL文件的内容。
  • 随后,代码调用GetMappedFileName函数获取该内存映射对象关联的DLL文件的路径,其中需要使用QueryDosDevice查询函数来确认磁盘符号对应的真实文件名称, 如果找到对应的真实文件名称,则可以更新原始路径为真实路径,这里用到了字符串操作函数_tcslen、 _tcsnicmp以及_tcsncpy等。
  • 最后,再调用UnmapViewOfFileCloseHandle函数清理资源,并将相关的信息输出到控制台上,包括基址、名称、大小和路径等信息。

有了这段获取DLL完整路径的程序片段,那么实现这个功能将变得很容易,我们看看一下OnDllLoaded中是如何针对DLL进程处理的,实现代码片段如下所示;

void OnDllLoaded(const LOAD_DLL_DEBUG_INFO* pDebug)
{
    //printf("基址: 0x%-8X --> ", pDebug->lpBaseOfDll);

    BOOL bSuccess = FALSE;
    TCHAR pszFilename[MAX_PATH + 1];
    HANDLE hFileMap;

    // 获取文件大小
    DWORD dwFileSizeHi = 0;
    DWORD dwFileSizeLo = GetFileSize(pDebug->hFile, &dwFileSizeHi);

    //printf("长度: %9d --> ", dwFileSizeLo);

    if (dwFileSizeLo == 0 && dwFileSizeHi == 0)
    {
        return;
    }
    // 创建内存映射
    hFileMap = CreateFileMapping(pDebug->hFile, 0, PAGE_READONLY, 0, 1, 0);

    if (hFileMap)
    {
        void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
        if (pMem)
        {
            // 获取当前映射名称
            if (GetMappedFileName(GetCurrentProcess(), pMem, pszFilename, MAX_PATH))
            {
                TCHAR szTemp[4096] = { 0 };

                // 得到当前所有磁盘字符串
                if (GetLogicalDriveStrings(4096 - 1, szTemp))
                {
                    TCHAR szName[MAX_PATH];
                    TCHAR szDrive[3] = TEXT(" :");
                    BOOL bFound = FALSE;
                    TCHAR* p = szTemp;
                    do
                    {
                        *szDrive = *p;
                        if (QueryDosDevice(szDrive, szName, 4096))
                        {
                            UINT uNameLen = _tcslen(szName);
                            if (uNameLen < MAX_PATH)
                            {
                                bFound = _tcsnicmp(pszFilename, szName, uNameLen) == 0;
                                if (bFound)
                                {
                                    TCHAR szTempFile[MAX_PATH];
                                    _stprintf(szTempFile, TEXT("%s%s"), szDrive, pszFilename + uNameLen);
                                    _tcsncpy(pszFilename, szTempFile, MAX_PATH);
                                }
                            }
                        }
                        while (*p++);
                    } while (!bFound && *p);
                }
            }
            bSuccess = TRUE;
            UnmapViewOfFile(pMem);
        }
        CloseHandle(hFileMap);
    }

    printf("基址: 0x%08X \t 相对名称: %-30s \t 大小: %-9d \t 路径: %s \n",
        pDebug->lpBaseOfDll, GetBaseName(pszFilename), dwFileSizeLo, pszFilename);
}

上述程序被运行后,则可输出被加载进程的所有模块信息,其中包括了模块基址,相对名称,模块大小,模块完整路径等,输出效果如下图所示;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/52d14ea1.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1061258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据Doris(四):直接编译(CentOS/Ubuntu)准备

文章目录 直接编译(CentOS/Ubuntu)准备 一、环境准备

国庆与中秋两节合一的长假

国庆节是我国最重要的节日之一&#xff0c;而中秋节则是一个家庭团聚和感恩的时刻&#xff0c;当这两个重要的节日同时降临&#xff0c;就为人们带来了双重的欢庆。今年&#xff08;2023&#xff09;的国庆节与中秋节难得地重合在一起&#xff0c;让人们享受了长达8天的假期。这…

一文看懂功率MOSFET FCP190N60 N沟道 基础知识

什么是MOSFET的原意是&#xff1a;MOS&#xff08;Metal Oxide Semiconductor金属氧化物半导体&#xff09;&#xff0c;FET&#xff08;Field Effect Transistor场效应晶体管&#xff09;&#xff0c;即以金属层&#xff08;M&#xff09;的栅极隔着氧化层&#xff08;O&#…

实验室超声波萃取技术的原理和特点是什么?

梵英超声(fanyingsonic)实验室超声波清洗机 超声波萃取中药材的优越性源于超声波的特殊物理性质。通过压电换能器产生的快速机械振动波&#xff0c;超声波可减少目标萃取物与样品基体之间的作用力&#xff0c;从而实现固液萃取分离。 &#xff08;1&#xff09;加速介质质点运…

13个最强大的摄影测量软件【2023最新】

如果你曾经使用 Google 地球探索过外国城市或玩过《堡垒之夜》&#xff0c;就会体验到摄影测量的好处。 通过将多张航空照片以及来自 NASA 的海拔和地形信息相结合&#xff0c;Google 地球可以创建大多数主要城市的逼真 3D 视图。 视频游戏制造商 Epic Games 使用摄影测量技术…

苹果V3签名是什么?优势是什么?什么场合需要应用到?该怎么部署?

v3签名&#xff0c;或称为Apple Developer Program v3签名&#xff0c;是苹果公司在2021年6月推出的一种签名格式&#xff0c;用于对应用程序进行签名和验证。 它是取代了之前的v2签名格式&#xff0c;用于增强应用程序的安全性和完整性。 v3签名能够做到以下几点&#xff1a;…

[硬件基础]-快速了解PWM

快速了解PWM 文章目录 快速了解PWM1、什么是PWM2、PWM的频率3、PWM的占空比4、PWM信号的输出电压计算5、脉宽调制幅度6、脉冲宽度调制生成技术6.1 使用微控制器生成脉冲宽度调制6.2 使用模拟电路产生脉冲宽度调制6.3 其他产生PWM的方法 在本文中&#xff0c;将介绍脉宽调制。 脉…

QT基础入门——信号和槽机制(二)

前言&#xff1a; 在Qt中&#xff0c;有一种回调技术的替代方法&#xff1a;那就是信号和槽机制。当特定事件发生时&#xff0c;会发出一个信号。Qt的小部件中有许多预定义的信号&#xff0c;但我们可以将小部件子类化&#xff0c;向它们添加自定义的信号。槽是响应特定信号的…

静电监控系统的作用在哪

静电监控系统主要用于监测和管理静电的产生、传导和消除&#xff0c;以防止静电对生产过程和环境的损害。具体来说&#xff0c;静电监控系统的作用包括以下几个方面&#xff1a; 监测静电的产生和传导&#xff1a;静电监控系统可以实时监测生产现场的静电产生和传导情况&#…

【LeetCode热题100】--33.搜索旋转排序数组

33.搜索旋转排序数组 对于有序数组&#xff0c;使用二分查找&#xff1a; 该题只保证了部分有序&#xff0c;也能进行二分查找 在常规二分查找时查看当前mid分割出来的两部分[l,mid]和[mid1,r]&#xff0c;哪个部分是有序的&#xff0c;根据有序的那个部分确定我们该如何改变…

解决WPF+Avalonia在openKylin系统下默认字体问题

一、openKylin简介 openKylin&#xff08;开放麒麟&#xff09; 社区是在开源、自愿、平等和协作的基础上&#xff0c;由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区&#xff0c;致力于通过开源、开放的社区合作&#xff…

k8s集群-6(daemonset job cronjob控制器)

Daemonset 一个节点部署一个节点 当有节点DaemonSet 确保全部 (或者某些) 节点上运行一个 Pod 的副本。加入集群时&#xff0c;也会为他们新增一个 Pod 。当有节点从集群移除时&#xff0c;这些Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 DaemonSet 的典型用…

Integrity Plus for Mac,保障网站链接无忧之选

在如今数字化的时代&#xff0c;网站链接的完整性对于用户体验和搜索引擎排名至关重要。如果您是一位网站管理员或者经常需要检查网站链接的人&#xff0c;那么Integrity Plus for Mac&#xff08;Integrity Plus&#xff09;将成为您最好的伙伴。 Integrity Plus是一款专业的…

WS-FLV直播协议分析

一、简介 ws-flv&#xff08;websocket-flv&#xff09;是一种直播协议&#xff0c;其基于WebSocket来传输FLV格式的音视频。可以用来替代rtmp&#xff0c;解决其需要浏览器端依赖flash的问题&#xff1b;替代http-flv&#xff0c;解决浏览器同域名请求的最大并发数限制导致的浏…

英伟达NVIDIA驱动安装

一般&#xff0c;我们新的显卡上机或者新系统可能就需要重新安装显卡驱动。或者是我们在配置深度学习环境时候&#xff0c;需要手动安装驱动。 官网地址&#xff1a;官方高级驱动搜索 | NVIDIA 我们选择好自己需要的驱动后直接安装即可 下载的时候&#xff0c;选择自己需要的驱…

Swift SwiftUI CoreData 过滤数据 1

Xcode: Version 14.3.1 (14E300c) iOS: 16 预览&#xff1a; Code: import SwiftUI import CoreDatastruct TodosSearch: View {State private var search_title "测试"FetchRequest var todos_search: FetchedResults<Todo>init() {let request: NSFetchReq…

纯JS电子表格控件SpreadJS正式发布v16.2——新增甘特图插件

SpreadJS 是一款基于 HTML5 的纯前端电子表格控件&#xff0c;兼容 450 种以上的 Excel 公式&#xff0c;凭借其 “高性能、跨平台、与 Excel 高度兼容”的产品特性&#xff0c;备受以华为、苏宁易购、天弘基金等为代表的企业用户青睐。SpreadJS 为用户带来亲切的 Excel 使用体…

OpenGLES:3D立方体纹理贴图

效果展示 一.概述 前几篇博文讲解了OpenGLES绘制多种3D图形&#xff0c;并赋予丰富的色彩&#xff0c;但是在这些3D图形绘制过程中&#xff0c;有一点还没有涉及&#xff0c;就是纹理贴图。 今天这篇博文我会用如下六张图片对立方体进行纹理贴图&#xff0c;实现六个面都是贴…

Vscoe设置if __name__ == ‘__main__‘: 自动提示

解决Vscode 无 if __name__ __main__: 自动提示问题 配置步骤&#xff1a; 设置——》用户代码片段——》python.json配置文件——》添加"Print to console"项 添加代码内容&#xff1a; "Print to console": {"prefix": "main",&q…

数据可视化工具在成绩分析中的作用与意义

数据可视化是将数据转化为图表、图形和可交互式界面的过程&#xff0c;它在成绩分析中扮演着重要的角色。通过将学生成绩数据以图形化方式展示&#xff0c;数据可视化工具可以帮助教育者更好地理解和解释学生的表现&#xff0c;发现隐藏在数据背后的模式和趋势。本文将详细介绍…