校验和(Checksum)「建议收藏」

校验和(Checksum)「建议收藏」校验和(Checksum)PE的可选映像头(IMAGE_OPTION_HEADER)里面,有一个Checksum字段,是该文件的校验和,一般EXE文件可以使0,但一些重要的和系统DLL及驱动文件必须有

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

校验和(Checksum)

PE的可选映像头(IMAGE_OPTION_HEADER)里面,有一个Checksum字段,是该文件的校验和,一般EXE文件可以使0,但一些重要的和系统DLL及驱动文件必须有一个校验和.

Windows 提供了一个API函数MapFileAndCheckSum 测试文件的Checksum,它位于IMAGEHLP.DLL链接库里,其原型:

ULONG MapFileAndCheckSum

{

         LPSTR FileName,           // 文件名

         LPDWORD HeaderSum,     // 指向PE文件头的CheckSum

         LPDWORD new_checksum  // 指向新计算出的Checksum

}

程序一旦运行后,new_checksum 地址处将放当前的文件的校验和,old_checksum地址指向PE文件的checksum字段

安全的方法是将此值放在注册表里,需要时比较.

内存映像校验

磁盘文件完整性校验可以抵抗解密者直接修改文件,但对内存补丁却没有效果,必须对内存关键的代码进行校验.

1 对整个代码进行校验

每个程序至少有一个代码区块和数据区块,数据区块属性可读写,程序运行时全局变量通常会放在这里,这些数据会动态变化,因此校验这部分是没什么意义,而代码段只读,存放的是程序代码,在程序中数据数不会变的,因此用这部分进行内存校验是可行的.

具体实现方法:

(1) 从内存中映像中得到PE相关数据,如代码块的RVA和内存大小

(2) 根据得到代码区块的RVA值和内存大小,计算出内存数据的CRC-32值

(3) 读取自身文件先前存储的CRC-32值(PE文件头前一个字段),这个值是通过软件写进去的.

(4) 比较两个CRC-32值.

这样比较内存的代码段校验,只要内存的数据被修改,就能发现。

BOOL CodeSectionCRC32()

{

         PIMAGE_DOS_HEADER pDosHeader = NULL;

         PIMAGE_NT_HEADERS pNTHeader = NULL;

         PIMAGE_SECTION_HEADER pSection = NULL;

         DWORD ImageBase,OriginalCRC32;

        

         ImageBase = (DWORD)GetModuleHandle(NULL); // 取基址

         pDosHeader = (PIMAGE_DOS_HEADER)ImageBase;

         pNtHeader = (PIMAGE_NT_HEADER32)((DWORD)pDosHeader + pDosHeader -> e_lfanew);

// 定位到PE文件头前4个字节值,并读取存储在这里的CRC -32值

          OriginalCRC32 = *((DWORD*)(DWORD)pNtHeader – 4);

pSecHeader = IMAGE_FIRST_SECTION(pNtHeader);    // 得到第一个区块的地址

//假设第一个区块就是代码区块

if(OriginalCRC32 == CRC32((BYTE*)ImageBase + pSecHeader -> VirtualAddress)

// 为了方便加壳

// 上一句也可为if(OriginalCRC32 == CRC32((BYTE *)0x401000, 0x36AE)

return TRUE;

else

return FALSE;

}

2 检验代码片段

在实际过程中,有时只需对一小段代码进行内存校验,以防止调试工具INT3断点

下面是一段汇编代码

校验和(Checksum)「建议收藏」

翻译成VC

DWORD address1, address2,size;

_asm Mov address1, offset begindecryt;

_asm Mov address2,offset enddecrypt;

begindecryt : // 标记代码的起始地址

MessageBox(NULL, _T(“Hello World”), _T(“OK”), MB_ICONEXCLAMATION);

enddecrypt: // 标记代码的结束地址

size = address2 – address1;

if(CRC32(BYTE*)address1, size) == 0x78E888AE)

return  TRUE;

else

return  FALSE;

 

使 .text 区块可写

在Win32 平台上,文件编译后,.text 区块的属性石只读的,但是要是写,必须通过PE工具修改.text区块的属性为E0000020h 表示可写 可读 可执行

void Docrypt(DWORD* pData, DWORD Size, DWRD value)

{

         // 首先要做的是改变着一块虚拟内存的内存保护状态,以便可以自由存取代码

         MEMORY_BASIC_INFORMATION mbi_thunk;

         // 查询页信息

         VirtualQuery(pData, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));

         // 改写页保护属性为读写

         VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);

size = Size/0x4;  // 对数据共需要异或的次数

While(Size –)

{

                   *pData = (*pData) ^ value;

                   pData ++;

}

// 恢复也的元保护属性

DWORD dwOldProtect

VirtualProtect(mbi_thunk.BaseAddress,

mbi_thunk.RegionSize,

mbi_thunk.Protect,

&dwOldProtect);

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167207.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android cs bs 架构,BS架构与CS架构的区别

    android cs bs 架构,BS架构与CS架构的区别C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完…

    2022年9月11日
    3
  • java代码大全_java新手入门-java新手代码大全[通俗易懂]

    java代码大全_java新手入门-java新手代码大全[通俗易懂]在开发中,我们常常需要使用到测试功能,因为我们不确定运行真正的代码会发生什么事情,今天我们就来介绍一下该如何在idea中进行junit单元测试吧。一、依赖安装Junit4Idea默认是使用的arquillianjunit4作为测试框架,这里我们我们把它改为Junit4。Settings->Plugins->搜索栏中搜索Junit并勾选->安装完成二、开…

    2022年7月7日
    27
  • java异常_Java方法声明异常

    java异常_Java方法声明异常java异常

    2022年4月21日
    95
  • Postman安装教程_postman需要联网吗

    Postman安装教程_postman需要联网吗1.官网安装(别看)打开官网,https://www.getpostman.com安装很麻烦还很容易安装失败(先请擦掉眼泪,不要忧伤,我们依然可以好好的)2.非官网安装这是一种直接通过打包已经安装的扩展程序的方式,来进行我认为的「非法安装」,但没办法,只能这样。我会给你一个安装包,见附件。你应该下载下来,解压缩到你喜欢的位置。(解压的位置自己要记得)安装包(Postman4.1.2下载地址:http://files.cnblogs.com/files/mafly/postman-4

    2022年9月17日
    4
  • msm8953 uart配置

    msm8953 uart配置参考链接:MSM8937-MSM8953UART配置调试指南uart驱动是使用内核驱动,无需自己编写,一般只需修改设备树。一、修改设备树设备树的配置有三部分:1.msm8953.dtsi中添加code blsp2_uart2:serial@7af0000{ compatible=”qcom,msm-lsuart-v14″; reg=<0x7af00000x…

    2022年8月31日
    5
  • SpringBoot学习目录

    SpringBoot目录SpringBoot入门篇SpringBootWeb篇SpringBootRedis篇SpringBootMybatis篇SpringBootRabbitMQ篇SpringBoot的定时器SpringBoot集成邮件服务SpringBoot集成MongoDBSpringBoot集成ShiroSpringBoot文件上传Spring…

    2022年4月14日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号