PE Checksum的C++实现

PE文件的校验和(CheckSum) IMAGE_OPTIONAL_HEADER.CheckSum 为一个DWORD(64位下也是DWORD)型的校验值,用于检查PE文件的完整性,在一些内核模式驱动及DLL中,该值必须是存在且正确的 校验值的计算很简单: 将IMAGE_OPTIONAL_HEADER.CheckSum请0(因为这部分在文件中也是有值的,计算时得去掉) 以WORD为单位对数据块进行累加,记住要用ad... 阅读详情

转自:http://www.cnblogs.com/concurrency/p/3926698.html


工作之前的几年一直都在搞计算机安全/病毒相关的东西(纯学习,不作恶),其中PE文件格式是必须知识。有些PE文件,比如驱动,系统会在加载时对checksum进行校验,确保驱动文件的完整性。关于PE文件如何校验,网上有很多资料可以学习,这里有一篇文章《An Analysis of the Windows PE Checksum Algorithm》是对WINDOWS API  CheckSumMappedFile进行逆向分析的。文章的结尾提到WINDOWS的这个校验和算法和IP协议的校验和算法类似,IP的校验和算法实现是RFC1071,如果对其他的校验和算法感兴趣,可以阅读WIKI的《Error Detection and correction》。

但是CheckSumMappedFile的实现略显复杂,不够直观,后来读WRK的代码时,发现了WINDOWS内核在加载驱动时实现的校验和算法要简洁直观很多,分享给大家:

复制代码
uint32_t calc_checksum(uint32_t checksum, void *data, int length) {
    if (length && data != nullptr) {
        uint32_t sum = 0;
        do {
            sum = *(uint16_t *)data + checksum;
            checksum = (uint16_t)sum + (sum >> 16);
            data = (char *)data + 2;
        } while (--length);
    }

    return checksum + (checksum >> 16);
}

uint32_t generate_pe_checksum(void *file_base, uint32_t file_size) {
    uint32_t file_checksum = 0;
    PIMAGE_NT_HEADERS nt_headers = ImageNtHeader(file_base);
    if (nt_headers) {
        uint32_t header_size = (uintptr_t)nt_headers - (uintptr_t)file_base +
            ((uintptr_t)&nt_headers->OptionalHeader.CheckSum -
            (uintptr_t)nt_headers);
        uint32_t remain_size = (file_size - header_size - 4) >> 1;
        void *remain = &nt_headers->OptionalHeader.Subsystem;
        uint32_t header_checksum = calc_checksum(0, file_base, header_size >> 1);
        file_checksum = calc_checksum(header_checksum, remain, remain_size);
        if (file_size & 1){
            file_checksum += (uint16_t)*((char *)file_base + file_size - 1);
        }
    }

    return (file_size + file_checksum);
}
复制代码

Windows逆向工程入门:从PE文件到动态调试的实战基础 逆向工程是在缺乏源代码的情况下,通过分析可执行文件来理解程序逻辑与结构的技术。其核心原理在于将二进制机器码转换为可读的汇编或高级语言表示,从而揭示程序行为。这项技术在软件安全分析、漏洞挖掘、恶意代码研究和CTF竞赛中具有重要价值。掌握逆向工程能帮助开发者深入理解系统底层机制,提升调试与问题排查能力。在Windows平台,由于拥有成熟的工具链和广泛的应用生态,成为学习逆向的理想起点。通过分析PE文件结构、使用IDA Pro等反汇编工具进行静态分析,并结合x64dbg进行动态调试,可以逐步破解程序验证逻辑,例如 阅读详情

相关推荐

DLL木马热更新技术:攻防博弈中的模块化与隐蔽性实现

动态链接库(DLL)作为Windows系统的核心模块化组件,其运行时动态加载的特性为软件提供了灵活的扩展能力。从技术原理上看,DLL通过导出函数接口实现代码复用,主程序可利用LoadLibrary等API在内存中动态加载功能模块,这构成了热更新的基础。在安全工程实践中,这种模块化设计被应用于恶意软件的持久化与隐蔽通信,攻击者通过内存加载和反射式注入技术实现DLL木马的无文件化执行与在线更新,从而绕过传统文件监控。现代端点检测与响应(EDR)系统则通过监控RWX内存分配、进程注入等行为进行对抗,促使攻防双方在

weixin_33735077的博客 470

关于PE文件中校验和(checksum)的计…

熟悉PE文件格式的人应该都知道,在PE文件中有一个四字节的checksum,当初学习PE文件格式的时候,写过一个计算校验和的小程序,今天在整理电脑的时候突然发现了它,似乎彻底忘了它是干什么的,仔细一看才知道器具体,好记性不如烂笔头,似乎有必要将它贴出来,以便于以后再次遇到同一问题的时候能够直接使用。     本程序是由C++实现,用到了静态库imagehlp中的一些函数,程序写的很次,基本没有提

菩提树下写代码 3152

C/C++构建强免杀C2远控:对抗沙箱、反调试与动态加密通信实战

在网络安全领域,恶意软件检测与免杀技术是攻防对抗的核心。静态特征码查杀、动态行为监控(如EDR和沙箱分析)以及网络流量检测构成了现代终端安全防护的多层体系。为了规避这些检测,远控木马需要从代码层、行为层和通信层实施综合对抗。其中,环境感知技术用于识别沙箱与虚拟机,通过检测硬件配置、用户交互等特征实现行为隐匿;反调试与反分析技术则利用时间戳检测、异常处理等手段增加逆向工程难度。这些技术的工程价值在于延长攻击载荷的生存周期,提升隐蔽性。在红队评估与渗透测试中,具备强免杀能力的C2远控成为突破防御的关键。本文聚焦

weixin_34151004的博客 384

C++ Qt 两字节相加(和)的校验位

/********************************************************** 函数名称:checkSum 函数功能:校验位 帧头+数据段按2字节累加和(若数据段个数为奇数,则累加和时在数据段后方补1个字节0x00) 函数参数:QByteArray 帧头+数据段的数据 highBit-校验位的高位 lowBit-校验位的低位 cmdHeaderStr-校验位前面的数据 函数返回值:QByteArray 校验位 **************************..

枫影竹韵的博客 3573

从Frida动态Hook到二进制静态植入:逆向工程的硬核进阶

动态插桩技术,如Frida,通过在程序运行时注入脚本来实现函数Hook、内存修改和动态分析,其核心原理是拦截并改变目标进程的执行流。这项技术在安全研究、逆向工程和漏洞分析中具有重要价值,广泛应用于移动应用安全评估、恶意软件分析和软件调试等场景。然而,动态注入依赖外部环境且易被检测,促使工程师探索更底层的解决方案。通过深入理解ELF/PE等可执行文件格式,掌握节区、导入表、重定位等底层概念,可以将Hook逻辑从运行时脚本转化为静态的机器码,并直接植入二进制文件。这种静态植入技术实现了零运行时依赖和高隐蔽性,是

weixin_34025051的博客 474

从崩溃dmp到修复代码:手把手教你用WinDbg+Jenkins定位C++内存泄漏和空指针

本文详细介绍了如何利用WinDbg和Jenkins构建C++内存泄漏和空指针问题的闭环解决方案。通过工程化的符号文件管理、崩溃现场深度取证技术以及版本追溯方法,开发者可以快速定位并修复生产环境中的崩溃问题。文章还提供了典型崩溃模式的指纹识别和代码修复模板,帮助全栈工程师提升调试效率。

weixin_30781775的博客 441

修改PE文件自校验值

/*  *@修改PE头checksum  *@param1[in]:szFileName:可执行文件完整路径  *@param2[in]:dwCheckSum:新的checksum  *@return:修改成功返回TRUE,否则返回FALSE */ BOOL SetExeCheckSum(LPCSTR szFileName,DWORD dwCheckSum) {  HANDLE h

cackeme的专栏 1626

告别瞎猜!用WinDbg为你的C++程序快速定位崩溃行(含.pdb文件管理与版本对齐心得)

本文详细介绍了如何使用WinDbg工具快速定位C++程序崩溃行,包括.pdb文件管理与版本对齐的实用技巧。通过WinDbg Preview的现代化功能、符号服务器配置和黄金四步法,开发者可以精准分析dmp文件,大幅提升崩溃问题解决效率。文章还提供了CI/CD集成、符号服务器私有化部署等进阶方案,帮助构建完整的崩溃防御体系。

weixin_30608503的博客 357

计算PE文件校验和

// 计算PE校验和 #include <ImageHlp.h> #pragma comment(lib,"Imagehlp.lib") void Getchecksum(TCHAR* pszPath) { /* Code by Lthis 转载请注明出处 */ DWORD dwHeaderSum, dwCheckS...

343

C/C++ 累加校验和算法详解及源码

累加校验和算法(Checksum)是一种简单的错误检测方法,用于检测数据在传输过程中的错误。它通过将数据中每个字节相加得到一个校验和值,并将该校验和值附加到数据的末尾。接收方在接收数据时会重新计算校验和,并与接收到的校验和比较,如果两者不一致,则表示数据传输过程中发生了错误。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 6661

PEChecksum计算PE文件校验和的工具

PEChecksum计算PE文件校验和的工具 ,当修改了bootmgr.exe,就需要这工具重新校验

逆向入门:Windows可执行文件PE初解

本文系统介绍了Windows可执行文件(PE格式)的核心结构与逆向工程关键技术。首先定义了可执行文件的基本概念,区分了可执行文件与数据文件的本质差异。随后详细解析了PE格式的完整结构,包括DOS头、NT头(文件头与可选头)、节表及各节功能。重点阐述了逆向工程中的六大核心操作:FileBuffer与ImageBuffer转换、RVA与FOA地址转换、.text节代码注入、任意节代码注入、新增节以及扩大最后一节。最后介绍了数据目录结构及主要功能表(导出表、导入表、IAT表、重定位表等)的作用。文章结合C/C++

m0_71332744的博客 382

Python RPA 流程自动化快速上手

Python RPA 流程自动化快速上手

看花容易绣花难 1万+

E. Checksum

【代码】E. Checksum。

shdhdhiqow的博客 821

《惠普工作站设置BIOS从U盘装系统》

惠普工作站设置BIOS 惠普工作站在做服务器时应用广泛,本文介绍下其BIOS开机自启动设置,附上图片,以供学习参考。 惠普工作站设置BIOS 启动步骤如下: 第一步:根据需要对BIOS进行更改,并保存 1.重启工作站按F10进入BIOS设置(也可以按ESC键选择进入BIOS设置的选项)。 图1 惠普工作站B...

istrangeboy&begin zero的博客 2万+

【Docker】Ubuntu安装Docker

1 安装Docker 安装Docker有三种方法,这里只用repository安装,更详细的安装方法可以看官方文档。 1.1 添加repository 首先更新apt: sudo apt-get update 安装一些包让apt可以通过https使用repository: sudo apt-get install \ apt-transport-https \ ca-certif...

widiot的博客 9945

C/C++ TCP/IP 协议簇校验合计算方法(tcpip checksum)

    本文将提供真正可用的 TCP/IP 协议校验合合计算,即它不是众人理论上的 TCPIP 校验合计算方法,虽然我曾为此被坑的有点小小的头疼(开个小玩笑)     此代码摘要自本人的一个实验工程(astar-tun)故名思意这是一个 “tun/tap” 虚拟网卡层面(链路层)的一个小工程,它内部实现了一个super simple 专用于 “forwarding” 的 tcpip 协议栈(pr...

liulilittle的博客 2212

ABAP CDS SELECT, parameters 全面解析:把参数化视图玩明白(含可运行示例)

这篇技术博客介绍了ABAP CDS中参数化视图的用法与实践。文章从业务需求出发,解释了参数化视图的必要性,并详细说明了语法规则、参数类型匹配、视图内部参数引用等关键点。重点展示了在JOIN和ASSOCIATION中传递参数的写法,提供了航线分析的完整业务案例和可运行代码示例。文章还总结了视图实体与DDIC视图的差异、会话变量使用技巧等实践要点,特别强调了JOIN中必须显式传参的语法要求。通过真实场景演示,帮助开发者掌握参数化CDS的高效应用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 358

Visual Studio 2013 如何使用TitanEngine引擎库调试

本文详细介绍如何通过静态链接库模式编译生成的TitanEngine.lib库,在C++中调用泰坦引擎实现PE文件分析和进程调试。主要内容包括:1)配置开发环境,引入TitanEngine.h头文件和静态库;2)静态分析PE文件信息,如镜像基址、入口点、节表等;3)动态调试示例,设置OEP断点回调并读取进程内存;4)完整代码展示,涵盖PE信息获取、节表遍历和基础调试功能。通过该教程,开发者可快速掌握泰坦引擎的核心调用方法,实现静态分析与动态调试的结合应用。

微软技术分享 341

PHM2010刀具磨损预测完整实现

本文介绍了PHM2010刀具磨损预测项目的完整实现方案。项目采用PHM2010公开数据集,包含6个子数据集,记录了铣削加工过程中7个通道的传感器数据(切削力、振动和声发射信号)。技术路线包括数据预处理(截取中间10万点、小波降噪)、特征提取(时域9个、频域4个特征)、特征融合和皮尔逊相关系数筛选,最终使用BiLSTM模型进行训练和评估。环境配置基于Python 3.9,依赖NumPy、Pandas、PyTorch等库。数据加载和预处理阶段重点处理了传感器信号分段和磨损标签对齐问题,为后续建模奠定基础。

huanghm88的专栏 416

ROM和RAM在单片机程序运行理解

ROM和RAM是电子设备中两种核心存储组件,主要区别在于:ROM用于长期存储系统程序、用户文件等固定数据,断电后数据不丢失,但写入速度较慢;RAM则用于临时存储运行中的程序和数据,读写速度快但断电后数据会清空。在单片机中,ROM存储程序代码和常量,RAM存储运行时的变量和数据。两者协同工作,ROM如同"永久档案库"保存必要信息,RAM则像"临时工作台"支持高速运算,共同确保设备正常运行。

qq_37999850的博客 1618

MySQL数据一致性检查工具

数据的不一致常令DBA被客服或业务部门投诉,那么一致性便是耳根清净[虽然不能这么说]的良方这里介绍MySQL官方的mysqldbcompare(python写的)和percona公司的pt-table-checksum(perl写的)mysqldbcompare的作用是对比两个数据库的表结构、表数据的一致性并能生成对应补偿的SQL,如主备、线上线下对于差异的展现能通过参数--difftype调控① unified (d...

yimenglin的博客 1110

SAP_SD模块更改销售订单定价简介

方式优点缺点适用场景MASS简单,无需开发不能触发重新定价逻辑修改特定字段BDC (VA02)可模拟人工操作维护复杂,速度慢少量订单批改稳定、安全需ABAP支持推荐用于批量重新定价VBOF标准重算返利仅适返利类条件返利更新通过本文,我们了解了 SAP 的[SAP_SD模块更改销售订单定价]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。更多SAP文章请点击更多SAP文章更新,大家一起学习进步!!!

我小时候很黑的博客 706

Windows逆向分析:禁用ASLR实现稳定调试与内存布局固定

地址空间布局随机化(ASLR)是现代操作系统核心的内存保护技术,通过随机化进程关键数据的内存加载地址,有效抵御缓冲区溢出等攻击。其原理在于操作系统加载器检查PE文件头的DllCharacteristics标志位,动态分配模块基址。对于软件逆向工程与安全研究,ASLR带来的地址不确定性会严重干扰静态分析与动态调试的衔接,降低分析效率。在合法授权的研究场景下,如CTF竞赛、漏洞分析或软件行为剖析,需要稳定可预测的内存环境。通过修改PE文件头清除DYNAMIC_BASE标志位,或利用系统级Exploit Prot

weixin_30731305的博客 305

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(二)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 1659

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

lordPE转自http://blog.sina.com.cn/s/blog_6e8f83bc01014115.html

EntryPoint: 入口点,程序在执行时的第一行代码的地址应该就是这个值   ImageBase: 基地址,文件执行时将被映射到指定内存地址中,这个初始内存地址称为基址。基地址的值由PE文件本身设定的,按默认设置,Visual C++建立的exe文件基地址是00400000h,DLL文件的基地址是1000000h,但是在创建应用程序的exe文件的时候可以改变这个地址。方法是在链接应

qq_20849045的博客 856

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 转自:C#和C++类型对应表
下一篇: C++导出函数
「已注销」
博客等级 码龄14年 116粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值