WinAPI【Win32 系统入口函数介绍】WinMain DllMain

Windows API拦截实战:Detours库原理与应用详解 在Windows系统编程中,API拦截是一种关键技术,它允许开发者在无需修改原始二进制文件的情况下,改变函数执行流程。其核心原理是通过指令修补和跳转机制,在目标函数入口处插入跳转指令,重定向到自定义函数。这项技术的核心价值在于实现无侵入式的系统监控、性能分析和安全增强。在应用场景上,它广泛用于性能剖析、行为监控、补丁修复和调试工具开发。本文聚焦于微软Detours库,深入解析其通过指令修补实现API钩子的工作机制,并演示如何通过DLL注入实现进程内函数拦截,为系统级开发和逆向工程提供实用解决方案。 阅读详情

WinMain函数


WinMain函数的原型声明如下:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow );

参数:

WinMain函数接收4个参数,这些参数都是在系统调用WinMain函数时,传递给应用程序的。

hInstance:

表示该程序当前运行的实例句柄,是一个数值标识。当程序在Windows下运行时,它唯一标识运行中的实例(注意,只有运行中的程序实例,才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个实例句柄,并通过hInstance参数传递给WinMain函数。

hPrevInstance:

表示当前实例的前一个实例的句柄。通过查看MSDN我们可以知道,在Win32环境下,这个参数总是NULL,即在Win32环境下,这个参数不再起作用。

lpCmdLine:

是一个以空字符结尾的字符串,内容为命令行的参数。

nCmdShow:

指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。这个参数的值由该程序的调用者所指定,应用程序通常不需要去理会这个参数的值。

WinMain函数前的修饰符WINAPI,其实就是__stdcall。

 

 

DllMain函数 

 

DllMain只是在Windows系统里注册的一个回调函数(call back)

早期的SDK版本中,DllMain是叫做DllEntryPoint

DllMain 是Dll 的缺省入口函数,DLLMain 负责Dll装载时的初始化及卸载的收尾工作,每当一个新的进程或者该进程的新的线程访问 DLL 或访问DLL 的每一个进程或线程不再使用DLL时,都会调用 DLLMain。

使用 TerminateProcess 或 TerminateThread 结束进程或者线程,不会调用DLLMain。

有些DLL并没有提供DllMain函数,也能成功引用DLL,这是因为Windows在找不到DllMain的时候,系统会引入一个缺省DllMain函数版本。

缺省的DllMain函数在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs 键值中。

 

DllMain函数的原型

BOOL   WINAPI   DllMain( HINSTANCE   hinstDLL,  DWORD   fdwReason,  LPVOID   lpvReserved  ); 

BOOL   APIENTRY  DLLMain(HANDLE 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:

 .......

  }

return TRUE;

}

参数:

 

hModule:

是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);

 

ul_reason_for_call:

是一个说明动态库被调原因的标志。当进程或线程装入或卸载动态连接库的时候,操作系统调用入口函数,并说明动态连接

DLL_PROCESS_ATTACH 进程被调用
DLL_THREAD_ATTACH 线程被调用
DLL_PROCESS_DETACH 进程被停止
DLL_THREAD_DETACH 线程被停止

lpReserved:是一个被系统所保留的参数;

 

 

DLL_PROCESS_ATTACH

每个进程第一次调用DLL文件被映射到进程的地址空间时,传递的fdwReason参数为DLL_PROCESS_ATTACH。这进程再次调用操作系统只会增加DLL的使用次数。 

DLL_THREAD_ATTACH

进程中的每次建立线程,都会用值DLL_THREAD_ATTACH调用DllMain函数,哪怕是线程中建立线程也一样。 

DLL_PROCESS_DETACH 

当DLL被从进程的地址空间解除映射时,系统调用了它的DllMain,传递的fdwReason值是DLL_PROCESS_DETACH。

       ◆FreeLibrary解除DLL映射(有几个LoadLibrary,就要有几个FreeLibrary)
       ◆进程结束而解除DLL映射,在进程结束前还没有解除DLL的映射,进程结束后会解除DLL映射。

用TerminateProcess终结进程,系统就不会用DLL_PROCESS_DETACH来调用DLL的DllMain函数。

注意:当用DLL_PROCESS_ATTACH调用DLL的DllMain函数时,如果返回FALSE,说明没有初始化成功,系统仍会用DLL_PROCESS_DETACH调用DLL的DllMain函数。 

DLL_THREAD_DETACH

线程调用ExitThread来结束线程(线程函数返回时,系统也会自动调用ExitThread),用DLL_THREAD_DETACH来调用DllMain函数。

注意:用TerminateThread来结束线程,系统就不会用值DLL_THREAD_DETACH来调DLL的DllMain函数。 

 

早期的SDK版本中,DllMain是叫做DllEntryPoint。其实Dll的入口函数名是可以自己定义的。 

 

 

 

ServiceMain函数

 

当一个服务控制程序请求开启一个新的服务时,SCM(服务控制管理器)开启服务的同时,向控制调度器发送一个开始请求。控制调度器为服务创建一个新的线程来运行ServiceMain函数。

ServiceMain函数应该执行下面的这些任务:

1、立刻为服务调用RegisterServiceCtrlHandlerEx函数,用来注册一个处理控制请求的HandlerEx函数。

RegisterServiceCtrlHandlerEx函数的返回值是一个service status handle(服务状态句柄),稍后向SCM通知当前服务状态会用到。

2、执行初始化。如果初始化的时间非常短(小于一秒),可以直接在ServiceMain函数中完成。

如果预期初始化的时间会比一秒长,调用SetServiceStatus函数,在SERVICE_STATUS结构中指明等待间隔,以及当前的状态是SERVICE_START_PENDING。

当初始化继续时,服务应该再调用SetServiceStatus函数来报告当前状态。多次调用SetServiceStatus函数对调试服务很有用。

3、初始化结束后,调用SetServiceStatus函数,在SERVICE_STATUS结构中指明SERVICE_RUNNING状态。

4、执行服务的任务,或者已经没有未完成的任务,那就返回。服务状态有任何改变,都要保证调用SetServiceStatus函数来报告新的状态。

5、如果在初始化或者运行的过程中遇到错误并且清理的过程会很长,服务应该调用SetServiceStatus函数,在SERVICE_STATUS结构中指定SERVICE_STOP_PENDING状态。

一旦清理结束,在最后中止的线程中调用SetServiceStatus函数,在SERVICE_STATUS结构中指定SERVICE_STOPPED状态。确保向SERVICE_STATUS结构里的

dwServiceSpecificExitCode和dwWin32ExitCode赋值,来标志错误。 

转载:http://www.cnblogs.com/okwary/articles/1362506.html

 

WTL在Windows CE嵌入式UI开发中的轻量化实践 嵌入式GUI开发面临资源受限与开发效率的双重挑战,其核心在于如何在有限内存和算力下实现高性能原生界面。WTL(Windows Template Library)作为基于ATL的模板化UI框架,以编译期绑定、零运行时开销、RAII资源管理为技术原理,显著优于MFC的虚函数开销和Win32的开发冗余。它在Windows CE/Windows Mobile平台展现出独特技术价值:极小二进制体积(实测427KB)、毫秒级启动、GDI句柄安全及ARM指令优化。典型应用场景包括车载导航、工业手持终端、FM收音机等强实时 阅读详情

相关推荐

树莓派+STM32+激光雷达:大学生工训赛智能物流小车全栈开发实录(附避坑指南)

本文详细记录了基于树莓派、STM32和激光雷达的智能物流小车全栈开发过程。文章从系统架构设计、硬件集成、软件框架搭建到机械臂控制与视觉辅助定位,系统阐述了如何构建一个完整的机器人系统,并分享了在电源管理、通信延迟、里程计误差等关键环节的实战避坑指南,为嵌入式与机器人开发提供了宝贵经验。

kotlin6android的博客 748

_WinAPI创建窗口大致格式(笔记)

一、流程 1定义入口函数WinMain() 2创建一个窗口: a)设计窗口类WNDCLASS(给成员变量赋值) b)注册窗口类 c)创建窗口类 d)显示和更新窗口 3消息循环 4窗口过程函数 二、WinMain() //WINAPI:修饰函数,规定函数参数入栈从右往左,函数调用完毕,自动清理堆栈 int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例 HINSTANCE hPr...

weixin_46949627的博客 913

抖音a_bogus参数逆向避坑指南:从环境检测到XHR请求的全流程解析

本文详细解析了抖音a_bogus参数在v1.0.1.19版本下的逆向工程全流程,重点介绍了如何通过PyV8Env框架进行有效的补环境操作,以绕过严格的环境检测。内容涵盖从环境初始化、关键事件触发到模拟XHR请求获取签名的完整步骤,并提供了可运行的Python代码示例和常见检测点的避坑指南,帮助开发者稳定生成有效的a_bogus参数。

tech5的博客 600

WinAPI【Win32 系统入口函数介绍】WinMain DllMain

WinMain函数 WinMain函数的原型声明如下: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow ); 参数: WinMain函数接收4个参数,这些参数都是在系统调用WinMain函数时,传递给应用程序的。 hInstance: ...

weixin_30555753的博客 508

【ChatGPT实战案例】ChatGPT如何帮助产品经理高效工作?

1. 产品经理主要工作方向, 2. 具体工作中,向ChatGPT提问参考

weixin_62909516的博客 1899

核函数——原理剖析

(Kernel Function)是机器学习和统计学中的一个重要概念,特别是在支持向量机(SVM)和其他基于核方法的算法中。核函数的主要作用是通过一个隐式的方式将数据映射到一个高维空间,从而使得在该高维空间中线性不可分的问题变得线性可分。没关系,现在让我们抛开一切无关的事情,花20分钟来认真领会一下,核函数的原理到底是什么。然后我们来说什么什么样的函数有资格称为核函数,也就是上面说的一个函数的内积矩阵是半正定矩阵。中的分布如左图所示。中是不可实现的,那如果我们将原始空间中的所有样本点,通过一个映射关系。

m0_70254540的博客 1587

WindowsAPI WinMain

 一、WindowsAPI介绍:WindowsAPI(Windows Application Programming Interface)动态链接:(Dynamic Linking Library ,DLL)Windows动作机制的核心是动态链接库。三个主要的动态链接库:Kernel:处理所有在传统上由操作系统核心处理的事务-内存管理、文件i/o和多任务管理User:使用都

xinxun的地盘 1363

PCIe-Orders set Blocks之symbol对齐

有序集的使用场合很多,如在链路link阶段,进入polling后,便开始有序集的发送。一个 Ordered Set Block 包含一个同步头,后跟一个有序集。多通道链路的所有 Lane 必须同时传输相同的有序集,而且有序集的第一个符号定义了有序集的类型。但在PCIE中,8GT/s及以上的速率,采用的是128b/130b编码。128-bit是想要传输的payload,实际会传输130-bit,多出来的2-bit就是sync header。Block有两种,通过Sync header区分:10b:表示data

weixin_44700185的博客 813

Windows游戏编程学习第一篇笔记——Window窗口创建

WinMain函数原型: int WINAPI WinMain( _In_HINSTANCE hInstance, // 该程序当前运行的实例句柄 _In_HINSTANCE hPrevInstance, // 在Win32下该参数总是取NULL,只是需要在书写时表示出来 _In_LPSTR lpCmdLine, //当...

沈遇玄的博客 1065

C# & SQL Server 实时数据同步:7步轻松搞定,代码详解

实时数据同步是指在一个数据库中的数据发生变化时,能够立即或近乎立即地将这些变化同步到另一个数据库中。这种同步可以是单向的(从源数据库同步到目标数据库),也可以是双向的(两个数据库互相同步)。通过本文的详细讲解和代码示例,相信你已经学会了如何使用C#和SQL Server实现数据库的实时数据同步。实时数据同步不仅可以提升系统的响应速度,还能确保数据的一致性和准确性。希望这篇教程对你有所帮助,期待你在C#编程中取得更大的成就!🌟✨如果你有任何问题或建议,欢迎在评论区留言交流!

java专栏 514

【Dify】PPT生成工具应用

本文介绍了一款自动化PPT生成工具,通过智能接口将文本内容高效转化为结构化演示文档。该系统采用三阶段工作流(内容输入、HTTP请求上传、文件输出),无需复杂操作即可生成专业PPT。工具适用于教学课件、产品发布、企业培训等场景,能显著提升内容表达效率,特别适合初学者快速制作演示材料。文章详细说明了核心节点、应用场景及开发资源,为文本到PPT的自动化转换提供了实用解决方案。

Mr数据杨 1216

WINAPI WinMain

WINAPI WinMain用法

lichji2016的博客 997

课程1:认识Asp.net Core Web API

本文是《.Net Core从零学习搭建权限管理系统》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。专栏适用于人群:Web后端开发人员Web API是一个很广泛的概念,Asp.net Core Web API是.NET框架用于创建RESTful风格的项目、用于轻松构建可供多个客户端访问的HTTP服务。1、支持RestFul风格编程;

成长的足迹 1256

WinAPI--Win32 系统入口函数介绍

WinMain函数<br /><br />WinMain函数的原型声明如下:<br />int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow );<br />参数:<br />WinMain函数接收4个参数,这些参数都是在系统调用WinMain函数时,传递给应用程序的。<br />hInstance:<br />表示该程序当前运行的实例句柄,是一个数值标识。当程序在Windo

开心 993

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

在 Win32 Application 和 Win32 Console Application 中使用 MFC

   在 Win32 Application 和 Win32 Console Application 中使用 MFC在Virtual C++ 6.0创建的Win32 Application 和 Win32 Console Application 中使用 MFC 是可能的,主要的困难在于绕过MFC提供的WinMain函数。下面我提供一个方法以供参考: 进入 Project-->Set

2035

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VS2015动态库编程之入口函数

对于可执行文件,其入口函数为WinMain(),对于动态库文件,其入口函数为DllMain()。当系统加载动态库文件时,就会调用该文件的DllMain()函数。

hou09tian的博客 2597

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

在 Win32 Application 和 Win32 Console Application 中使用 MFC (转)

在 Win32 Application 和 Win32 Console Application 中使用 MFC (转)[@more@] 在 win32 Application 和 Win32 Console Applicati...

csd3176的博客 159

windows工程总结

1、win32控制台console程序   运行在MS-DOS环境中的程序。控制台应用程序通常没有可视化的界面,只是通过字符串来显示或者监控程序。控制台程序常常被应用在测试、监控等用途,用户往往只关心数据,不在乎界面。   生产.exe可执行程序。   通过命令行实现输入输出交互,可直接使用printf,getchar等库函数。   可直接使用win32 api接口。   入口是int ...

weixin_30315723的博客 139

VC++内联钩子实战:从原理到实现Windows API Hook

API Hook(应用程序编程接口钩子)是一种在Windows平台广泛使用的底层技术,其核心原理是通过拦截和修改函数调用流程,实现对系统或应用程序行为的监控与干预。这项技术通过修改目标函数在内存中的机器码,插入自定义跳转指令,从而在执行流到达目标函数时,能够先执行开发者预设的代理函数。从技术价值看,API Hook为软件调试、行为分析、性能监控和安全研究提供了强大的底层观察与控制能力,尤其适用于需要实时追踪系统调用、分析软件内部逻辑或实现兼容性修复等场景。结合热词中提到的“系统全局”监控需求,内联钩子(In

weixin_30388677的博客 334

C++实现Windows全局窗口:跨虚拟桌面显示的技术解析

在Windows多任务开发中,窗口管理是基础且关键的技术点。Windows系统通过虚拟桌面机制实现了窗口的隔离与绑定,每个窗口默认被限制在创建时的桌面内。这一机制虽然保证了用户体验的一致性,但对于需要全局显示的辅助工具、监控面板等应用场景却形成了障碍。通过深入理解COM组件和系统接口,开发者可以突破这一限制,实现窗口的跨桌面显示。其中,IVirtualDesktopManager接口提供了窗口与虚拟桌面的关联管理能力,而IVirtualDesktopNotification接口则能捕获全局的桌面创建与切换事

cuxiong8996的博客 519

深度解析:spdlog高性能C++日志库的架构设计与企业级部署方案

spdlog作为当前最受欢迎的高性能C++日志库,在分布式系统、游戏引擎和高频交易等对性能要求极高的场景中广泛应用。然而,许多开发者在Windows平台Release构建下会遇到首次调用必崩的棘手问题,这背后隐藏着静态初始化顺序失败(SIOF)这一C++经典陷阱。本文将深入剖析spdlog的核心架构,并提供五种企业级解决方案,帮助开发者彻底解决这一技术难题。 ## 📊 问题场景:Windows

gitblog_00482的博客 485

Windows游戏开发学习一 —— WinMain函数

WinMain 每个Windows程序都包含一个名为WinMain或wWinMain的入口点函数。注意两者中第三个参数是不一样的 int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, INT nCmdShow); { return 0; } INT WINAPI WinMa...

YiShiChangAnLuan 7602
上一篇: vc中的宏简介- -
下一篇: c/c++ 入口函数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值