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

目录

十六进制查看工具

应用于逆向工程的知识点

​编辑

二进制对比工具

应用于逆向工程的知识点


十六进制查看工具

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

cpp 复制代码
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函数处理每一块数据:

cpp 复制代码
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文件:

cpp 复制代码
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;
}

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

cpp 复制代码
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)都有其在内存中的虚拟地址和权限。

相关推荐
LCMICRO-133108477461 小时前
长芯微LPS123完全P2P替代ADP123,高性能、低压差的线性稳压器
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·线性稳压器
泓铮1 小时前
Windows 环境下 WSL2 与 VMware Workstation 17 共存机制研究与工程实践
windows
星河耀银海1 小时前
远控体验分享:安全与实用性参考
人工智能·安全·微服务
赛博云推-Twitter热门霸屏工具3 小时前
Twitter运营完整流程:从0到引流获客全流程拆解(2026)
运维·安全·自动化·媒体·twitter
守护安静星空3 小时前
esp32开发笔记-工程搭建
笔记·单片机·嵌入式硬件·物联网·visual studio code
ACP广源盛139246256733 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
xixixi777773 小时前
通信领域的“中国速度”:从5G-A到6G,从地面到星空
人工智能·5g·安全·ai·fpga开发·多模态
时空自由民.4 小时前
ST7701S 3.5寸显示屏
单片机
明湖起风了4 小时前
mqtt消费堆积
java·jvm·windows
金戈鐡馬5 小时前
BetaFlight中的定时器引脚绑定详解
stm32·单片机·嵌入式硬件·无人机