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

Windows逆向工程提升之二进制分析工具:HEX查看与对比技术

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

十六进制查看工具

应用于逆向工程的知识点

​编辑

二进制对比工具

应用于逆向工程的知识点


十六进制查看工具

十六进制查看器是逆向工程的基础工具,它可以以十六进制格式显示文件内容,同时展示对应的ASCII字符表示。

VOID HexAscii(const BYTE* data, SIZE_T offset, SIZE_T length)
{char ascii[17] = { 0 };ascii[16] = '\0';printf("%08X | ", offset);for (size_t i = 0; i < 16; i++){if (i < length){printf("%02X ", data[i]);ascii[i] = isprint(data[i]) ? data[i] : '.';}else{printf("   ");ascii[i] = ' ';}}printf(" |%s|\n", ascii);
}

这个函数接收数据缓冲区、偏移量和长度,以标准的十六进制转储格式输出。对于不可打印的字符,用点(.)替代,这是十六进制编辑器的常用做法。

HexDump函数则通过逐块读取文件内容,调用HexAscii函数处理每一块数据:

VOID HexDump(CONST CHAR* fileName)
{FILE* pFile = fopen(fileName, "rb");if (!pFile){printf("fopen failed -> %s\r\n", fileName);return;}BYTE buffer[16] = { 0 };SIZE_T byteRead = 0;SIZE_T offset = 0;while ((byteRead = fread(buffer, 1, sizeof(buffer), pFile)) > 0){HexAscii(buffer, offset, byteRead);offset += byteRead;}
}

应用于逆向工程的知识点

  1. 文件格式分析:通过十六进制查看可以识别文件头、魔数等特征,如PE文件的MZ头(0x4D5A)。
  2. 字符串提取:能够快速定位程序中的明文字符串,这些字符串常常揭示程序功能或API调用。
  3. 代码段识别:帮助分析机器码和数据区的边界,为反汇编提供参考。
  4. 数据结构分析:通过二进制模式识别复杂数据结构的布局。

二进制对比工具

二进制对比工具用于识别两个PE文件之间的差异,这在分析软件补丁、不同版本间的变化或恶意软件变种时非常有用。

该工具首先验证输入文件是否为有效的PE文件:

BOOL IsPeFile(CONST CHAR* filePath)
{FILE* pFile = fopen(filePath, "rb");if (!pFile) return FALSE;WORD dosSignature = NULL;if (fread(&dosSignature, sizeof(WORD), 1, pFile) != 1){fclose(pFile);return FALSE;}if (dosSignature != IMAGE_DOS_SIGNATURE/*0x5A4D*/){fclose(pFile);return FALSE;}fclose(pFile);return TRUE;
}

对比过程中,工具逐字节比较两个文件,并以彩色高亮显示差异:

VOID CompareFileByBin(CONST CHAR* file1path, CONST CHAR* file2path)
{// 文件打开和检查代码...// 循环读取并比较文件内容while (1){SIZE_T byteRead1 = fread(szBuffer1, 1, USN_PAGE_SIZE, pFile1);SIZE_T byteRead2 = fread(szBuffer2, 1, USN_PAGE_SIZE, pFile2);if (byteRead1 == 0 && byteRead2 == 0) break;if (byteRead1 != byteRead2){SetConsoleColor(CON_RED);printf("警告: 文件长度不相等 OFFSET -> 0x%08llx\r\n", dwOffset + (byteRead1 < byteRead2 ? byteRead1 : byteRead2));SetConsoleColor(CON_WHITE);break;}for (size_t i = 0; i < byteRead1 && i < byteRead2; i++){if (szBuffer1[i] != szBuffer2[i]){SetConsoleColor(CON_RED);printf("0x%08llX | 0x%02X  | 0x%02X  | %c - %c \r\n",dwOffset + i,szBuffer1[i],szBuffer2[i],(szBuffer1[i] >= 32 && szBuffer1[i] <= 126) ? szBuffer1[i] : '.',(szBuffer2[i] >= 32 && szBuffer2[i] <= 126) ? szBuffer2[i] : '.');SetConsoleColor(CON_WHITE);dwDifferences++;}}dwOffset += byteRead1;}
}

应用于逆向工程的知识点

  1. PE文件结构:程序通过检查DOS头部的MZ签名(0x5A4D)来验证文件是否为合法的PE文件。PE文件是Windows可执行文件的标准格式,包含代码、数据和资源。

  2. 补丁分析:通过比较软件不同版本,可以快速定位被修改的代码段,这在分析安全补丁时特别有用。

  3. 内存映射:理解PE文件的内存布局对于动态分析至关重要。每个节区(section)都有其在内存中的虚拟地址和权限。

http://www.xdnf.cn/news/536599.html

相关文章:

  • 高性能锁机制 CAS:Java 并发编程中的深度剖析
  • 【通用智能体】Lynx :一款基于终端的纯文本网页浏览器
  • 用 SamGeo 库实现遥感影像自动分割:从本地 TIFF 到 SHP/GeoJSON 的一站式处理(Python 脚本实现)
  • 理解 Swift 逃逸闭包与 implicit `self`
  • 终端安全与终端管理:有什么区别及其重要性?
  • DSRC|动态交换路况信息,减少事故优化流量的无线通信技术【无线通信小百科】
  • select * from 限制个数
  • (1) 查看端口状态
  • DeepSeek 如何实现 128K 上下文窗口?
  • MySQL的锁机制
  • javascript 编程基础(2)javascript与Node.js
  • 文本分类实战:使用LSTM对微博评论进行情感分析
  • 数据库中的SCHEMA
  • 如何优化 Elasticsearch 磁盘空间和使用情况
  • 黑马点评-Redis缓存更新/穿透/雪崩/击穿
  • Git上传项目到GitHub
  • Keepalived相关配置和高可用
  • 为什么 LoRaWAN CN470 采用上下异频设计?从协议架构、频谱规划到工程实现的全面解析
  • NHANES最新指标推荐:C-DII
  • 浅谈GC机制-三色标记和混合写屏障
  • 蓝桥杯分享经验
  • 【cursor指南】cursor免费续杯pro会员试用
  • UE 材质基础第二天
  • Java:logback-classic与slf4j版本对应关系
  • ROS 2动态负载均衡系统架构与跨主机外设访问方案j1900(工业机器人集群协同场景)
  • 大语言模型怎么进行记忆的
  • 大语言模型(LLM)如何通过“思考时间”(即推理时的计算资源)提升推理能力
  • 微店平台关键字搜索商品接口技术实现
  • OceanBase 开发者大会:详解 Data × AI 战略,数据库一体化架构再升级
  • rsync实现远程同步