当前位置: 首页 > 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)都有其在内存中的虚拟地址和权限。

相关文章:

  • 自制操作系统day4(c指针)(指针和数组)(CLI和STI)(EFLAGS)
  • 力扣刷题Day 50:接雨水(42)
  • 你的it管理员已经限制对此应用一些区域的访问
  • MySQL进阶篇-InnoDB引擎(超细)
  • MySQL死锁:面试通关“三部曲”心法
  • Linux的权限问题
  • 【SPIN】PROMELA语言编程入门同步机制(SPIN学习系列--4)
  • std::ranges::iota
  • R²AIN SUITE 亮相第九届智能工厂高峰论坛
  • [CSS3]属性增强2
  • 卷积神经网络中的局部卷积:原理、对比与应用解析
  • PHP 实现连续子数组的最大和、整数中1出现的次数
  • [ 计算机网络 ] | 宏观谈谈计算机网络
  • Ultralytics YOLO11模型预测初体验(+实例+亲测)
  • OSD原理以及模块的讲解
  • java基础-多态性
  • [[春秋云境] Privilege仿真场景
  • R语言+贝叶斯网络:涵盖贝叶斯网络的基础、离散与连续分布、混合网络、动态网络,Gephi可视化,助你成为数据分析高手!
  • 【成品设计】基于51单片机实物系列项目
  • 什么是Monorepo(单体仓库)(monolithic repository)
  • 大巴车高速上撞山致2死2伤,广东肇庆警方通报
  • 印军称中国向巴基斯坦提供防空系统协助,外交部:中方十分重视与印、巴两国关系
  • 左手免费午餐右手花开岭,邓飞14年公益之路的中国贡献
  • 《缶翁的世界》首发:看吴昌硕等湖州籍书画家的影响
  • “80后”南京大学天文与空间科学学院教授施勇加盟西湖大学
  • 学者三年实地调查被判AI代笔,论文AI率检测如何避免“误伤”