动态链接库(三)

动态链接库的创建和使用 动态链接库的创建和使用 一. 创建动态链接库 1. 创建动态链接库项目 1. 1 动态链接库(DLL) 项目结构如下 为了节约大型项目的编译时间,系统自动为我们生成了和预编译头相关两个文件pch.cpp和pch.h,我们可以选择保留或者是删除他们。如果决定保留则需要在项目中每个源文件的最前面加入#include "pch.h",否则无法通过编译。如果删除了他们,同时还需要到项目属性中禁用预编译头,具体方法如下: dllmain.cpp定义了动态库的入口,当系统开始或终止一个进程或线程的时候,会调用每个 阅读详情

DLL注入和API拦截

1.0 SetWindowLongPtr(hwnd, GWLP_WNDPROC,MySubclassProc);改变窗口的行为。

如果打算从同一个进程中的窗口派生子类窗口,那么应该利用SetWindowSubclass,GetWindowSubclass,RemoveWindowSubclass,以及DefSubclassProc,参阅Subclassing Controls http://msdn.microsoft.com/en-us/library/bb773183%28VS.85%29.aspx 。

1.1 使用注册表来注入DLL

       HKLM/Software/Microsoft/Windows NT/CurrentVersion/Windows/ 下AppInit_Dlls键的值可能 包含一个或一组DLL的文件名(通过空格或逗号分隔)。第一个DLL可以包含全路径,但其他包含的路径则将被忽略。我们最好将自己的DLL放到windows目录。创建一项LoadAppInit_Dlls的DWORD值为1启用这个注册表项。当User32.dll被映射到进程,收到DLL_PROCESS_ATTACH通知时会取得上述注册表键的值,并用LoadLibrary来载入这个字符串指定的每个DLL。

     缺点:我们的DLL会被映射到所有使用了User32.dll的进程中,不能只把DLL注入到指定的进程中。

1.2 使用windows挂钩来注入DLL

      进程A安装一个WH_GETMESSAGE挂钩HHOOK hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hInstDll, 0);0表示要给系统中所有的GUI线程安装挂钩。

     (1)进程B中一个线程准备向一个窗口派送一条消息。

     (2)系统检查该线程是否已经安装了WH_GETMESSAGE挂钩。

     (3)系统检查GetMsgProc所在的DLL是否已经被映射到进程B的地址空间中。

     (4)如果DLL尚未被映射,那么系统会强制将该DLL映射到B的地址空间中,并将进程B中该DLL的锁计数器(lock count)递增。

     (5)由于DLL的hInstDll是在进程B中映射的,因此系统会对它进行检查看它与该DLL在进程A中的位置是否相同。如果相同,那么在两个进程地址空间中GetMsgProc函数位于相同的位置。在这种情况下,系统可以直接在进程A的地址空间中调用GetMsgProc。如果不同,那么系统必须确定GetMsgProc函数在进程B的地址空间中的虚拟内存地址。这个地址计算方法:GetMsgProc B = hInstDll B + (GetMsgProc A - hInstDll A).

    (6)系统在进程B中递增该DLL的锁计数器。

    (7)系统在进程B的地址空间中调用GetMsgProc函数。

    (8)当GetMsgProc返回时,系统递减DLL在进程B中锁计数器。

    UnhookWindowsHookEx撤销映射。

   说明:在使用windows内建的控件(如按钮,编辑框,静态框,组合框等)时,我们可以跨越进程的边界向它们发送消息并与它们进行交互,但我们不能对新的公共控件(ListView控件)如此。这样做是为了兼容16windows程序的缘故,16位的应用程序都在一个地址空间中,一个应用程序可以向另一个应用程序创建的窗口发送LB_GETTEXT消息,为了移值,操作系统通过在内部创建一个内存映射文件并在进程间复制字符串数据。

    使用线程的消息队列来进行线程同步。

1.3 使用远程线程来注入DLL

    从根本上来说,DLL注入技术要求目标进程中的一个 线程调用LoadLibrary来载入我们想要的DLL.

    CreateRemoteThread函数它使得在另一个进程中创建线程变得非常容易。除一个额外的hProcess参数之外,它与CreadThread完全相同。参数pfnStartAddr可以传入LoadLibrary函数地址。如果直接使用LoadLibrary,则在编译链接的时候,链接器会生成一个调用,来调用我们模块的导入段中的一个转换函数,这个转换函数会跳到实际的函数。我们应该通过PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(_TEXR("Kernel32.dll", "LoadLibraryA(W)");

HANDLE hThread = CreateRemoteThread(hProcessRemote, NULL, 0, pfnThreadRtn, L"C://MyLib.dll", 0, NULL);

字符串“C://MyLib.dll”位于调用进程的空间中,如果直接这样会使远程进程崩掉,因此我们应该用VirtualAllocEx函数在另一个进程空间中分配一块内存,用WiteProcessMemory将数据写入。VirtualFreeEx释放分配的内存,ReadProcessMemory读取。(每个进程都用到Kernel32.dll而且系统在每个进程中都会将其映射到同一个地址)可以将其注入到我们进程中这样便于调试。

1.4 使用木马DLL来注入DLL

     这种方式是把我们知道的一个进程必然会载入的一个DLL替换掉(在我们的DLL内容导出原来DLL导出的所有符号(用函数转发器很容易实现)。如果只想把这种方法用在一个应用程序中,则可以给我们的DLL起一个独一无二的名称,并修改应用程序的EXE模块的导入段(包含了一个模块所需的所有DLL的名称)。

1.5 把DLL作为调试器来注入

     调试器可以在被调试进程中执行许多特殊的操作。系统载入一个被调试程序(debggee)的时候会在被调试程序的地址空间准备完毕之后,但被调试程序的主线程尚未开始执行任何代码之前,自动通知调试器。这时,调试器可以强制将一些代码注入到被调试程序的地址空间中(比如使用WriteProcessMemory),然后让被调试程序的主线程去执行这些代码。

 

     这种方法要求我们对调试线程的CONTEXT结构进程操作,这也意味着我们必须编写与CPU相关的代码。为了让这种方法能在不同的CPU平台上正常工作,我们必须对源代码进行修改。此外,我们可能还必须手工编写一些我们想让被调试程序执行的机器语言指令。在默认的情况下,如果调试器终止,那么WINDOWS会自动终止被调试程序。但是,调试器可以通过DebugSetProcessKillOnExit并传入FALSE来改变默认的行为。在不终止一个进程的前提下停止调试该进程也是有可能的,这要归功于DebugActiveProcessStop函数。

1.6 使用CreateProcess来注入代码

     这种方法要求被注入的进程是由我们的进程生成的。

    (1)让进程生成一个被挂起的子进程。

    (2)从.exe模块的文件头中取得主线程的起始内存地址。

    (3)将位于该内存地址处的机器指令保存起来。

    (4)强制将一些手工编写的机器指令写入到该内存地址处。这些指令应该调用LoadLibrary来载入一个DLL。

    (5)让子进程的主线程恢复运行,从而让这些指令得到执行。

    (6)把保存起来的原始指令恢复到起始地址处。

    (7)让进程从起始地址继续执行,就好像什么都没有发生过一样。

     由于我们的应用程序不是调试器,因此我们可以非常容易地对应用程序和注入的DLL进程调试。这种方法同时适用于控制台程序和GUI程序。

 1.7 API拦截

     a.通过覆盖代码来拦截API.

     b.通过修改模块的导入段来拦截API.

     http://research.microsoft.com/en-us/projects/detours/

 

高分影像批处理第三回——RPC文件与几何校正 前言 前面两章部分完成了图像的基本组织和大气校正,可是对于遥感影像地理相关数据,精确的地理坐标也是非常关键的。L1级数据,可惜,并没有帮我们处理地理坐标系统。无论是打开ENVI还是用gdal工具查看图像元数据,其坐标系统都是错误的或者说是未读入的。因此本章节来解决这个问题。 阅读详情

相关推荐

伺服电机三环控制实战:从参数整定到系统优化

本文以实战视角,深入解析伺服电机三环控制(位置环、速度环、电流环)的参数整定与系统优化全流程。文章摒弃复杂理论,通过生动的比喻和分步调试指南,详细阐述了从电流环快速响应、速度环平滑调节到位置环精准定位的调试方法,并提供了常见问题排查与进阶优化技巧,帮助工程师有效提升伺服系统性能与稳定性。

weixin_29201933的博客 243

解说Win32的窗口子类化

  也许你需要一个特殊的Edit来限制浮点数的输入,但是现有的Edit却并不能完成这项工作——因为它只能够单纯的限制大小写或者纯数字。当你在论坛上求救的时候,某个网友告诉你:“用子类化。”你也许会在看到一线曙光的同时多出了一连串的问题:何为子类化?子类化的原理是什么?如何实现子类化?下面就让我从一个简单的C++程序开始,一步步解开你的疑团吧。  首先,我为你列出以下这个C++程序:#include

马说@优快云 2519

嵌入式开发避坑指南:用DWT做延时函数,这几个细节不注意代码会跑飞

本文深入探讨了在Cortex-M嵌入式开发中使用DWT实现精确延时函数的关键技巧与常见陷阱。针对DWT_CYCCNT计数器应用中的内核兼容性、溢出处理、编译器优化等五大核心问题,提供了工业级稳健解决方案,帮助开发者避免代码跑飞风险,实现微秒级高精度延时控制。

weixin_42653691的博客 158

窗口子类化

关于Win32与MFC中窗口子类化的实现,附有源码...

走在成长的路上 1405

Android11.0系统中适配EC20模块4G及GPS功能

本文主要描述在RK3568Android11中适配EC20模块,启用4G与GPS功能。

yjz_0314的博客 2791

2024银行科技岗笔试通关秘籍:从资料准备到实战技巧

本文系统解析了2024年银行科技岗笔试的考察内容与备考策略。文章指出,笔试是一场涵盖通用能力测试、计算机专业基础、金融科技知识和英语性格测试的复合型考试,并重点提供了数据结构与算法、计算机网络、数据库等高频考点的深度解析与实战突破技巧,帮助考生高效准备,顺利通关。

weixin_29243279的博客 121

使用更安全的方法去子类化控件

在很长一段时间内,我们都习惯使用SetWindowLong去子类化控件,但是这种方法存在很多缺点,具体可以看MSDN文档的介绍。 这是列举出的四个缺点: 窗口过程只能更换一次。 创建子类后很难删除它。 将私有数据与窗口相关联是低效的。 要调用子类链中的下一个过程,不能转换旧窗口过程并调用它,必须使用CallWindowProc函数调用它。 所以现在我们需要使用SetWindowSubCl...

qq_39529180的博客 776

华为擎云W515 PGUV-WBY0安装银河麒麟V10全流程解析

本文详细解析了华为擎云W515 PGUV-WBY0安装银河麒麟V10系统的全流程,包括准备工作、镜像下载与校验、启动盘制作、BIOS设置、安装过程关键选择、系统初始化及常见问题排查。特别针对ARM架构设备提供了实用技巧,帮助用户顺利完成国产化系统的部署与优化。

weixin_28725949的博客 696

窗口子类化(SubClassing) SetWindowLong

一、什么是子类化(Subclass) 视窗系统是基于消息驱动的。因此每一个窗口都有一个函数来处理这些消息,系统管理的窗口结构中有一域记录着这个函数的地址(使用GetWindowLong函数传入索引标识GWL_WNDPROC可获取此值)。所有系统发送到这个窗口的消息都会交由此函数来处理。所以改变窗口结构中这个指针值到自定义的某个函数(使用SetWindowLong函数带GWL_WN

靠别人不如靠自已。 5575

从RadixTree到哈希表:深入对比SGLang和vLLM的Prefix Cache实现差异

本文深入对比了SGLang与vLLM在大语言模型推理服务中实现Prefix Cache(前缀缓存)的两种核心方案。SGLang采用基于Radix Tree的RadixAttention,支持任意长度前缀的精确匹配与灵活复用;vLLM则采用基于哈希表的方案,深度集成于PagedAttention,实现简洁但要求块级精确对齐。文章剖析了二者在设计哲学、内存管理、适用场景及集群级优化(如Prefix Cache Aware Routing)上的关键差异,为高性能LLM服务的技术选型提供决策依据。

blockchain9miner的博客 954

YT8531 PHY芯片硬件设计与MDIO/RGMII实战指南

以太网PHY芯片是FPGA系统实现网络通信的物理层核心,其关键在于标准接口(如MDIO管理总线和RGMII数据接口)的正确实现与协同。MDIO作为IEEE 802.3定义的低速配置通道,负责寄存器级控制与状态监控;RGMII则通过双沿采样精简引脚,在千兆速率下兼顾性能与PCB布线可行性。技术价值体现在电压兼容性(支持1.8V/2.5V/3.3V)、可编程时序调节(RX_DELAY/TX_DELAY)及多级环回测试能力,显著提升国产FPGA平台(如Xilinx Zynq)的工程鲁棒性。典型应用场景涵盖嵌入式网

weixin_42453228的博客 1335

动态链接库(三)--动态链接库的使用

简单学习在自己的项目中使用他人创建的动态链接库, 介绍了隐式静态加载和显式动态加载两种加载动态链接库的方式.

SNAKEpc12138的博客 4002

如何选择汽车域控制器MCU?一文看透7大关键维度[特殊字符](含芯片推荐、踩坑预警)

MCU选型 Checklist(实用表格)维度你需要考虑的问题Flash/RAM我的任务栈够吗?是否支持OTA双Bank?安全等级这功能出故障会不会危及人命?接口资源够几个CAN?支持CAN FD?ETH是否支持TSN?主频我的软件响应周期是多少?是否带Cache?多核架构是SMP/AMP?是否带锁步核?跑多个任务会不会互相干扰?功耗与封装睡眠电流够低?有外扩DDR空间?BGA能焊?供应链有无国产替代?交期是否稳定?支持AUTOSAR吗?

weixin_43199439的博客 660

【C语言】三、动态链接库生成与调用

C语言动态链接库

面对疾风吧,哈撒给! 1045

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Mac M1 Xcode创建动态链接库dylib(c++)——JNA-JNI(三)

Mac M1 Xcode创建动态链接库dylib(c++)

qq_23858785的博客 5668

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

UNIX环境高级编程(三)—— 静态链接库与动态链接库

动态链接库一般不开放源码,需要建工程才能使用(其中提供的接口和 API); 0. .a/.o/.so What are .a and .so files? .o 就相当于 windows 里的 obj 文件 ,一个 .c 或 .cpp 文件对应一个 .o 文件 .a 是多个 .o 合在一起,用于静态连接 ,即STATIC mode,多个.a可以链接生成一个exe的可执行文件 -a:

2203

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC++动态链接库(DLL)编程深入浅出(三)

VC++动态链接库(DLL)编程深入浅出(三) 2009-11-05 12:24 4.5 __stdcall约定  如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式...

weixin_33940102的博客 71

linux下的动态链接库和静态链接库到底是个什么鬼?(三)动态加载库

前两天搞明白了动态链接库和静态链接库,后面终于也基本上搞懂了我之前不明白的“dlopen”是咋回事,怎么也要扒一扒。 共享库,有两种形式,第一种就是在上一篇文章中说到的“动态链接库”,而共享库的另一种形式,则被称之为“动态加载库”,也就是我刚才提到的用“dlopen”方式来玩的。动态加载库在编译的时候,应该是不需要去-l引用lib,而是在可执行程序中,可以自已决定加载库...

weixin_30480583的博客 108

Windows系统和Linux系统中的静态链接库与动态链接库(三)

本文主要讲述在Linux系统中的静态链接库与动态链接库。       1.Linux系统中的静态链接库       (1)创建头文件static_lib.h和源文件static_lib.c,以及应用静态库的主程序文件main.c,代码分别如下(与前面Windwos系统那篇代码基本一样):      [cpp] view plaincopy

mrwangwang的专栏 549

Makefile学习笔记06|编译动态链接库

Makefile学习笔记06|编译动态链接库   希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。   动态链接库,就是程序在运行的时候再去加载的代码。因此,在编译时也与一般的代码不同。编译动态链接库涉及到库文件的路径和加载。 编译选项 -fPIC -shared g++ -shared -fPIC mylib.cpp -o libmylib.so g++ test.cpp -lmylib -L/root/cpp #!/bin/sh LD_LIBRARY_PATH=./;

qq_43608728的博客 4663

在VC中链接动态链接库(DLL)的方法

转载时请注明出处和作者联系方式作者联系方式:李先静 方法一:windows提供了一套函数,用于加载动态链接库中的符号(函数和变量),调用这些函数去加载:1. HINSTANCE LoadLibrary( LPCTSTR lpLibFileName);2. FARPROC GetProcAddress( HMODULE hModule,  LPCWSTR lpProcName);3.

国产开源 GUI 引擎 AWTK 4885

Ubuntu linux 添加动态链接库路径

方法一: 把动态链接库所在的路径添加到/etc/ld.so.conf中 include /etc/ld.so.conf.d/*.conf /usr/local/lib/ 然后更新/etc/so.cache sudo ldconfig 方法二: 同方法一,把具体的so链接库写到/etc/ld.so.conf.d/下的conf文件中 /usr/local/lib/ 方法三: 设置...

cainiao2013的博客 8390

linux动态链接库三种方法,Linux中加载动态链接库的三种方法

Linux中加载动态链接库的三种方法:第一种是修改系统文件:在/etc/ld.so.conf文件中指定了默认的动态链接库查找路径,我的/etc/ld.so.conf文件内容是这样的include /etc/ld.so.conf.d/*.conf也就是说它间接的指定了定义路径的文件,我们只需要把需要的路径加到/etc/ld.so.conf.d目录下的任何一个文件中,再运行ldconfig就可以了,但...

weixin_29471325的博客 2170

动态链接库

C语言动态链接库1. 概述1.1 静态库和动态库1.2 动态链接库的优点2. 生成动态链接库2.1 windows版本2.2 Linux版本3. 调用动态链接库3.1 windows版本3.1.1 隐式调用3.1.2 显示调用(推荐)3.2 Linux版本 1. 概述 在实际编程中,我们可以把完成某项功能的函数放在一个动态链接库里,然后提供给其他程序调用。 1.1 静态库和动态库 静态库:这类库...

liaoshenhao的博客 1万+

动态链接库的生成和使用,从入门到精通

1. 动态链接库和静态链接库的区别 静态链接库(.LIB) 由函数和数据编译而成的一个二进制文件。使用时,在编译链接阶段,由链接器从库中复制这些函数和数据,并把他们与应用程序的其他模块组合起来创建最终的可执行文件。由于静态链接库中的程序和数据已经被复制并应用到可执行文件中,因此发布产品时不需要发布使用的静态库文件。 动态链接库 (.DLL) 包含被可执行程序或其他DLL调用来完成某项工作的函数,不可以直接运行,也不可以接收消息。动态链接库一半包含两个文件,引入库文件(.LIB)和动态链接库文件(.DLL)。

sunrise_lk的博客 1万+
上一篇: 线程局部存储
下一篇: VC++中调试Release版本
SWenJing
博客等级 码龄18年 8粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值