计算PE文件校验和的C语言实现

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

http://www.opencjk.org/~scz/windows/200701102106.txt

在某些时候可能你并不想用imagehlp!CheckSumMappedFile()去计算PE文件校验和,
这个函数或许用得上。网上ASM实现很多,C实现不好找吧。

最近因为要写个程序自动剁tcpip.sys,顺便折腾了一下PE文件校验和的计算。

#endif

/*
 * RFC 1141 : Incremental Updating of the Internet Checksum
 *
 * 2007-01-10 21:06 scz
 *
 * PE首部的CheckSum是4字节的DWORD型,计算方法与IP首部校验和非常类似,其C语
 * 言实现一直不太好找,这里给一个基于IP首部校验和C实现修改后的函数。已经处
 * 理了奇偶。形参base_sum为旧的CheckSum,无论原值是否正确,不必将内存中的
 * 该字段清零再计算,如果清零,则base_sum也要赋成零再计算。
 *
 * 2007-01-29 15:30 scz
 *
 * 更正了一个BUG,注意sum的数据类型是64-bits的。
 */
static unsigned int pe_cksum
(
    unsigned short int *addr,
    unsigned int        len,
    unsigned long long  base_sum
)
{
    unsigned int        nleft   = len;
    /*
     * 这里不同,反码加一即取负,这种变态写法仅仅是为了避免一个编译警告。
     *
     * LONGLONG
     * ULONG64
     * unsigned long long
     */
    unsigned long long  sum     = ~base_sum + 1;
    unsigned short int *w       = addr;
    unsigned short int  answer  = 0;

    /*
     * Our algorithm is simple, using a 32 bit accumulator (sum), we add
     * sequential 16 bit words to it, and at the end, fold back all the
     * carry bits from the top 16 bits into the lower 16 bits.
     */
    while ( nleft > 1 )
    {
        sum    += *w++;
        nleft  -= 2;
    }
    /*
     * mop up an odd byte, if necessary
     */
    if ( 1 == nleft )
    {
        *( unsigned char * )( &answer )     = *( unsigned char * )w ;
        sum                                += answer;
    }
    /*
     * add back carry outs from top 16 bits to low 16 bits
     *
     * add hi 16 to low 16
     */
    sum     = ( sum >> 16 ) + ( sum & 0xFFFF );
    /*
     * add carry
     */
    sum    += ( sum >> 16 );
    /*
     * truncate to 16 bits
     */
    answer  = ( unsigned short )( sum & 0xFFFF );
    /*
     * 这里不同
     *
     * add len
     */
    sum     = answer + len;
    return( ( unsigned int )sum );
}  /* end of pe_cksum */
 
PE文件可选头结构体中的校验和 Windows操作系统中的驱动和一些系统dll文件都是有校验和的,而且Windows系统在加载时实惠检查校验和有没有发生变化,发生变化,说明文件已经被修改过(没有变化,文件可能没有修改过;也可能文件修改后,重新计算了校验和,填写到指定位置)肯定不会继续加载。CheckSumMappedFile( )函数用来计算校验和,并且带出原有校验和。 例子: #include <stdio.h&g... 阅读详情

相关推荐

加密与解密(第四版)第11章 PE文件格式

PE文件的定义头文件:winnt.h EXE和DLL使用完全相同的PE格式,只是有一个字段标明这是一个EXE还是DLL PE文件框架结构图 PE文件的基本概念 PE文件将所有的文件和数据都合并在一个文件中,文件的各个部分被分割为不同的区块(Section,又称节) 区块中包含代码和数据,各个区块按照页边界对其 区块没有大小限制,是一个连续结构 每个区块在内存中都具有各自的一套属性,例如该块是否包含代码,是否可读可写等 基地址 当PE文件通过PE装载器载入内存后,内存中的版本称为模块(Module) 映射文

冰糖葫芦的夏天的博客 1447

关于PE文件中的校验和

最近研究PE文件结构,每看一次文档都有新的收获,证明有很多东西还是理解得不深刻。 今天做了关于checksum校验和的实验,确认了在应用层,系统加载程序的时候,CreateProcess不会对exe做校验和检验,LoadLibrary不会对dll做检验和检验。按文档说,这些都是不需要检验的,没有问题,另外一个问题就是要确认驱动程序加载的时候需要检验校验和。 下面内容摘自PECOFF-v8

行者无疆的专栏 3996

C/C++编程解析PE文件结构

PE的意思就是Portable Executable(可移植、可执行)PE文件结构图: PS:现在大多数PE文件都是加壳或者经过处理的,此程序只适用于最原始的PE文件关于PE文件的解析问题,可以参考我的另一篇博文《用Winhex软件解析PE文件》#include <stdio.h> #include <stdlib.h> #include <Windows.h> //函数计算导出/导入表的VA D

考拉研究僧的博客 7852

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

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

菩提树下写代码 3153

【C语言】函数;头文件

C语言中关于函数的笔记。

Mopoke的博客 1640

24、深入解析Windows PE文件结构及Go语言实现

本文深入解析Windows PE文件结构,并使用Go语言实现一个PE二进制解析器。内容涵盖PE文件格式的基础知识及其在安全研究和逆向工程中的应用,详细讲解了DOS头、COFF文件头、可选头、数据目录以及节表的解析过程,并提供了完整的代码示例和结构分析,帮助读者全面掌握PE文件的核心组成。

mac99的博客 80

校验和怎么用c语言编程计算,计算PE文件校验和的C语言实现

#if 0http://www.sczgroup.org/windows/200701102106.txt在某些时候可能你并不想用imagehlp!CheckSumMappedFile()去计算PE文件校验和,这个函数或许用得上。网上ASM实现很多,C实现不好找吧。最近因为要写个程序自动剁tcpip.sys,顺便折腾了一下PE文件校验和的计算。#endif/** RFC 1141 : Increm...

weixin_29129247的博客 734

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

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

利用Shellcode注入PE文件加载计算器

文章目录简介C语言版shellcode汇编版shellcodeshellcode跳转到原入口地址代码编写思路源代码 简介 采用C语言查看和修改一些PE文件的关键结构,结合shellcode,完成功能: 先用C语言编写通过LoadLibrary()和GetProcAddress()调用msvcrt.dll中的system()函数来弹出计算器的代码。在OllyDbg中打开该程序,查看对应的汇编代码和...

威化饼的一隅 3532

R | 提取文件夹内栅格数据的最小值、最大值、标准差和平均值

各位同学好,我们长需要用长时间序列栅格数据的平均值做变量的时间变化分析,用代码能够帮助我们省下很多时间。

qq_48539301的博客 449

USB3.0一致性测试方案

为各测试项目具体测试结果包括脉冲串突发时间、脉冲串重复时间、时钟周期以及眼图等完整USB3.0测试项目,工程师可以看到各项测试的具体结果方便观察。RIGOL 提供了一套完善的工具,包括数字示波器、专业的测试夹具以及全自动一致性测试软件,使得USB 3.0设备设计人员能够高效精确地进行信号捕捉、测试与分析。报告第二部分测试摘要,在此可以看到USB3.0测试所有测试项目,并且可以观看到测试是否正常,可以帮助工程师更好的判断测试结果。,以简化下载、存储以及对于多媒体的大量内容的共享。

2409_87378937的博客 2526

PE之FOA与RVA互相转换过程与C语言实现

文章目录说明一、FOA和RVA二、RVA转为FOA1.大致步骤2.特殊情况3.C语言实现函数功能三、FOA转为RVA1.大致步骤2.特殊情况3.C语言实现函数功能 说明 看滴水的视频写学习笔记总结 语言:c/c++ 编译环境:vc++6.0 C语言函数中定义的结构类型来自于头文件windows.h 准确的说,定义的PE的结构体类型的所有数据都来自与头文件winnt.h,只不过windows.h内部声明了winnt.h 一、FOA和RVA 缩写 英文全称 含义 FOA File Offset

qq_35289660的博客 1913

【漆学军】MT4进阶到MT5速成之路(2)获取持仓

MT5在持仓获取上,要比MT4复杂些,分两部分,获取持仓和挂单采用了不同的方法。 一、获取持仓中的buy和sell单 int b=0;//获取buy单个数 int s=0;//获取sell单个数 double lot_total_buy=0;//获取持仓中buy单的总手数 double lot_total_sell=0;//获取持仓中sell单的总手数 for(int i=0; i<PositionsTotal(); i++) { ulong ticket=Positi

漆学军的编程笔记 1624

PE格式:实现VA与FOA之间的转换

PE结构中的地址互转,这次再来系统的复习一下关于PE结构中各种地址的转换方式,最终通过编程来实现自动解析计算,最后将这个功能集成到我的迷你解析器中,本章中使用的工具是上次讲解PE结构文章中制作的CMD迷你结构解析器,如果不知道参数的基本使用请看前一篇。

微软技术分享 7979

Cadence 17.4 PSpice仿真555定时器输出方波

这里利用555定时器组成多谐振荡器产生1Hz的方波并用PSpice仿真其输出的方波波形。555定时器是一种广泛应用的中规模集成电路。根据其内部组成的不同,可分为双极型(555B)和CMOS型(555C)两类。两种类型的定时器各有所长。双极型定时器具有较大的驱动能力,其输出电流可达200mA,可直接驱动发光二级管、扬声器、继电器等负载。而CMOS型定时器的输入阻抗高、功耗低。

tj_nonstoper的博客 1万+

Rk3568 百兆以太网RMII模式DTS配置详解

本文详细解析了RK3568芯片在百兆以太网RMII模式下的DTS配置方法,包括时钟树配置、PHY接口模式定义及实际工程中的进阶设置。通过实战案例和调试技巧,帮助开发者快速解决RMII模式下的常见问题,提升工业控制设备的网络稳定性。

weixin_29189377的博客 420

判断是不是PE文件

#include #include "assert.h" #include #include "TCHAR.H" #ifdef UNICODE #define IsPEFile IsPEFileW #define IsDigiSig IsDigiSigW #else #define IsPEFile IsPEFileA #define IsDigiSig IsDigiSigA #endi

游刃有余则成的专栏 3412

量化交易 米筐 因子分组打分(成长因子)

分组动手练习 在米筐上因子数据没有处理,提供的很多因子没有默认分类,存在一些因子没有的情况,我们就选择一些常见的因子。 价值因子 质量因子 成长因子(历史名称) pe_ratio return_on_invested_capital in_revenue pcf_ratio du_return_on_equity inc_eps pb_ratio return_on_asset_net_profit inc_total_asset market_cap return_on_equ

廷益_飞鸟的博客 932

C/C++ 实现VA与FOA之间的转换

PE结构中的地址互转,这次再来系统的复习一下关于PE结构中各种地址的转换方式,最终通过编程来实现自动解析计算,最后将这个功能集成到我的迷你解析器中,本章中使用的工具是上次讲解PE结构文章中制作的CMD迷你结构解析器,如果不知道参数的基本使用请看前一篇。FOA = 实际偏移 + (RVA - 虚拟偏移) => 0x00000400 + (158b - 0x00001000) = 400 + 58b = 98B。如下,通过公式计算一下文件偏移为0xF43的位置,其对应到VA虚拟地址是多少。

微软技术分享 1万+

某易将军令口令纯算法还原py篇

算法开源,将军令口令算法。希望官方多多更新吧

任雪飘的博客 3909

matlab从无到有系列(九):Simulink基础仿真详解(全网最全,从入门到放弃)

🔗 运行环境:Matlab 🚩 作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 📚 选自专栏:《数学建模》 🧿 优秀专栏:《Matlab神经网络案例分析》 目前持续更新的专栏: 🥇 专栏:Matlab GUI编程技巧 🔥 专栏:Matlab从无到有系列 📚 专栏:《数学建模》 💗 大家好,我是左手の明天!💗 📆 最近更新:2022 年 4 月 2 日,左手の明天的第215 篇原创博客 🌟🌟往期必看🌟🌟 matlab从无到有系列(二):矩阵运算基础...

左手の明天的博客 9万+

推荐文章:AuthHashCalc——高效PE文件Authenticode哈希计算器

推荐文章:AuthHashCalc——高效PE文件Authenticode哈希计算器 在当今安全至上的软件开发环境中,验证代码的完整性与原作者身份变得尤为重要。为此,我们为您隆重介绍一款开源工具——AuthHashCalc,它专为Windows平台设计,是计算PE32和PE32+文件Authenticode哈希的得力助手。 项目介绍 AuthHashCalc,正如其名,是一款功能强大的Authe...

gitblog_00569的博客 1033

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

滴水逆向作业——PE_02打印PE头部信息

打印PE头部信息: PE头包含:DOS头+4字节PE标识符+NT头(标准PE头+可选PE头)。 #include "stdafx.h" #include "string.h" #include <malloc.h> #include <windows.h> FILE* open_file(char* file_path,char* open_mode); int com...

weixin_44584614的博客 1425

jre9下载 jdk9

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c语言pe添加区段,C语言: 在PE文件中插入一个可执行的新节

/** Version: Build 06* Written by bombless.* TimeStamp: 2012-1-1 16:40:57 UTC+8* File: C:\Users\bombless\Desktop\mod-pe-build6.c* Compiler: gcc (GCC) 3.4.2 (mingw-special)* gcc compile command line: g...

weixin_28881749的博客 571

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

一元多项式计算器 (c语言数据结构实验)

一元多项式计算器 (c语言数据结构实验) 班级 : **** 学号 : 201907020633 姓名 : *** 实验机号: A3 实验日期 :2020.12.04 报告日期 :2020.12.07 实验题目:一元多项式计算器

零琴的Hope 8039
上一篇: 珍藏的最全的windows操作系统快捷键
下一篇: 替换SharedUserData
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值