WIN32核心编程 - 动态链接库

news2025/1/15 23:43:17
  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> 链接点击跳转博客主页

目录

动态链接库

创建动态链接库

相关函数

遍历模块

导出未文档化


动态链接库

  • 动态链接库(DLL)

    • 动态链接库(Dynamic-Link Library,简称DLL)是一种包含可由多个程序同时使用的代码和数据的文件。DLL允许程序共享代码,从而减少内存使用和磁盘空间占用,同时使得程序的更新和维护更加方便。
  • 导出函数

    • 在DLL中,导出函数是可以被其他程序或DLL调用的函数。为了使函数能够被导出,需要在函数定义前加上特定的关键字,如__declspec(dllexport)
  • 导入库

    • 导入库(Import Library)是一个特殊的库文件,它包含了指向DLL中导出函数的符号信息。当编译器链接一个程序时,它会使用导入库来解析对DLL中函数的引用。导入库通常与DLL文件一起提供,以便程序能够正确地加载和调用DLL中的函数。
  • 代码重用

    • 动态链接库(DLL)允许不同的程序共享同一代码库。这意味着,如果多个程序需要执行相同的任务,它们可以调用同一个DLL中的函数,而不是每个程序都包含该函数的副本。这样可以减少磁盘空间的使用,并且在内存中只需要一个代码副本,从而提高了内存的使用效率。
  • 模块化

    • DLL提供了一种模块化的编程方式,使得程序的结构更加清晰。每个DLL可以看作是一个独立的模块,负责特定的功能。这种模块化的设计使得程序的开发、测试和维护更加容易,因为可以单独更新或修复某个DLL,而不需要重新编译整个程序。
  • 内存效率

    • 当多个程序使用同一个DLL时,Windows操作系统通常会在内存中只加载该DLL的一个副本。这意味着,即使多个程序都在运行,它们也共享同一个DLL的物理内存副本。这种共享机制减少了内存的消耗,提高了系统的整体性能。

创建动态链接库

  • 工程项目
    • 创建动态链接库项目
    • 空项目 - 配置类型 - DLL(动态库)
    • 入口函数
      • BOOL APIENTRY DllMain( HMODULE hModule,
                               DWORD  ul_reason_for_call,
                               LPVOID lpReserved
                             )
        {
            switch (ul_reason_for_call)
            {
            case DLL_PROCESS_ATTACH:
            case DLL_THREAD_ATTACH:
            case DLL_THREAD_DETACH:
            case DLL_PROCESS_DETACH:
                break;
            }
            return TRUE;
        }
    • 导出函数
      • __declspec(dllexport) 声明函数为导出函数。
      • extern "C" 避免CPP中函数重载导致导出函数名不同。
      • 模块定义文件(*.def) 
      • .cpp
        
        #include <Windows.h>
        
        INT Add(INT A, INT B)
        {
        	return A + B;
        }
        
        INT Sub(INT A, INT B)
        {
        	return A - B;
        }
        
        EXTERN_C __declspec(dllexport) INT Div(INT A, INT B)
        {
        	return A / B;
        }
        
        .def
        
        LIBRARY
        EXPORTS
        	Add
        	Sub
    • 导入函数
      • LoadLibrary
      • GetProcAddres
      • PFNCALLBACK
      • FreeLibrary
      • #include <iostream>
        #include <Windows.h>
        
        typedef int(__cdecl* PFNAdd)(INT, INT);
        
        int main()
        {
        
        	HMODULE hModule = LoadLibraryA("D:\\0xCC\\Project\\Win32\\Debug\\TESTDLL.dll");
        	if (hModule)
        	{
        		PFNAdd pFun = (PFNAdd)GetProcAddress(hModule, "Add");
        		if (pFun)
        		{
        			std::cout << pFun(1, 2) << std::endl;
        		}
        
        		FreeLibrary(hModule);
        	}
        
        	return 0;
        }

相关函数

  • GetModuleFileName 函数用于获取指定模块的完整路径,该模块必须已经被映射到调用进程的地址空间中。
  • GetModuleHandle 函数用于获取一个模块的句柄,该模块必须已经被映射到调用进程的地址空间中。
  • GetModuleFileNameEx 函数与 GetModuleFileName 类似,但它可以在指定的进程中获取模块的完整路径。
  • GetModuleBaseName 函数用于获取指定模块的基本名称(不包括路径),该模块必须已经被映射到调用进程的地址空间中。
  • GetProcessImageFileName 函数用于获取指定进程的映像文件名(即进程的可执行文件名)。
  • #include <iostream>
    #include <Windows.h>
    #include <Psapi.h>
    
    int main()
    {
    	// 获取模块基址
    	HMODULE hMain = GetModuleHandleA(NULL);
    	HMODULE hKe32 = GetModuleHandleA("Kernel32.dll");
    	HMODULE hTest = GetModuleHandleA("TEST.dll");
    
    	// 获取模块路径(本进程)
    	CHAR szBuffer[MAX_PATH] = { 0 };
    	GetModuleFileNameA(hMain, szBuffer, MAX_PATH);
    	std::cout << szBuffer << std::endl;
    
    	GetModuleFileNameA(hKe32, szBuffer, MAX_PATH);
    	std::cout << szBuffer << std::endl;
    
    	// 获取模块路径(跨进程)
    	// GetModuleFileNameEx
    
    	// 获取模块名称
    	GetModuleBaseNameA(GetCurrentProcess(), hMain, szBuffer, MAX_PATH);
    	std::cout << szBuffer << std::endl;
    
    	GetModuleBaseNameA(GetCurrentProcess(), hKe32, szBuffer, MAX_PATH);
    	std::cout << szBuffer << std::endl;
    
    	// 获取进程主模块
    	GetProcessImageFileNameA(GetCurrentProcess(), szBuffer, MAX_PATH);
    	std::cout << szBuffer << std::endl;
    
    	return 0;
    }

遍历模块

  • CreateToolhelp32Snapshot

  • MODULEENTRY32

  • Module32First

  • Module32Next

导出未文档化

#include <iostream>
#include <Windows.h>
#include <winternl.h>

// Kernel32.dll		-		OpenProcess
// ntdll.dll		-		NtOpenProcess

typedef NTSTATUS(NTAPI* PFNNTOPENPROCESS)
(
	PHANDLE ProcessHandle,
	ACCESS_MASK AccessMask,
	POBJECT_ATTRIBUTES ObjectAttributes,
	CLIENT_ID* ClientId
	);

int main()
{
	HMODULE hNtdll = LoadLibrary(TEXT("ntdll.dll"));
	if (hNtdll)
	{
		PFNNTOPENPROCESS lpNtOpenProcess = (PFNNTOPENPROCESS)GetProcAddress(hNtdll, "NtOpenProcess");
		if (lpNtOpenProcess)
		{
			HANDLE hProcess = NULL;
			OBJECT_ATTRIBUTES ObjectAttributes = { 0 };
			CLIENT_ID clientId = { 0 };

			clientId.UniqueProcess = (HANDLE)25500;
			InitializeObjectAttributes(&ObjectAttributes, NULL, NULL, NULL, NULL);

			NTSTATUS status = lpNtOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &ObjectAttributes, &clientId);
			if (status == 0)
			{
				std::cout << "ProcessHandle -> " << hProcess << std::endl;
				CloseHandle(hProcess);
			}

		}
		FreeLibrary(hNtdll);
	}

	return 0;
}

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

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

相关文章

SpringBoot:SpringBoot中如何实现对Http接口进行监控

一、前言 Spring Boot Actuator是Spring Boot提供的一个模块&#xff0c;用于监控和管理Spring Boot应用程序的运行时信息。它提供了一组监控端点&#xff08;endpoints&#xff09;&#xff0c;用于获取应用程序的健康状态、性能指标、配置信息等&#xff0c;并支持通过 HTTP …

JWT(Json Web Token)在.NET Core中的使用

登录成功时生成JWT字符串目录 JWT是什么&#xff1f; JWT的优点&#xff1a; JWT在.NET Core 中的使用 JWT是什么&#xff1f; JWT把登录信息&#xff08;也称作令牌&#xff09;保存在客户端为了防止客户端的数据造假&#xff0c;保存在客户端的令牌经过了签名处理&#xf…

python3 ftplib乱码怎么解决

其实很简单。ftplib.FTP里面有个参数叫encoding。 如上图最后一行。所以在使用FTP时&#xff0c;主动指定编码格式即可。 ftp ftplib.FTP() ftp.encoding "utf-8" 再使用就可以了。

gif压缩大小但不改变画质的最佳方法,7个gif压缩免费工具别错过!

你会不会也碰到过当你需要在自媒体平台上上传gif文件时&#xff0c;你会发现网页端最大限制为15MB&#xff0c;而手机端最大限制为5MB。那么如何在不不改变画质的同时压缩gif大小呢&#xff1f;如今&#xff0c;由于其特殊的动画以及快速传输的特点&#xff0c;gif文件已经成为…

Kamailio-命令行指令kamctl与kamcmd

前文也有提到几种指令的用处&#xff0c;与web页面相比&#xff0c;它就是更原始、面向运维的&#xff0c;正常如果有管理页面也需要使用到&#xff1a; kamailio - SIP 服务器脚本kamdbctl - 创建和管理数据库的脚本&#xff0c;比如你使用MySQL作为其存储时就需要使用到这个…

看完这些内幕 你还会夹娃娃吗?

文&#xff5c;琥珀食酒社 作者 | 朱珀 听我一句劝 别再去抓娃娃了 因为你能抓多少 早已经被设计好了 只有娃娃机老板 才能爆赚80% 今天的这篇文章 来自粉丝阿凯的投稿 他不仅能让你创业避坑 还会告诉你 整个娃娃机行业的内幕 如此敢自揭行业内幕的老板 不是对这…

短视频矩阵搭建,用云微客获客更方便

你的同行都爆单了&#xff0c;你还在问什么是矩阵&#xff1f;让我来告诉你。短视频矩阵是短视频获客的一种全新玩法&#xff0c;是以品牌宣传、产品推广为核心的一个高端布局手段&#xff0c;也是非常省钱的一种方式。 1.0时代&#xff0c;一部手机一个账号&#xff1b;2.0时代…

Flutter Inno Setup 打包 Windows 程序

转载自&#xff1a;flutter桌面应用从开发配置到打包分发 - 掘金 (juejin.cn) 五.打包 1.创建 release 版本的应用 flutter build release 执行完成后&#xff0c; release包位置在项目的build->windows->runer文件夹中 2.应用程序分发 Windows 为 Windows 平台构建…

卷积神经网络之ResNet50迁移学习

数据准备 下载狗与狼分类数据集&#xff0c;数据来自ImageNet&#xff0c;每个分类有大约120张训练图像与30张验证图像。使用download接口下载数据集&#xff0c;并自动解压到当前目录。 全是小狗的图片 另一边全是狼的图片 加载数据集 狼狗数据集提取自ImageNet分类数据集&a…

迈巴赫S480升级原厂车载冰箱夏天是不是很有作用

迈巴赫 S480 升级原厂车载冰箱主要有以下作用&#xff1a; 1. 保鲜功能&#xff1a;可以在行车途中保持食物和饮料的新鲜度&#xff0c;特别是在长途旅行或炎热天气下&#xff0c;能让您随时享用清凉的饮品和新鲜的食物。 2. 提升舒适性&#xff1a;随时能够提供冷饮或冷藏的…

校园在校跑腿小程序源码系统 前后完全分离 带源代码包以及搭建教程

系统概述 随着移动互联网的飞速发展&#xff0c;校园生活也迎来了前所未有的便捷与高效。在校园内&#xff0c;学生们对于便捷服务的需求日益增长&#xff0c;从取快递、送餐到代买日常用品&#xff0c;各类跑腿服务逐渐成为校园生活的常态。为了满足这一市场需求&#xff0c;…

下载Windows版本的pycharm

Python环境搭建 第一步下载安装python 等待安装完成 验证python是否安装成功 Python开发工具安装部署 JetBrains: Essential tools for software developers and teams PyCharm: the Python IDE for data science and web development 下载社区版本的PyCharm 双击打开下载好的…

靶场练习 手把手教你通关DC系列 DC1

DC1靶场通关教程 文章目录 DC1靶场通关教程前言一、信息收集1.主机存活2.端口收集3.网页信息收集4.目录收集4.1 Nikto4.2 Dirb 信息收集总结 二、漏洞发现与利用1. 发现2. 利用 三、FlagFlag1Flag2Flag3Flag4Flag5(提权) 前言 本次使用的kali机的IP地址为192.168.243.131 DC1的…

25.无源蜂鸣器驱动设计

相对于有源蜂鸣器&#xff0c;无源蜂鸣器的成本更低&#xff0c;声音频率可控。而有源蜂鸣器因其内部 自带振荡源&#xff0c;只要加上适当的直流电源即可发声&#xff0c;程序控制较为方便。 &#xff08;1&#xff09;设计定义&#xff1a;设计一个无源蜂鸣器的驱动程序&…

电脑管理软件是什么?电脑管理软件能做什么?

电脑管理软件是一种专门设计用于管理和优化计算机系统的软件工具。它涵盖了多个方面&#xff0c;从系统维护、资源分配到安全防护&#xff0c;都有着广泛的应用。以下是对电脑管理软件及其功能的详细解析&#xff1a; 一、电脑管理软件的定义 电脑管理软件是一种管理类型的软…

【Ty CLI】一个开箱即用的前端脚手架

目录 资源链接基础命令模板创建命令帮助选择模板开始创建开发模板 开发背景npm 发布流程问题记录模板创建超时 更新日志 资源链接 文档&#xff1a;https://ty.cli.vrteam.top/ 源码&#xff1a;https://github.com/bosombaby/ty-cli 基础命令 1. npm 全局安装 npm i ty-cli…

【YOLOv8系列】(一)YOLOv8介绍:实时目标检测的最新突破

目录 引言 背景与发展历程 YOLOv8架构设计 1. 改进的特征提取网络 2. 多尺度特征融合 3. 新的激活函数 4. Attention机制 模型训练与优化 性能评估 应用案例 目标检测 图像分割 图像分类 姿势估计 旋转框检测&#xff08;OBB&#xff09; 优势与挑战 优势&…

点云曲面提取

csdn是不是有有什么大bing&#xff1f;gif只能上传5m我吐了在线GIF动图压缩 - docsmall 在线GIF动图压缩工具,在线GIF动图压缩软件 代码整理中

无线充电宝哪个牌子好?绿联、西圣、小米充电宝测评对比!

随着科技的不断进步和智能设备的普及&#xff0c;无线充电宝逐渐成为了现代人生活中的必需品。它们不仅方便了我们的日常充电需求&#xff0c;更减少了线缆的束缚&#xff0c;提高了使用的便捷性。在众多品牌中&#xff0c;绿联、西圣和小米作为市场上广受好评的无线充电宝品牌…

HTML5表单的自动验证、取消验证、自定义错误信息

1、自动验证 通过在元素中使用属性的方法&#xff0c;该属性可以实现在表单提交时执行自动验证的功能。下面是关于对元素内输入内容进行限制的属性的指定。 属性说明required输入内容是否不为空pattern输入的内容是否符合指定格式min、max输入的数值是否在min~max范围step判断…