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;}
}
应用于逆向工程的知识点
- 文件格式分析:通过十六进制查看可以识别文件头、魔数等特征,如PE文件的
MZ
头(0x4D5A
)。- 字符串提取:能够快速定位程序中的明文字符串,这些字符串常常揭示程序功能或API调用。
- 代码段识别:帮助分析机器码和数据区的边界,为反汇编提供参考。
- 数据结构分析:通过二进制模式识别复杂数据结构的布局。
二进制对比工具
二进制对比工具用于识别两个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;}
}
应用于逆向工程的知识点
PE文件结构:程序通过检查DOS头部的
MZ
签名(0x5A4D
)来验证文件是否为合法的PE文件。PE文件是Windows可执行文件的标准格式,包含代码、数据和资源。补丁分析:通过比较软件不同版本,可以快速定位被修改的代码段,这在分析安全补丁时特别有用。
内存映射:理解PE文件的内存布局对于动态分析至关重要。每个节区(section)都有其在内存中的虚拟地址和权限。