当前位置: 首页 > news >正文

PE嵌入式签名检测方法

(1)参考wine的代码,微软说的那个方法有些复杂(除非是一些特殊的pe),正常情况下的pe文件,各个节都是紧密排列的有序的,只需跳过checksum security_dir 和security_dir.VA之后的数据就行,当然微软是比较严谨的


/* See https://www.cs.auckland.ac.nz/~pgut001/pubs/authenticode.txt* for details about the hashing.*/
static BOOL SOFTPUB_HashPEFile(HANDLE file, HCRYPTHASH hash)
{DWORD checksum, security_dir;IMAGE_DOS_HEADER dos_header;union{IMAGE_NT_HEADERS32 nt32;IMAGE_NT_HEADERS64 nt64;} nt_header;IMAGE_DATA_DIRECTORY secdir;LARGE_INTEGER file_size;DWORD bytes_read;BOOL ret;if (!GetFileSizeEx(file, &file_size))return FALSE;SetFilePointer(file, 0, NULL, FILE_BEGIN);ret = ReadFile(file, &dos_header, sizeof(dos_header), &bytes_read, NULL);if (!ret || bytes_read != sizeof(dos_header))return FALSE;if (dos_header.e_magic != IMAGE_DOS_SIGNATURE)return FALSE;if (dos_header.e_lfanew >= 256 * 1024 * 1024) /* see RtlImageNtHeaderEx */return FALSE;if (dos_header.e_lfanew + FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader.MajorLinkerVersion) > file_size.QuadPart)return FALSE;SetFilePointer(file, dos_header.e_lfanew, NULL, FILE_BEGIN);ret = ReadFile(file, &nt_header, sizeof(nt_header), &bytes_read, NULL);if (!ret || bytes_read < FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader.Magic) +sizeof(nt_header.nt32.OptionalHeader.Magic))return FALSE;if (nt_header.nt32.Signature != IMAGE_NT_SIGNATURE)return FALSE;if (nt_header.nt32.OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC){if (bytes_read < sizeof(nt_header.nt32))return FALSE;checksum     = dos_header.e_lfanew + FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader.CheckSum);security_dir = dos_header.e_lfanew + FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]);secdir       = nt_header.nt32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY];}else if (nt_header.nt32.OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC){if (bytes_read < sizeof(nt_header.nt64))return FALSE;checksum     = dos_header.e_lfanew + FIELD_OFFSET(IMAGE_NT_HEADERS64, OptionalHeader.CheckSum);security_dir = dos_header.e_lfanew + FIELD_OFFSET(IMAGE_NT_HEADERS64, OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]);secdir       = nt_header.nt64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY];}elsereturn FALSE;if (secdir.VirtualAddress < security_dir + sizeof(IMAGE_DATA_DIRECTORY))return FALSE;if (secdir.VirtualAddress > file_size.QuadPart)return FALSE;if (secdir.VirtualAddress + secdir.Size != file_size.QuadPart)return FALSE;if (!hash_file_data( file, 0, checksum, hash )) return FALSE;if (!hash_file_data( file, checksum + sizeof(DWORD), security_dir, hash )) return FALSE;if (!hash_file_data( file, security_dir + sizeof(IMAGE_DATA_DIRECTORY), secdir.VirtualAddress, hash ))return FALSE;return TRUE;
}

(2)对于签名中的hash 应该提取的oid是 SpcIndirectDataContext的OID应为1.3.6.1.4.1.311.2.1.4,而不是属性中的消息摘要,这个字段如果不好找,那就再签名数据部分搜索hash就行了,只要签名有效并包含hash,可以粗略认为这个PE文件的签名是存在的

http://www.dtcms.com/a/349886.html

相关文章:

  • 阿里开源Vivid-VR:AI视频修复新标杆,解锁内容创作新可能
  • AR远程协助:能源电力行业智能化革新
  • 一键编译安装zabbix(centos)
  • Spark面试题
  • HTTP 协议与TCP 的其他机制
  • excel 破解工作表密码
  • Python之Flask快速入门
  • Redis类型之List
  • 自然语言处理——07 BERT、ELMO、GTP系列模型
  • lesson46-1:Linux 常用指令全解析:从基础操作到高效应用
  • Docker:常用命令、以及设置别名
  • 数据挖掘 6.1 其他降维方法(不是很重要)
  • 聊聊负载均衡架构
  • 关于窗口关闭释放内存,主窗口下的子窗口关闭释放不用等到主窗口关闭>setAttribute(Qt::WA_DeleteOnClose);而且无需手动释放
  • 【Python】QT(PySide2、PyQt5):列表视图、模型、自定义委托
  • 【芯片后端设计的灵魂:Placement的作用与重要性】
  • SQL 语句拼接在 C 语言中的实现与安全性分析
  • 跨语言统一语义真理及其对NLP深层分析影响
  • 2.3零基础玩转uni-app轮播图:从入门到精通 (咸虾米总结)
  • Python 实战:内网渗透中的信息收集自动化脚本(3)
  • 苹果公司即将启动一项为期三年的计划
  • Linux应急响应一般思路(三)
  • 蜗牛播放器 Android TV:解决大屏观影痛点的利器
  • C/C++ 指针与函数
  • Tesseract OCR之页面布局分析
  • 朴素贝叶斯:用 “概率思维” 解决分类问题的经典算法
  • ​Visual Studio + UE5 进行游戏开发的常见故障问题解决
  • 【区间DP】P1063 [NOIP 2006 提高组] 能量项链
  • 基于深度学习的人声分离系统设计与实现
  • Apache Commons Math_Java科学计算的利器