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

相关推荐
小柯博客1 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(十二)
c语言·stm32·单片机·嵌入式硬件·php·嵌入式
2501_915373881 小时前
Redis线程安全深度解析:单线程模型的并发智慧
数据库·redis·安全
C++ 老炮儿的技术栈2 小时前
UDP 与 TCP 的区别是什么?
开发语言·c++·windows·算法·visual studio
SY师弟4 小时前
51单片机基础部分——独立按键检测
单片机·嵌入式硬件·51单片机
Mapleay4 小时前
FMC STM32H7 SDRAM
stm32·单片机·嵌入式硬件
恰薯条的屑海鸥4 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十五期-URL重定向模块)
学习·安全·web安全·渗透测试·网络安全学习
自小吃多5 小时前
STC8H系列 驱动步进电机
笔记·单片机
易知嵌入式小菜鸡5 小时前
STM32CubeMX-H7-19-ESP8266通信(中)--单片机控制ESP8266实现TCP地址通信
stm32·单片机·嵌入式硬件
Tipray20065 小时前
让敏感数据在流转与存储中始终守护在安全范围
安全
乄夜5 小时前
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
c语言·c++·单片机·嵌入式硬件·物联网·面试·职场和发展